@budibase/server 0.0.32 → 0.0.999-alpha.30

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 (977) hide show
  1. package/.dockerignore +6 -0
  2. package/.yarnrc +1 -0
  3. package/Dockerfile +41 -0
  4. package/LICENSE +391 -377
  5. package/__mocks__/@elastic/elasticsearch.ts +24 -0
  6. package/__mocks__/@google-cloud/firestore.ts +36 -0
  7. package/__mocks__/@sendgrid/mail.ts +22 -0
  8. package/__mocks__/airtable.ts +8 -0
  9. package/__mocks__/arangojs.ts +24 -0
  10. package/__mocks__/aws-sdk.ts +80 -0
  11. package/__mocks__/mongodb.ts +39 -0
  12. package/__mocks__/mssql.ts +24 -0
  13. package/__mocks__/mysql2/promise.ts +17 -0
  14. package/__mocks__/mysql2.ts +14 -0
  15. package/__mocks__/node-fetch.ts +201 -0
  16. package/__mocks__/oracledb.ts +31 -0
  17. package/__mocks__/pg.ts +30 -0
  18. package/babel.config.js +3 -0
  19. package/build/entitlements.mac.plist +14 -0
  20. package/build/icon.icns +0 -0
  21. package/build/icon.png +0 -0
  22. package/build/icons/512x512.png +0 -0
  23. package/build/pouchdb.js +9 -0
  24. package/builder/assets/auth0-logo.6fa5973f.png +0 -0
  25. package/builder/assets/backups-default.8c011f1b.png +0 -0
  26. package/builder/assets/bb-emblem.05f7ae7a.svg +80 -0
  27. package/builder/assets/bb-space-man.5be51a45.svg +290 -0
  28. package/builder/assets/bb-spaceship.8f6e81e1.svg +227 -0
  29. package/builder/assets/bg.29e85dd5.png +0 -0
  30. package/builder/assets/blankScreenPreview.72634dd1.png +0 -0
  31. package/builder/assets/bulgaria.bd68393d.png +0 -0
  32. package/builder/assets/covanta.72c46c1e.png +0 -0
  33. package/builder/assets/discord.c14881e9.svg +10 -0
  34. package/builder/assets/google-logo.c16467b8.png +0 -0
  35. package/builder/assets/index.c0265b74.css +6 -0
  36. package/builder/assets/index.c977bf31.js +1776 -0
  37. package/builder/assets/integromat.42212f11.png +0 -0
  38. package/builder/assets/listScreenPreview.599c0aae.png +0 -0
  39. package/builder/assets/microsoft-logo.07033b2a.png +0 -0
  40. package/builder/assets/oidc-logo.cb2fff74.png +0 -0
  41. package/builder/assets/okta-logo.61437d3d.png +0 -0
  42. package/builder/assets/onelogin-logo.181cc193.png +0 -0
  43. package/builder/assets/oracle.66592424.png +0 -0
  44. package/builder/assets/remixicon.0ac8bc3c.ttf +0 -0
  45. package/builder/assets/remixicon.64bb3a0f.eot +0 -0
  46. package/builder/assets/remixicon.a10268fe.svg +6835 -0
  47. package/builder/assets/remixicon.c2dacfbc.woff +0 -0
  48. package/builder/assets/remixicon.e61f0d10.woff2 +0 -0
  49. package/builder/assets/schnellecke.cf1837a8.png +0 -0
  50. package/builder/assets/slack.1e1f7cfb.svg +33 -0
  51. package/builder/assets/zapier.3fbd8f5c.png +0 -0
  52. package/builder/index.html +10 -13
  53. package/dist/api/controllers/analytics.js +46 -0
  54. package/dist/api/controllers/apikeys.js +72 -0
  55. package/dist/api/controllers/application.js +575 -0
  56. package/dist/api/controllers/auth.js +80 -0
  57. package/dist/api/controllers/automation.js +303 -0
  58. package/dist/api/controllers/backup.js +37 -0
  59. package/dist/api/controllers/cloud.js +130 -0
  60. package/dist/api/controllers/component.js +59 -0
  61. package/dist/api/controllers/datasource.js +306 -0
  62. package/dist/api/controllers/deploy/Deployment.js +53 -0
  63. package/dist/api/controllers/deploy/index.js +198 -0
  64. package/dist/api/controllers/dev.js +146 -0
  65. package/dist/api/controllers/integration.js +28 -0
  66. package/dist/api/controllers/layout.js +49 -0
  67. package/dist/api/controllers/metadata.js +63 -0
  68. package/dist/api/controllers/migrations.js +29 -0
  69. package/dist/api/controllers/ops.js +40 -0
  70. package/dist/api/controllers/permission.js +162 -0
  71. package/dist/api/controllers/plugin/file.js +24 -0
  72. package/dist/api/controllers/plugin/github.js +69 -0
  73. package/dist/api/controllers/plugin/index.js +112 -0
  74. package/dist/api/controllers/plugin/npm.js +58 -0
  75. package/dist/api/controllers/plugin/uploaders.js +11 -0
  76. package/dist/api/controllers/plugin/url.js +24 -0
  77. package/dist/api/controllers/plugin/utils.js +27 -0
  78. package/dist/api/controllers/public/applications.js +146 -0
  79. package/dist/api/controllers/public/mapping/applications.js +29 -0
  80. package/dist/api/controllers/public/mapping/index.js +11 -0
  81. package/dist/api/controllers/public/mapping/queries.js +36 -0
  82. package/dist/api/controllers/public/mapping/rows.js +24 -0
  83. package/dist/api/controllers/public/mapping/tables.js +23 -0
  84. package/dist/api/controllers/public/mapping/types.js +2 -0
  85. package/dist/api/controllers/public/mapping/users.js +29 -0
  86. package/dist/api/controllers/public/metrics.js +113 -0
  87. package/dist/api/controllers/public/queries.js +58 -0
  88. package/dist/api/controllers/public/rows.js +120 -0
  89. package/dist/api/controllers/public/tables.js +95 -0
  90. package/dist/api/controllers/public/users.js +93 -0
  91. package/dist/api/controllers/public/utils.js +56 -0
  92. package/dist/api/controllers/query/import/index.js +87 -0
  93. package/dist/api/controllers/query/import/sources/base/index.js +75 -0
  94. package/dist/api/controllers/query/import/sources/base/openapi.js +42 -0
  95. package/dist/api/controllers/query/import/sources/curl.js +99 -0
  96. package/dist/api/controllers/query/import/sources/openapi2.js +145 -0
  97. package/dist/api/controllers/query/import/sources/openapi3.js +177 -0
  98. package/dist/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +253 -0
  99. package/dist/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +1054 -0
  100. package/dist/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +253 -0
  101. package/dist/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +1225 -0
  102. package/dist/api/controllers/query/index.js +299 -0
  103. package/dist/api/controllers/query/validation.js +53 -0
  104. package/dist/api/controllers/role.js +109 -0
  105. package/dist/api/controllers/routing.js +105 -0
  106. package/dist/api/controllers/row/ExternalRequest.js +676 -0
  107. package/dist/api/controllers/row/external.js +339 -0
  108. package/dist/api/controllers/row/index.js +203 -0
  109. package/dist/api/controllers/row/internal.js +502 -0
  110. package/dist/api/controllers/row/internalSearch.js +28 -0
  111. package/dist/api/controllers/row/staticFormula.js +165 -0
  112. package/dist/api/controllers/row/utils.js +183 -0
  113. package/dist/api/controllers/screen.js +110 -0
  114. package/dist/api/controllers/script.js +30 -0
  115. package/dist/api/controllers/static/index.js +268 -0
  116. package/dist/api/controllers/static/templates/BudibaseApp.svelte +135 -0
  117. package/dist/api/controllers/static/templates/app.hbs +13 -0
  118. package/dist/api/controllers/static/templates/preview.hbs +117 -0
  119. package/dist/api/controllers/table/bulkFormula.js +173 -0
  120. package/dist/api/controllers/table/external.js +279 -0
  121. package/dist/api/controllers/table/index.js +179 -0
  122. package/dist/api/controllers/table/internal.js +194 -0
  123. package/dist/api/controllers/table/utils.js +374 -0
  124. package/dist/api/controllers/templates.js +56 -0
  125. package/dist/api/controllers/user.js +124 -0
  126. package/dist/api/controllers/view/exporters.js +44 -0
  127. package/dist/api/controllers/view/index.js +193 -0
  128. package/dist/api/controllers/view/utils.js +177 -0
  129. package/dist/api/controllers/view/viewBuilder.js +158 -0
  130. package/dist/api/controllers/webhook.js +134 -0
  131. package/dist/api/index.js +56 -0
  132. package/dist/api/routes/analytics.js +34 -0
  133. package/dist/api/routes/apikeys.js +37 -0
  134. package/dist/api/routes/application.js +48 -0
  135. package/dist/api/routes/auth.js +33 -0
  136. package/dist/api/routes/automation.js +50 -0
  137. package/dist/api/routes/backup.js +35 -0
  138. package/dist/api/routes/cloud.js +39 -0
  139. package/dist/api/routes/component.js +35 -0
  140. package/dist/api/routes/datasource.js +43 -0
  141. package/dist/api/routes/deploy.js +37 -0
  142. package/dist/api/routes/dev.js +49 -0
  143. package/dist/api/routes/index.js +77 -0
  144. package/dist/api/routes/integration.js +37 -0
  145. package/dist/api/routes/layout.js +37 -0
  146. package/dist/api/routes/metadata.js +40 -0
  147. package/dist/api/routes/migrations.js +36 -0
  148. package/dist/api/routes/ops.js +52 -0
  149. package/dist/api/routes/permission.js +44 -0
  150. package/dist/api/routes/plugin.js +39 -0
  151. package/dist/api/routes/public/applications.js +174 -0
  152. package/dist/api/routes/public/index.js +131 -0
  153. package/dist/api/routes/public/metrics.js +30 -0
  154. package/dist/api/routes/public/middleware/mapper.js +97 -0
  155. package/dist/api/routes/public/queries.js +72 -0
  156. package/dist/api/routes/public/rows.js +158 -0
  157. package/dist/api/routes/public/tables.js +152 -0
  158. package/dist/api/routes/public/users.js +135 -0
  159. package/dist/api/routes/public/utils/Endpoint.js +36 -0
  160. package/dist/api/routes/query.js +47 -0
  161. package/dist/api/routes/role.js +40 -0
  162. package/dist/api/routes/routing.js +39 -0
  163. package/dist/api/routes/row.js +239 -0
  164. package/dist/api/routes/screen.js +39 -0
  165. package/dist/api/routes/script.js +35 -0
  166. package/dist/api/routes/static.js +80 -0
  167. package/dist/api/routes/table.js +163 -0
  168. package/dist/api/routes/templates.js +37 -0
  169. package/dist/api/routes/user.js +43 -0
  170. package/dist/api/routes/utils/validators.js +238 -0
  171. package/dist/api/routes/view.js +42 -0
  172. package/dist/api/routes/webhook.js +43 -0
  173. package/dist/app.js +132 -0
  174. package/dist/automations/actions.js +137 -0
  175. package/dist/automations/automationUtils.js +173 -0
  176. package/dist/automations/bullboard.js +71 -0
  177. package/dist/automations/index.js +43 -0
  178. package/dist/automations/logging/index.js +53 -0
  179. package/dist/automations/steps/bash.js +111 -0
  180. package/dist/automations/steps/createRow.js +108 -0
  181. package/dist/automations/steps/delay.js +53 -0
  182. package/dist/automations/steps/deleteRow.js +96 -0
  183. package/dist/automations/steps/discord.js +116 -0
  184. package/dist/automations/steps/executeQuery.js +134 -0
  185. package/dist/automations/steps/executeScript.js +106 -0
  186. package/dist/automations/steps/filter.js +112 -0
  187. package/dist/automations/steps/integromat.js +119 -0
  188. package/dist/automations/steps/loop.js +54 -0
  189. package/dist/automations/steps/outgoingWebhook.js +166 -0
  190. package/dist/automations/steps/queryRows.js +216 -0
  191. package/dist/automations/steps/sendSmtpEmail.js +115 -0
  192. package/dist/automations/steps/serverLog.js +65 -0
  193. package/dist/automations/steps/slack.js +98 -0
  194. package/dist/automations/steps/updateRow.js +144 -0
  195. package/dist/automations/steps/utils.js +56 -0
  196. package/dist/automations/steps/zapier.js +117 -0
  197. package/dist/automations/triggerInfo/app.js +36 -0
  198. package/dist/automations/triggerInfo/cron.js +35 -0
  199. package/dist/automations/triggerInfo/index.js +40 -0
  200. package/dist/automations/triggerInfo/rowDeleted.js +36 -0
  201. package/dist/automations/triggerInfo/rowSaved.js +44 -0
  202. package/dist/automations/triggerInfo/rowUpdated.js +44 -0
  203. package/dist/automations/triggerInfo/webhook.js +40 -0
  204. package/dist/automations/triggers.js +180 -0
  205. package/dist/automations/utils.js +264 -0
  206. package/dist/constants/definitions.js +2 -0
  207. package/dist/constants/index.js +181 -0
  208. package/dist/constants/layouts.js +148 -0
  209. package/dist/constants/screens.js +51 -0
  210. package/dist/db/defaultData/datasource_bb_default.js +574 -0
  211. package/dist/db/defaultData/employeeImport.js +155 -0
  212. package/dist/db/defaultData/expensesImport.js +117 -0
  213. package/dist/db/defaultData/inventoryImport.js +109 -0
  214. package/dist/db/defaultData/jobsImport.js +152 -0
  215. package/dist/db/dynamoClient.js +124 -0
  216. package/dist/db/inMemoryView.js +62 -0
  217. package/dist/db/index.js +43 -0
  218. package/dist/db/linkedRows/LinkController.js +392 -0
  219. package/dist/db/linkedRows/LinkDocument.js +33 -0
  220. package/dist/db/linkedRows/index.js +206 -0
  221. package/dist/db/linkedRows/linkUtils.js +131 -0
  222. package/dist/db/newid.js +7 -0
  223. package/dist/db/utils.js +247 -0
  224. package/dist/db/views/staticViews.js +144 -0
  225. package/dist/ddApm.js +11 -0
  226. package/dist/definitions/automations.js +8 -0
  227. package/dist/definitions/common.js +2 -0
  228. package/dist/definitions/datasource.js +7 -0
  229. package/dist/definitions/openapi.js +6 -0
  230. package/dist/environment.js +113 -0
  231. package/dist/events/AutomationEmitter.js +53 -0
  232. package/dist/events/BudibaseEmitter.js +25 -0
  233. package/dist/events/docUpdates/index.js +17 -0
  234. package/dist/events/docUpdates/processors.js +18 -0
  235. package/dist/events/docUpdates/syncUsers.js +49 -0
  236. package/dist/events/index.js +11 -0
  237. package/dist/events/utils.js +43 -0
  238. package/dist/index.js +16 -0
  239. package/dist/integrations/airtable.js +147 -0
  240. package/dist/integrations/arangodb.js +103 -0
  241. package/dist/integrations/base/query.js +32 -0
  242. package/dist/integrations/base/sql.js +600 -0
  243. package/dist/integrations/base/sqlTable.js +160 -0
  244. package/dist/integrations/base/types.js +2 -0
  245. package/dist/integrations/couchdb.js +125 -0
  246. package/dist/integrations/dynamodb.js +194 -0
  247. package/dist/integrations/elasticsearch.js +186 -0
  248. package/dist/integrations/firebase.js +174 -0
  249. package/dist/integrations/googlesheets.js +455 -0
  250. package/dist/integrations/index.js +135 -0
  251. package/dist/integrations/microsoftSqlServer.js +273 -0
  252. package/dist/integrations/mongodb.js +614 -0
  253. package/dist/integrations/mysql.js +256 -0
  254. package/dist/integrations/oracle.js +375 -0
  255. package/dist/integrations/postgres.js +300 -0
  256. package/dist/integrations/queries/sql.js +84 -0
  257. package/dist/integrations/redis.js +168 -0
  258. package/dist/integrations/rest.js +400 -0
  259. package/dist/integrations/s3.js +237 -0
  260. package/dist/integrations/snowflake.js +99 -0
  261. package/dist/integrations/utils.js +295 -0
  262. package/dist/middleware/appInfo.js +22 -0
  263. package/dist/middleware/authorized.js +112 -0
  264. package/dist/middleware/builder.js +93 -0
  265. package/dist/middleware/currentapp.js +103 -0
  266. package/dist/middleware/joi-validator.js +43 -0
  267. package/dist/middleware/publicApi.js +25 -0
  268. package/dist/middleware/resourceId.js +59 -0
  269. package/dist/middleware/selfhost.js +24 -0
  270. package/dist/middleware/utils.js +8 -0
  271. package/dist/migrations/functions/appUrls.js +42 -0
  272. package/dist/migrations/functions/backfill/app/automations.js +31 -0
  273. package/dist/migrations/functions/backfill/app/datasources.js +28 -0
  274. package/dist/migrations/functions/backfill/app/layouts.js +33 -0
  275. package/dist/migrations/functions/backfill/app/queries.js +50 -0
  276. package/dist/migrations/functions/backfill/app/roles.js +28 -0
  277. package/dist/migrations/functions/backfill/app/screens.js +28 -0
  278. package/dist/migrations/functions/backfill/app/tables.js +37 -0
  279. package/dist/migrations/functions/backfill/app.js +176 -0
  280. package/dist/migrations/functions/backfill/global/configs.js +67 -0
  281. package/dist/migrations/functions/backfill/global/quotas.js +60 -0
  282. package/dist/migrations/functions/backfill/global/users.js +50 -0
  283. package/dist/migrations/functions/backfill/global.js +205 -0
  284. package/dist/migrations/functions/backfill/index.js +32 -0
  285. package/dist/migrations/functions/backfill/installation.js +80 -0
  286. package/dist/migrations/functions/syncQuotas.js +50 -0
  287. package/dist/migrations/functions/tableSettings.js +130 -0
  288. package/dist/migrations/functions/usageQuotas/index.js +16 -0
  289. package/dist/migrations/functions/usageQuotas/syncApps.js +25 -0
  290. package/dist/migrations/functions/usageQuotas/syncPlugins.js +23 -0
  291. package/dist/migrations/functions/usageQuotas/syncRows.js +33 -0
  292. package/dist/migrations/functions/userEmailViewCasing.js +24 -0
  293. package/dist/migrations/index.js +111 -0
  294. package/dist/migrations/tests/helpers.js +72 -0
  295. package/dist/migrations/tests/structures.js +37 -0
  296. package/dist/package.json +180 -0
  297. package/dist/sdk/app/applications/index.js +28 -0
  298. package/dist/sdk/app/applications/sync.js +164 -0
  299. package/dist/sdk/app/applications/utils.js +21 -0
  300. package/dist/sdk/app/automations/index.js +29 -0
  301. package/dist/sdk/app/automations/webhook.js +54 -0
  302. package/dist/sdk/app/backups/constants.js +6 -0
  303. package/dist/sdk/app/backups/exports.js +184 -0
  304. package/dist/sdk/app/backups/imports.js +170 -0
  305. package/dist/sdk/app/backups/index.js +29 -0
  306. package/dist/sdk/app/backups/statistics.js +73 -0
  307. package/dist/sdk/app/datasources/datasources.js +166 -0
  308. package/dist/sdk/app/datasources/index.js +27 -0
  309. package/dist/sdk/app/queries/index.js +27 -0
  310. package/dist/sdk/app/queries/queries.js +60 -0
  311. package/dist/sdk/app/rows/attachments.js +61 -0
  312. package/dist/sdk/app/rows/index.js +28 -0
  313. package/dist/sdk/app/rows/rows.js +30 -0
  314. package/dist/sdk/app/tables/index.js +65 -0
  315. package/dist/sdk/index.js +27 -0
  316. package/dist/sdk/plugins/index.js +27 -0
  317. package/dist/sdk/plugins/plugins.js +53 -0
  318. package/dist/sdk/users/index.js +27 -0
  319. package/dist/sdk/users/utils.js +87 -0
  320. package/dist/sdk/utils/index.js +29 -0
  321. package/dist/startup.js +158 -0
  322. package/dist/threads/automation.js +449 -0
  323. package/dist/threads/definitions.js +2 -0
  324. package/dist/threads/index.js +137 -0
  325. package/dist/threads/query.js +265 -0
  326. package/dist/threads/utils.js +122 -0
  327. package/dist/tsconfig.build.tsbuildinfo +1 -0
  328. package/dist/utilities/appDirectoryTemplate/package.json +10 -0
  329. package/dist/utilities/budibaseDir.js +5 -0
  330. package/dist/utilities/centralPath.js +27 -0
  331. package/dist/utilities/fileSystem/app.js +88 -0
  332. package/dist/utilities/fileSystem/clientLibrary.js +138 -0
  333. package/dist/utilities/fileSystem/filesystem.js +180 -0
  334. package/dist/utilities/fileSystem/index.js +21 -0
  335. package/dist/utilities/fileSystem/plugin.js +76 -0
  336. package/dist/utilities/fileSystem/processor.js +34 -0
  337. package/dist/utilities/fileSystem/template.js +47 -0
  338. package/dist/utilities/global.js +149 -0
  339. package/dist/utilities/index.js +143 -0
  340. package/dist/utilities/redis.js +117 -0
  341. package/dist/utilities/retry.js +30 -0
  342. package/dist/utilities/routing/index.js +39 -0
  343. package/dist/utilities/rowProcessor/index.js +284 -0
  344. package/dist/utilities/rowProcessor/map.js +99 -0
  345. package/dist/utilities/rowProcessor/utils.js +88 -0
  346. package/dist/utilities/schema.js +108 -0
  347. package/dist/utilities/scriptRunner.js +26 -0
  348. package/dist/utilities/security.js +57 -0
  349. package/dist/utilities/statusCodes.js +9 -0
  350. package/dist/utilities/usageQuota/rows.js +88 -0
  351. package/dist/utilities/usageQuota/usageQuoteReset.js +16 -0
  352. package/dist/utilities/users.js +57 -0
  353. package/dist/utilities/workerRequests.js +171 -0
  354. package/dist/watch.js +53 -0
  355. package/dist/websockets/client.js +14 -0
  356. package/dist/websockets/grid.js +60 -0
  357. package/dist/websockets/index.js +17 -0
  358. package/dist/websockets/websocket.js +78 -0
  359. package/docker_run.sh +7 -0
  360. package/jest-testcontainers-config.js +8 -0
  361. package/jest.config.ts +52 -0
  362. package/nodemon.json +10 -0
  363. package/package.json +166 -31
  364. package/pm2.config.js +9 -0
  365. package/scripts/account.js +8 -0
  366. package/scripts/dev/manage.js +119 -0
  367. package/scripts/docs/README.md +31 -0
  368. package/scripts/docs/generate.js +74 -0
  369. package/scripts/docs/toSwagger.js +320 -0
  370. package/scripts/exportAppTemplate.js +64 -0
  371. package/scripts/integrations/customer-categories/docker-compose.yml +28 -0
  372. package/scripts/integrations/customer-categories/init.sql +41 -0
  373. package/scripts/integrations/customer-categories/reset.sh +3 -0
  374. package/scripts/integrations/mssql/data/Dockerfile +9 -0
  375. package/scripts/integrations/mssql/data/entrypoint.sh +25 -0
  376. package/scripts/integrations/mssql/data/setup.sql +80 -0
  377. package/scripts/integrations/mssql/docker-compose.yaml +12 -0
  378. package/scripts/integrations/mssql/reset.sh +3 -0
  379. package/scripts/integrations/mysql/docker-compose.yaml +21 -0
  380. package/scripts/integrations/mysql/init.sql +32 -0
  381. package/scripts/integrations/mysql/reset.sh +3 -0
  382. package/scripts/integrations/oracle/docker-compose.yml +19 -0
  383. package/scripts/integrations/oracle/instantclient/linux/arm64/basiclite-19.10.zip +0 -0
  384. package/scripts/integrations/oracle/instantclient/linux/arm64/install.sh +23 -0
  385. package/scripts/integrations/oracle/instantclient/linux/install.sh +10 -0
  386. package/scripts/integrations/oracle/instantclient/linux/x86-64/basiclite-21.4.zip +0 -0
  387. package/scripts/integrations/oracle/instantclient/linux/x86-64/install.sh +23 -0
  388. package/scripts/integrations/oracle/oracle.md +90 -0
  389. package/scripts/integrations/pg-json/docker-compose.yml +28 -0
  390. package/scripts/integrations/pg-json/init.sql +22 -0
  391. package/scripts/integrations/pg-json/reset.sh +3 -0
  392. package/scripts/integrations/postgres/docker-compose.yml +28 -0
  393. package/scripts/integrations/postgres/emp-skill.sql +46 -0
  394. package/scripts/integrations/postgres/emp-territory.sql +32 -0
  395. package/scripts/integrations/postgres/init.sql +57 -0
  396. package/scripts/integrations/postgres/reset.sh +3 -0
  397. package/scripts/integrations/service-vehicles/docker-compose.yml +28 -0
  398. package/scripts/integrations/service-vehicles/init.sql +52 -0
  399. package/scripts/integrations/service-vehicles/reset.sh +3 -0
  400. package/scripts/load/create-many-apps.js +24 -0
  401. package/scripts/load/create-many-rows.js +30 -0
  402. package/scripts/load/utils.js +66 -0
  403. package/scripts/localdomain.js +52 -0
  404. package/scripts/multiTenancy.js +8 -0
  405. package/scripts/selfhost.js +8 -0
  406. package/scripts/test.sh +14 -0
  407. package/scripts/watchtower-hooks/post-check.sh +1 -0
  408. package/scripts/watchtower-hooks/post-update.sh +1 -0
  409. package/scripts/watchtower-hooks/pre-check.sh +1 -0
  410. package/scripts/watchtower-hooks/pre-update.sh +1 -0
  411. package/specs/generate.ts +92 -0
  412. package/specs/openapi.json +2782 -0
  413. package/specs/openapi.yaml +2111 -0
  414. package/specs/parameters.ts +59 -0
  415. package/specs/resources/application.ts +137 -0
  416. package/specs/resources/index.ts +26 -0
  417. package/specs/resources/metrics.ts +81 -0
  418. package/specs/resources/misc.ts +128 -0
  419. package/specs/resources/query.ts +217 -0
  420. package/specs/resources/row.ts +124 -0
  421. package/specs/resources/table.ts +197 -0
  422. package/specs/resources/user.ts +132 -0
  423. package/specs/resources/utils/Resource.ts +39 -0
  424. package/specs/resources/utils/index.ts +11 -0
  425. package/specs/security.ts +7 -0
  426. package/src/api/controllers/analytics.ts +35 -0
  427. package/src/api/controllers/apikeys.ts +54 -0
  428. package/src/api/controllers/application.ts +633 -0
  429. package/src/api/controllers/auth.ts +72 -0
  430. package/src/api/controllers/automation.ts +302 -0
  431. package/src/api/controllers/backup.ts +21 -0
  432. package/src/api/controllers/cloud.ts +119 -0
  433. package/src/api/controllers/component.ts +58 -0
  434. package/src/api/controllers/datasource.ts +351 -0
  435. package/src/api/controllers/deploy/Deployment.ts +59 -0
  436. package/src/api/controllers/deploy/index.ts +203 -0
  437. package/src/api/controllers/dev.ts +129 -0
  438. package/src/api/controllers/integration.ts +13 -0
  439. package/src/api/controllers/layout.ts +47 -0
  440. package/src/api/controllers/metadata.ts +42 -0
  441. package/src/api/controllers/migrations.ts +14 -0
  442. package/src/api/controllers/ops.ts +32 -0
  443. package/src/api/controllers/permission.ts +178 -0
  444. package/src/api/controllers/plugin/file.ts +15 -0
  445. package/src/api/controllers/plugin/github.ts +75 -0
  446. package/src/api/controllers/plugin/index.ts +101 -0
  447. package/src/api/controllers/plugin/npm.ts +56 -0
  448. package/src/api/controllers/plugin/uploaders.ts +4 -0
  449. package/src/api/controllers/plugin/url.ts +12 -0
  450. package/src/api/controllers/plugin/utils.ts +17 -0
  451. package/src/api/controllers/public/applications.ts +100 -0
  452. package/src/api/controllers/public/mapping/applications.ts +32 -0
  453. package/src/api/controllers/public/mapping/index.ts +13 -0
  454. package/src/api/controllers/public/mapping/queries.ts +39 -0
  455. package/src/api/controllers/public/mapping/rows.ts +31 -0
  456. package/src/api/controllers/public/mapping/tables.ts +26 -0
  457. package/src/api/controllers/public/mapping/types.ts +21 -0
  458. package/src/api/controllers/public/mapping/users.ts +32 -0
  459. package/src/api/controllers/public/metrics.ts +251 -0
  460. package/src/api/controllers/public/queries.ts +20 -0
  461. package/src/api/controllers/public/rows.ts +81 -0
  462. package/src/api/controllers/public/tables.ts +56 -0
  463. package/src/api/controllers/public/users.ts +80 -0
  464. package/src/api/controllers/public/utils.ts +45 -0
  465. package/src/api/controllers/query/import/index.ts +96 -0
  466. package/src/api/controllers/query/import/sources/base/index.ts +98 -0
  467. package/src/api/controllers/query/import/sources/base/openapi.ts +24 -0
  468. package/src/api/controllers/query/import/sources/curl.ts +106 -0
  469. package/src/api/controllers/query/import/sources/openapi2.ts +167 -0
  470. package/src/api/controllers/query/import/sources/openapi3.ts +209 -0
  471. package/src/api/controllers/query/import/sources/tests/curl/curl.spec.js +103 -0
  472. package/src/api/controllers/query/import/sources/tests/curl/data/delete.txt +1 -0
  473. package/src/api/controllers/query/import/sources/tests/curl/data/empty-body.txt +2 -0
  474. package/src/api/controllers/query/import/sources/tests/curl/data/get.txt +1 -0
  475. package/src/api/controllers/query/import/sources/tests/curl/data/headers.txt +3 -0
  476. package/src/api/controllers/query/import/sources/tests/curl/data/patch.txt +2 -0
  477. package/src/api/controllers/query/import/sources/tests/curl/data/path.txt +1 -0
  478. package/src/api/controllers/query/import/sources/tests/curl/data/post.txt +2 -0
  479. package/src/api/controllers/query/import/sources/tests/curl/data/put.txt +2 -0
  480. package/src/api/controllers/query/import/sources/tests/curl/data/query.txt +1 -0
  481. package/src/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +253 -0
  482. package/src/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.yaml +160 -0
  483. package/src/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +1054 -0
  484. package/src/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.yaml +711 -0
  485. package/src/api/controllers/query/import/sources/tests/openapi2/openapi2.spec.js +238 -0
  486. package/src/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +253 -0
  487. package/src/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.yaml +153 -0
  488. package/src/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +1225 -0
  489. package/src/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.yaml +804 -0
  490. package/src/api/controllers/query/import/sources/tests/openapi3/openapi3.spec.js +240 -0
  491. package/src/api/controllers/query/import/tests/index.spec.js +162 -0
  492. package/src/api/controllers/query/index.ts +307 -0
  493. package/src/api/controllers/query/validation.ts +50 -0
  494. package/src/api/controllers/role.ts +104 -0
  495. package/src/api/controllers/routing.ts +95 -0
  496. package/src/api/controllers/row/ExternalRequest.ts +821 -0
  497. package/src/api/controllers/row/external.ts +304 -0
  498. package/src/api/controllers/row/index.ts +162 -0
  499. package/src/api/controllers/row/internal.ts +500 -0
  500. package/src/api/controllers/row/internalSearch.ts +18 -0
  501. package/src/api/controllers/row/staticFormula.ts +170 -0
  502. package/src/api/controllers/row/utils.ts +156 -0
  503. package/src/api/controllers/screen.ts +126 -0
  504. package/src/api/controllers/script.ts +12 -0
  505. package/src/api/controllers/static/index.ts +241 -0
  506. package/src/api/controllers/static/templates/BudibaseApp.svelte +135 -0
  507. package/src/api/controllers/static/templates/app.hbs +13 -0
  508. package/src/api/controllers/static/templates/preview.hbs +117 -0
  509. package/src/api/controllers/table/bulkFormula.ts +188 -0
  510. package/src/api/controllers/table/external.ts +364 -0
  511. package/src/api/controllers/table/index.ts +143 -0
  512. package/src/api/controllers/table/internal.ts +191 -0
  513. package/src/api/controllers/table/tests/utils.spec.ts +97 -0
  514. package/src/api/controllers/table/utils.ts +422 -0
  515. package/src/api/controllers/templates.ts +43 -0
  516. package/src/api/controllers/user.ts +97 -0
  517. package/src/api/controllers/view/exporters.ts +43 -0
  518. package/src/api/controllers/view/index.ts +192 -0
  519. package/src/api/controllers/view/tests/__snapshots__/viewBuilder.spec.js.snap +147 -0
  520. package/src/api/controllers/view/tests/viewBuilder.spec.js +65 -0
  521. package/src/api/controllers/view/utils.ts +165 -0
  522. package/src/api/controllers/view/viewBuilder.ts +203 -0
  523. package/src/api/controllers/webhook.ts +100 -0
  524. package/src/api/index.ts +63 -0
  525. package/src/api/routes/analytics.ts +9 -0
  526. package/src/api/routes/apikeys.ts +12 -0
  527. package/src/api/routes/application.ts +57 -0
  528. package/src/api/routes/auth.ts +8 -0
  529. package/src/api/routes/automation.ts +87 -0
  530. package/src/api/routes/backup.ts +14 -0
  531. package/src/api/routes/cloud.ts +18 -0
  532. package/src/api/routes/component.ts +14 -0
  533. package/src/api/routes/datasource.ts +60 -0
  534. package/src/api/routes/deploy.ts +20 -0
  535. package/src/api/routes/dev.ts +38 -0
  536. package/src/api/routes/index.ts +73 -0
  537. package/src/api/routes/integration.ts +16 -0
  538. package/src/api/routes/layout.ts +16 -0
  539. package/src/api/routes/metadata.ts +38 -0
  540. package/src/api/routes/migrations.ts +14 -0
  541. package/src/api/routes/ops.ts +30 -0
  542. package/src/api/routes/permission.ts +41 -0
  543. package/src/api/routes/plugin.ts +22 -0
  544. package/src/api/routes/public/applications.ts +195 -0
  545. package/src/api/routes/public/index.ts +145 -0
  546. package/src/api/routes/public/metrics.ts +28 -0
  547. package/src/api/routes/public/middleware/mapper.ts +85 -0
  548. package/src/api/routes/public/queries.ts +76 -0
  549. package/src/api/routes/public/rows.ts +171 -0
  550. package/src/api/routes/public/tables.ts +167 -0
  551. package/src/api/routes/public/tests/compare.spec.ts +185 -0
  552. package/src/api/routes/public/tests/metrics.spec.js +34 -0
  553. package/src/api/routes/public/tests/users.spec.js +38 -0
  554. package/src/api/routes/public/tests/utils.ts +45 -0
  555. package/src/api/routes/public/users.ts +142 -0
  556. package/src/api/routes/public/utils/Endpoint.ts +51 -0
  557. package/src/api/routes/query.ts +61 -0
  558. package/src/api/routes/role.ts +24 -0
  559. package/src/api/routes/routing.ts +14 -0
  560. package/src/api/routes/row.ts +266 -0
  561. package/src/api/routes/screen.ts +23 -0
  562. package/src/api/routes/script.ts +10 -0
  563. package/src/api/routes/static.ts +65 -0
  564. package/src/api/routes/table.ts +170 -0
  565. package/src/api/routes/templates.ts +16 -0
  566. package/src/api/routes/tests/__snapshots__/datasource.spec.ts.snap +93 -0
  567. package/src/api/routes/tests/__snapshots__/view.spec.js.snap +38 -0
  568. package/src/api/routes/tests/analytics.spec.js +62 -0
  569. package/src/api/routes/tests/apikeys.spec.js +59 -0
  570. package/src/api/routes/tests/appSync.spec.ts +31 -0
  571. package/src/api/routes/tests/application.spec.ts +327 -0
  572. package/src/api/routes/tests/auth.spec.js +24 -0
  573. package/src/api/routes/tests/automation.spec.js +349 -0
  574. package/src/api/routes/tests/backup.spec.ts +45 -0
  575. package/src/api/routes/tests/cloud.spec.ts +54 -0
  576. package/src/api/routes/tests/component.spec.js +32 -0
  577. package/src/api/routes/tests/data/budibase-component-1.0.1.tgz +0 -0
  578. package/src/api/routes/tests/data/comment-box-1.0.2.tar.gz +0 -0
  579. package/src/api/routes/tests/data/export-test.tar.gz +0 -0
  580. package/src/api/routes/tests/data/export.txt +1 -0
  581. package/src/api/routes/tests/data/old-app.txt +3 -0
  582. package/src/api/routes/tests/datasource.spec.ts +238 -0
  583. package/src/api/routes/tests/dev.spec.js +40 -0
  584. package/src/api/routes/tests/environmentVariables.spec.ts +144 -0
  585. package/src/api/routes/tests/integration.spec.js +52 -0
  586. package/src/api/routes/tests/internalSearch.spec.js +197 -0
  587. package/src/api/routes/tests/layout.spec.js +59 -0
  588. package/src/api/routes/tests/metadata.spec.js +65 -0
  589. package/src/api/routes/tests/misc.spec.js +91 -0
  590. package/src/api/routes/tests/permissions.spec.js +133 -0
  591. package/src/api/routes/tests/plugin.spec.ts +179 -0
  592. package/src/api/routes/tests/query.seq.spec.js +538 -0
  593. package/src/api/routes/tests/role.spec.js +131 -0
  594. package/src/api/routes/tests/routing.spec.js +116 -0
  595. package/src/api/routes/tests/row.spec.js +573 -0
  596. package/src/api/routes/tests/screen.spec.js +103 -0
  597. package/src/api/routes/tests/static.spec.js +140 -0
  598. package/src/api/routes/tests/table.spec.js +302 -0
  599. package/src/api/routes/tests/templates.spec.js +24 -0
  600. package/src/api/routes/tests/user.spec.js +208 -0
  601. package/src/api/routes/tests/utilities/TestFunctions.ts +177 -0
  602. package/src/api/routes/tests/utilities/index.ts +96 -0
  603. package/src/api/routes/tests/view.spec.js +419 -0
  604. package/src/api/routes/tests/webhook.spec.js +134 -0
  605. package/src/api/routes/user.ts +46 -0
  606. package/src/api/routes/utils/validators.ts +240 -0
  607. package/src/api/routes/view.ts +34 -0
  608. package/src/api/routes/webhook.ts +27 -0
  609. package/src/app.ts +114 -0
  610. package/src/automations/actions.ts +109 -0
  611. package/src/automations/automationUtils.ts +163 -0
  612. package/src/automations/bullboard.ts +38 -0
  613. package/src/automations/index.ts +26 -0
  614. package/src/automations/logging/index.ts +38 -0
  615. package/src/automations/steps/bash.ts +81 -0
  616. package/src/automations/steps/createRow.ts +102 -0
  617. package/src/automations/steps/delay.ts +46 -0
  618. package/src/automations/steps/deleteRow.ts +91 -0
  619. package/src/automations/steps/discord.ts +106 -0
  620. package/src/automations/steps/executeQuery.ts +98 -0
  621. package/src/automations/steps/executeScript.ts +83 -0
  622. package/src/automations/steps/filter.ts +105 -0
  623. package/src/automations/steps/integromat.ts +110 -0
  624. package/src/automations/steps/loop.ts +58 -0
  625. package/src/automations/steps/outgoingWebhook.ts +141 -0
  626. package/src/automations/steps/queryRows.ts +196 -0
  627. package/src/automations/steps/sendSmtpEmail.ts +92 -0
  628. package/src/automations/steps/serverLog.ts +59 -0
  629. package/src/automations/steps/slack.ts +87 -0
  630. package/src/automations/steps/updateRow.ts +121 -0
  631. package/src/automations/steps/utils.ts +46 -0
  632. package/src/automations/steps/zapier.ts +108 -0
  633. package/src/automations/tests/automation.spec.ts +99 -0
  634. package/src/automations/tests/bash.spec.js +34 -0
  635. package/src/automations/tests/createRow.spec.ts +46 -0
  636. package/src/automations/tests/delay.spec.js +16 -0
  637. package/src/automations/tests/deleteRow.spec.ts +55 -0
  638. package/src/automations/tests/discord.spec.js +27 -0
  639. package/src/automations/tests/executeQuery.spec.js +48 -0
  640. package/src/automations/tests/executeScript.spec.js +48 -0
  641. package/src/automations/tests/filter.spec.js +49 -0
  642. package/src/automations/tests/loop.spec.ts +45 -0
  643. package/src/automations/tests/outgoingWebhook.spec.js +39 -0
  644. package/src/automations/tests/queryRows.spec.js +117 -0
  645. package/src/automations/tests/sendSmtpEmail.spec.js +71 -0
  646. package/src/automations/tests/serverLog.spec.js +22 -0
  647. package/src/automations/tests/updateRow.spec.js +44 -0
  648. package/src/automations/tests/utilities/index.ts +60 -0
  649. package/src/automations/tests/zapier.spec.js +27 -0
  650. package/src/automations/triggerInfo/app.ts +40 -0
  651. package/src/automations/triggerInfo/cron.ts +39 -0
  652. package/src/automations/triggerInfo/index.ts +15 -0
  653. package/src/automations/triggerInfo/rowDeleted.ts +40 -0
  654. package/src/automations/triggerInfo/rowSaved.ts +48 -0
  655. package/src/automations/triggerInfo/rowUpdated.ts +48 -0
  656. package/src/automations/triggerInfo/webhook.ts +44 -0
  657. package/src/automations/triggers.ts +156 -0
  658. package/src/automations/unitTests/automationUtils.spec.ts +133 -0
  659. package/src/automations/utils.ts +267 -0
  660. package/src/constants/definitions.ts +42 -0
  661. package/src/constants/index.ts +183 -0
  662. package/src/constants/layouts.ts +147 -0
  663. package/src/constants/screens.ts +48 -0
  664. package/src/db/defaultData/datasource_bb_default.ts +654 -0
  665. package/src/db/defaultData/employeeImport.ts +152 -0
  666. package/src/db/defaultData/expensesImport.ts +114 -0
  667. package/src/db/defaultData/inventoryImport.ts +106 -0
  668. package/src/db/defaultData/jobsImport.ts +158 -0
  669. package/src/db/dynamoClient.ts +147 -0
  670. package/src/db/inMemoryView.ts +55 -0
  671. package/src/db/index.ts +16 -0
  672. package/src/db/linkedRows/LinkController.ts +445 -0
  673. package/src/db/linkedRows/LinkDocument.ts +60 -0
  674. package/src/db/linkedRows/index.ts +217 -0
  675. package/src/db/linkedRows/linkUtils.ts +125 -0
  676. package/src/db/newid.ts +5 -0
  677. package/src/db/tests/linkController.spec.js +236 -0
  678. package/src/db/tests/linkTests.spec.js +65 -0
  679. package/src/db/utils.ts +272 -0
  680. package/src/db/views/staticViews.ts +132 -0
  681. package/src/ddApm.ts +7 -0
  682. package/src/definitions/automations.ts +33 -0
  683. package/src/definitions/common.ts +54 -0
  684. package/src/definitions/datasource.ts +9 -0
  685. package/src/definitions/openapi.ts +1233 -0
  686. package/src/environment.ts +125 -0
  687. package/src/events/AutomationEmitter.ts +58 -0
  688. package/src/events/BudibaseEmitter.ts +29 -0
  689. package/src/events/docUpdates/index.ts +1 -0
  690. package/src/events/docUpdates/processors.ts +14 -0
  691. package/src/events/docUpdates/syncUsers.ts +35 -0
  692. package/src/events/index.ts +6 -0
  693. package/src/events/utils.ts +78 -0
  694. package/src/index.ts +16 -0
  695. package/src/integration-test/postgres.spec.ts +1026 -0
  696. package/src/integrations/airtable.ts +148 -0
  697. package/src/integrations/arangodb.ts +110 -0
  698. package/src/integrations/base/query.ts +18 -0
  699. package/src/integrations/base/sql.ts +651 -0
  700. package/src/integrations/base/sqlTable.ts +202 -0
  701. package/src/integrations/base/types.ts +134 -0
  702. package/src/integrations/couchdb.ts +133 -0
  703. package/src/integrations/dynamodb.ts +220 -0
  704. package/src/integrations/elasticsearch.ts +187 -0
  705. package/src/integrations/firebase.ts +187 -0
  706. package/src/integrations/googlesheets.ts +511 -0
  707. package/src/integrations/index.ts +125 -0
  708. package/src/integrations/microsoftSqlServer.ts +312 -0
  709. package/src/integrations/mongodb.ts +638 -0
  710. package/src/integrations/mysql.ts +300 -0
  711. package/src/integrations/oracle.ts +435 -0
  712. package/src/integrations/postgres.ts +336 -0
  713. package/src/integrations/queries/sql.ts +81 -0
  714. package/src/integrations/redis.ts +163 -0
  715. package/src/integrations/rest.ts +436 -0
  716. package/src/integrations/s3.ts +260 -0
  717. package/src/integrations/snowflake.ts +97 -0
  718. package/src/integrations/tests/TestConfiguration.js +0 -0
  719. package/src/integrations/tests/airtable.spec.ts +75 -0
  720. package/src/integrations/tests/arangodb.spec.ts +38 -0
  721. package/src/integrations/tests/couchdb.spec.ts +86 -0
  722. package/src/integrations/tests/dynamodb.spec.ts +155 -0
  723. package/src/integrations/tests/elasticsearch.spec.ts +82 -0
  724. package/src/integrations/tests/firebase.spec.ts +97 -0
  725. package/src/integrations/tests/googlesheets.spec.ts +126 -0
  726. package/src/integrations/tests/microsoftSqlServer.spec.ts +56 -0
  727. package/src/integrations/tests/mongo.spec.ts +334 -0
  728. package/src/integrations/tests/mysql.spec.ts +133 -0
  729. package/src/integrations/tests/oracle.spec.ts +96 -0
  730. package/src/integrations/tests/postgres.spec.ts +81 -0
  731. package/src/integrations/tests/redis.spec.ts +88 -0
  732. package/src/integrations/tests/rest.spec.ts +595 -0
  733. package/src/integrations/tests/s3.spec.ts +112 -0
  734. package/src/integrations/tests/sql.spec.ts +639 -0
  735. package/src/integrations/utils.ts +330 -0
  736. package/src/middleware/appInfo.ts +20 -0
  737. package/src/middleware/authorized.ts +131 -0
  738. package/src/middleware/builder.ts +97 -0
  739. package/src/middleware/currentapp.ts +112 -0
  740. package/src/middleware/joi-validator.ts +40 -0
  741. package/src/middleware/publicApi.ts +21 -0
  742. package/src/middleware/resourceId.ts +66 -0
  743. package/src/middleware/selfhost.ts +12 -0
  744. package/src/middleware/tests/authorized.spec.js +163 -0
  745. package/src/middleware/tests/currentapp.spec.js +207 -0
  746. package/src/middleware/tests/resourceId.spec.js +105 -0
  747. package/src/middleware/tests/selfhost.spec.js +43 -0
  748. package/src/middleware/utils.ts +9 -0
  749. package/src/migrations/functions/appUrls.ts +27 -0
  750. package/src/migrations/functions/backfill/app/automations.ts +26 -0
  751. package/src/migrations/functions/backfill/app/datasources.ts +22 -0
  752. package/src/migrations/functions/backfill/app/layouts.ts +29 -0
  753. package/src/migrations/functions/backfill/app/queries.ts +47 -0
  754. package/src/migrations/functions/backfill/app/roles.ts +22 -0
  755. package/src/migrations/functions/backfill/app/screens.ts +22 -0
  756. package/src/migrations/functions/backfill/app/tables.ts +27 -0
  757. package/src/migrations/functions/backfill/app.ts +149 -0
  758. package/src/migrations/functions/backfill/global/configs.ts +73 -0
  759. package/src/migrations/functions/backfill/global/quotas.ts +60 -0
  760. package/src/migrations/functions/backfill/global/users.ts +49 -0
  761. package/src/migrations/functions/backfill/global.ts +213 -0
  762. package/src/migrations/functions/backfill/index.ts +7 -0
  763. package/src/migrations/functions/backfill/installation.ts +50 -0
  764. package/src/migrations/functions/syncQuotas.ts +15 -0
  765. package/src/migrations/functions/tableSettings.ts +145 -0
  766. package/src/migrations/functions/tests/appUrls.spec.js +26 -0
  767. package/src/migrations/functions/tests/syncQuotas.spec.js +26 -0
  768. package/src/migrations/functions/tests/tableSettings.spec.ts +144 -0
  769. package/src/migrations/functions/tests/userEmailViewCasing.spec.js +34 -0
  770. package/src/migrations/functions/usageQuotas/index.ts +3 -0
  771. package/src/migrations/functions/usageQuotas/syncApps.ts +14 -0
  772. package/src/migrations/functions/usageQuotas/syncPlugins.ts +10 -0
  773. package/src/migrations/functions/usageQuotas/syncRows.ts +27 -0
  774. package/src/migrations/functions/usageQuotas/tests/syncApps.spec.ts +35 -0
  775. package/src/migrations/functions/usageQuotas/tests/syncRows.spec.ts +53 -0
  776. package/src/migrations/functions/userEmailViewCasing.ts +13 -0
  777. package/src/migrations/index.ts +115 -0
  778. package/src/migrations/tests/helpers.ts +40 -0
  779. package/src/migrations/tests/index.spec.ts +142 -0
  780. package/src/migrations/tests/structures.ts +67 -0
  781. package/src/sdk/app/applications/index.ts +7 -0
  782. package/src/sdk/app/applications/sync.ts +168 -0
  783. package/src/sdk/app/applications/tests/sync.spec.ts +137 -0
  784. package/src/sdk/app/applications/utils.ts +17 -0
  785. package/src/sdk/app/automations/index.ts +5 -0
  786. package/src/sdk/app/automations/webhook.ts +43 -0
  787. package/src/sdk/app/backups/constants.ts +3 -0
  788. package/src/sdk/app/backups/exports.ts +195 -0
  789. package/src/sdk/app/backups/imports.ts +185 -0
  790. package/src/sdk/app/backups/index.ts +9 -0
  791. package/src/sdk/app/backups/statistics.ts +69 -0
  792. package/src/sdk/app/datasources/datasources.ts +162 -0
  793. package/src/sdk/app/datasources/index.ts +5 -0
  794. package/src/sdk/app/queries/index.ts +5 -0
  795. package/src/sdk/app/queries/queries.ts +50 -0
  796. package/src/sdk/app/rows/attachments.ts +60 -0
  797. package/src/sdk/app/rows/index.ts +7 -0
  798. package/src/sdk/app/rows/rows.ts +18 -0
  799. package/src/sdk/app/tables/index.ts +63 -0
  800. package/src/sdk/index.ts +24 -0
  801. package/src/sdk/plugins/index.ts +5 -0
  802. package/src/sdk/plugins/plugins.ts +41 -0
  803. package/src/sdk/tests/attachments.spec.ts +76 -0
  804. package/src/sdk/users/index.ts +5 -0
  805. package/src/sdk/users/tests/utils.spec.ts +128 -0
  806. package/src/sdk/users/utils.ts +93 -0
  807. package/src/sdk/utils/index.ts +16 -0
  808. package/src/startup.ts +138 -0
  809. package/src/tests/jestEnv.ts +11 -0
  810. package/src/tests/jestSetup.ts +22 -0
  811. package/src/tests/utilities/TestConfiguration.ts +768 -0
  812. package/src/tests/utilities/controllers.ts +14 -0
  813. package/src/tests/utilities/index.ts +11 -0
  814. package/src/tests/utilities/structures.ts +289 -0
  815. package/src/threads/automation.ts +502 -0
  816. package/src/threads/definitions.ts +21 -0
  817. package/src/threads/index.ts +111 -0
  818. package/src/threads/query.ts +305 -0
  819. package/src/threads/utils.ts +96 -0
  820. package/src/utilities/appDirectoryTemplate/package.json +10 -0
  821. package/src/utilities/budibaseDir.ts +3 -0
  822. package/src/utilities/centralPath.ts +22 -0
  823. package/src/utilities/fileSystem/app.ts +79 -0
  824. package/src/utilities/fileSystem/clientLibrary.ts +154 -0
  825. package/src/utilities/fileSystem/filesystem.ts +168 -0
  826. package/src/utilities/fileSystem/index.ts +5 -0
  827. package/src/utilities/fileSystem/plugin.ts +73 -0
  828. package/src/utilities/fileSystem/processor.ts +19 -0
  829. package/src/utilities/fileSystem/template.ts +36 -0
  830. package/src/utilities/global.ts +153 -0
  831. package/src/utilities/index.ts +134 -0
  832. package/src/utilities/redis.ts +88 -0
  833. package/src/utilities/retry.ts +18 -0
  834. package/src/utilities/routing/index.ts +32 -0
  835. package/src/utilities/rowProcessor/index.ts +279 -0
  836. package/src/utilities/rowProcessor/map.ts +96 -0
  837. package/src/utilities/rowProcessor/tests/utils.spec.ts +57 -0
  838. package/src/utilities/rowProcessor/utils.ts +96 -0
  839. package/src/utilities/schema.ts +141 -0
  840. package/src/utilities/scriptRunner.ts +28 -0
  841. package/src/utilities/security.ts +65 -0
  842. package/{utilities/statusCodes.js → src/utilities/statusCodes.ts} +1 -1
  843. package/src/utilities/tests/test.csv +4 -0
  844. package/src/utilities/usageQuota/rows.ts +80 -0
  845. package/src/utilities/usageQuota/usageQuoteReset.ts +18 -0
  846. package/src/utilities/users.ts +49 -0
  847. package/src/utilities/workerRequests.ts +188 -0
  848. package/src/watch.ts +37 -0
  849. package/src/websockets/client.ts +11 -0
  850. package/src/websockets/grid.ts +55 -0
  851. package/src/websockets/index.ts +14 -0
  852. package/src/websockets/websocket.ts +83 -0
  853. package/tsconfig.build.json +28 -0
  854. package/tsconfig.json +22 -0
  855. package/app.js +0 -20
  856. package/appPackages/_master/access_levels.json +0 -175
  857. package/appPackages/_master/appDefinition.json +0 -527
  858. package/appPackages/_master/main.js +0 -125
  859. package/appPackages/_master/node_modules/.yarn-integrity +0 -20
  860. package/appPackages/_master/node_modules/@budibase/materialdesign-components/README.md +0 -33
  861. package/appPackages/_master/node_modules/@budibase/materialdesign-components/components.json +0 -249
  862. package/appPackages/_master/node_modules/@budibase/materialdesign-components/dist/index.js +0 -11282
  863. package/appPackages/_master/node_modules/@budibase/materialdesign-components/dist/index.js.map +0 -1
  864. package/appPackages/_master/node_modules/@budibase/materialdesign-components/package.json +0 -50
  865. package/appPackages/_master/node_modules/@budibase/standard-components/README.md +0 -33
  866. package/appPackages/_master/node_modules/@budibase/standard-components/components.json +0 -239
  867. package/appPackages/_master/node_modules/@budibase/standard-components/dist/generators.js +0 -198
  868. package/appPackages/_master/node_modules/@budibase/standard-components/dist/index.js +0 -3460
  869. package/appPackages/_master/node_modules/@budibase/standard-components/dist/index.js.map +0 -1
  870. package/appPackages/_master/node_modules/@budibase/standard-components/package.json +0 -38
  871. package/appPackages/_master/package-lock.json +0 -247
  872. package/appPackages/_master/package.json +0 -14
  873. package/appPackages/_master/pages/main/page.json +0 -199
  874. package/appPackages/_master/pages/main/screens/Apps List.json +0 -131
  875. package/appPackages/_master/pages/main/screens/Manage App.json +0 -292
  876. package/appPackages/_master/pages/main/screens/New App.json +0 -410
  877. package/appPackages/_master/pages/main/screens/New Instance.json +0 -227
  878. package/appPackages/_master/pages/unauthenticated/page.json +0 -83
  879. package/appPackages/_master/plugins.js +0 -3
  880. package/appPackages/_master/public/_shared/budibase-logo.png +0 -0
  881. package/appPackages/_master/public/main/budibase-client.js +0 -25115
  882. package/appPackages/_master/public/main/budibase-client.js.map +0 -1
  883. package/appPackages/_master/public/main/index.html +0 -48
  884. package/appPackages/_master/public/main/index.js +0 -3397
  885. package/appPackages/_master/public/main/index.js.map +0 -1
  886. package/appPackages/_master/public/unauthenticated/budibase-client.js +0 -25115
  887. package/appPackages/_master/public/unauthenticated/budibase-client.js.map +0 -1
  888. package/appPackages/_master/public/unauthenticated/index.html +0 -40
  889. package/appPackages/_master/public/unauthenticated/index.js +0 -3397
  890. package/appPackages/_master/public/unauthenticated/index.js.map +0 -1
  891. package/appPackages/_master/yarn.lock +0 -13
  892. package/builder/__app.html +0 -22
  893. package/builder/assets/budibase-emblem-white.svg +0 -29
  894. package/builder/assets/budibase-logo-only.png +0 -0
  895. package/builder/assets/budibase-logo-white.png +0 -0
  896. package/builder/assets/budibase-logo.png +0 -0
  897. package/builder/assets/javascript-logo.svg +0 -1
  898. package/builder/assets/roboto-v20-latin-ext_latin-300.woff +0 -0
  899. package/builder/assets/roboto-v20-latin-ext_latin-300.woff2 +0 -0
  900. package/builder/assets/roboto-v20-latin-ext_latin-500.woff +0 -0
  901. package/builder/assets/roboto-v20-latin-ext_latin-500.woff2 +0 -0
  902. package/builder/assets/roboto-v20-latin-ext_latin-700.woff +0 -0
  903. package/builder/assets/roboto-v20-latin-ext_latin-700.woff2 +0 -0
  904. package/builder/assets/roboto-v20-latin-ext_latin-900.woff +0 -0
  905. package/builder/assets/roboto-v20-latin-ext_latin-900.woff2 +0 -0
  906. package/builder/assets/roboto-v20-latin-ext_latin-regular.woff +0 -0
  907. package/builder/assets/roboto-v20-latin-ext_latin-regular.woff2 +0 -0
  908. package/builder/budibase-client.esm.mjs +0 -24948
  909. package/builder/budibase.css +0 -120
  910. package/builder/bundle.css +0 -70
  911. package/builder/bundle.css.map +0 -146
  912. package/builder/bundle.js +0 -99294
  913. package/builder/bundle.js.map +0 -1
  914. package/builder/codemirror.css +0 -349
  915. package/builder/favicon.png +0 -0
  916. package/builder/flatpickr.css +0 -784
  917. package/builder/fonts.css +0 -47
  918. package/builder/global.css +0 -111
  919. package/builder/monokai.css +0 -41
  920. package/builder/uikit.min.css +0 -1
  921. package/config.contributors.js +0 -13
  922. package/config.dev.js +0 -13
  923. package/config.sample.js +0 -33
  924. package/index.js +0 -24
  925. package/initialise/buildAppContext.js +0 -11
  926. package/initialise/createInstanceDb.js +0 -37
  927. package/initialise/createMasterDb.js +0 -34
  928. package/initialise/initialiseBudibase.js +0 -1
  929. package/initialise/initialiseRuntimePackages.js +0 -42
  930. package/middleware/routeHandlers/aggregatesPost.js +0 -12
  931. package/middleware/routeHandlers/appDefault.js +0 -21
  932. package/middleware/routeHandlers/authenticate.js +0 -15
  933. package/middleware/routeHandlers/changeMyPassword.js +0 -9
  934. package/middleware/routeHandlers/createTemporaryAccess.js +0 -17
  935. package/middleware/routeHandlers/createUser.js +0 -10
  936. package/middleware/routeHandlers/deleteRecord.js +0 -9
  937. package/middleware/routeHandlers/disableUser.js +0 -11
  938. package/middleware/routeHandlers/enableUser.js +0 -6
  939. package/middleware/routeHandlers/executeAction.js +0 -9
  940. package/middleware/routeHandlers/getAccessLevels.js +0 -6
  941. package/middleware/routeHandlers/getRecord.js +0 -15
  942. package/middleware/routeHandlers/getUsers.js +0 -6
  943. package/middleware/routeHandlers/helpers.js +0 -15
  944. package/middleware/routeHandlers/index.js +0 -45
  945. package/middleware/routeHandlers/listRecordsGet.js +0 -8
  946. package/middleware/routeHandlers/listRecordsPost.js +0 -12
  947. package/middleware/routeHandlers/lookupField.js +0 -14
  948. package/middleware/routeHandlers/postFiles.js +0 -13
  949. package/middleware/routeHandlers/saveAppHierarchy.js +0 -6
  950. package/middleware/routeHandlers/saveRecord.js +0 -6
  951. package/middleware/routeHandlers/setPasswordFromTemporaryCode.js +0 -20
  952. package/middleware/routeHandlers/upgradeData.js +0 -11
  953. package/middleware/routers.js +0 -330
  954. package/middleware/session.js +0 -24
  955. package/utilities/budibaseApi.js +0 -84
  956. package/utilities/builder/buildPage.js +0 -164
  957. package/utilities/builder/componentLibraryInfo.js +0 -77
  958. package/utilities/builder/convertCssToFiles.js +0 -43
  959. package/utilities/builder/deleteCodeMeta.js +0 -9
  960. package/utilities/builder/getPages.js +0 -20
  961. package/utilities/builder/index.js +0 -165
  962. package/utilities/builder/index.template.html +0 -44
  963. package/utilities/builder/listScreens.js +0 -48
  964. package/utilities/builder/publicPath.js +0 -3
  965. package/utilities/builder/saveBackend.js +0 -28
  966. package/utilities/constructHierarchy.js +0 -8
  967. package/utilities/createAppPackage.js +0 -101
  968. package/utilities/databaseManager.js +0 -4
  969. package/utilities/datastore.js +0 -2
  970. package/utilities/exceptions.js +0 -16
  971. package/utilities/injectedPlugins/createUser.js +0 -19
  972. package/utilities/injectedPlugins/disableUser.js +0 -3
  973. package/utilities/injectedPlugins/enableUser.js +0 -3
  974. package/utilities/injectedPlugins/index.js +0 -76
  975. package/utilities/masterAppInternal.js +0 -384
  976. package/utilities/runtimePackages.js +0 -34
  977. package/utilities/targzAppPackage.js +0 -119
@@ -1,3460 +0,0 @@
1
- function noop() { }
2
- function run(fn) {
3
- return fn();
4
- }
5
- function blank_object() {
6
- return Object.create(null);
7
- }
8
- function run_all(fns) {
9
- fns.forEach(run);
10
- }
11
- function is_function(thing) {
12
- return typeof thing === 'function';
13
- }
14
- function safe_not_equal(a, b) {
15
- return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function');
16
- }
17
- function null_to_empty(value) {
18
- return value == null ? '' : value;
19
- }
20
-
21
- function append(target, node) {
22
- target.appendChild(node);
23
- }
24
- function insert(target, node, anchor) {
25
- target.insertBefore(node, anchor || null);
26
- }
27
- function detach(node) {
28
- node.parentNode.removeChild(node);
29
- }
30
- function element(name) {
31
- return document.createElement(name);
32
- }
33
- function svg_element(name) {
34
- return document.createElementNS('http://www.w3.org/2000/svg', name);
35
- }
36
- function text(data) {
37
- return document.createTextNode(data);
38
- }
39
- function space() {
40
- return text(' ');
41
- }
42
- function empty() {
43
- return text('');
44
- }
45
- function listen(node, event, handler, options) {
46
- node.addEventListener(event, handler, options);
47
- return () => node.removeEventListener(event, handler, options);
48
- }
49
- function attr(node, attribute, value) {
50
- if (value == null)
51
- node.removeAttribute(attribute);
52
- else
53
- node.setAttribute(attribute, value);
54
- }
55
- function children(element) {
56
- return Array.from(element.childNodes);
57
- }
58
- function claim_element(nodes, name, attributes, svg) {
59
- for (let i = 0; i < nodes.length; i += 1) {
60
- const node = nodes[i];
61
- if (node.nodeName === name) {
62
- for (let j = 0; j < node.attributes.length; j += 1) {
63
- const attribute = node.attributes[j];
64
- if (!attributes[attribute.name])
65
- node.removeAttribute(attribute.name);
66
- }
67
- return nodes.splice(i, 1)[0]; // TODO strip unwanted attributes
68
- }
69
- }
70
- return svg ? svg_element(name) : element(name);
71
- }
72
- function claim_text(nodes, data) {
73
- for (let i = 0; i < nodes.length; i += 1) {
74
- const node = nodes[i];
75
- if (node.nodeType === 3) {
76
- node.data = '' + data;
77
- return nodes.splice(i, 1)[0];
78
- }
79
- }
80
- return text(data);
81
- }
82
- function claim_space(nodes) {
83
- return claim_text(nodes, ' ');
84
- }
85
- function set_data(text, data) {
86
- data = '' + data;
87
- if (text.data !== data)
88
- text.data = data;
89
- }
90
- function set_input_value(input, value) {
91
- if (value != null || input.value) {
92
- input.value = value;
93
- }
94
- }
95
-
96
- let current_component;
97
- function set_current_component(component) {
98
- current_component = component;
99
- }
100
-
101
- const dirty_components = [];
102
- const binding_callbacks = [];
103
- const render_callbacks = [];
104
- const flush_callbacks = [];
105
- const resolved_promise = Promise.resolve();
106
- let update_scheduled = false;
107
- function schedule_update() {
108
- if (!update_scheduled) {
109
- update_scheduled = true;
110
- resolved_promise.then(flush);
111
- }
112
- }
113
- function add_render_callback(fn) {
114
- render_callbacks.push(fn);
115
- }
116
- function flush() {
117
- const seen_callbacks = new Set();
118
- do {
119
- // first, call beforeUpdate functions
120
- // and update components
121
- while (dirty_components.length) {
122
- const component = dirty_components.shift();
123
- set_current_component(component);
124
- update(component.$$);
125
- }
126
- while (binding_callbacks.length)
127
- binding_callbacks.pop()();
128
- // then, once components are updated, call
129
- // afterUpdate functions. This may cause
130
- // subsequent updates...
131
- for (let i = 0; i < render_callbacks.length; i += 1) {
132
- const callback = render_callbacks[i];
133
- if (!seen_callbacks.has(callback)) {
134
- callback();
135
- // ...so guard against infinite loops
136
- seen_callbacks.add(callback);
137
- }
138
- }
139
- render_callbacks.length = 0;
140
- } while (dirty_components.length);
141
- while (flush_callbacks.length) {
142
- flush_callbacks.pop()();
143
- }
144
- update_scheduled = false;
145
- }
146
- function update($$) {
147
- if ($$.fragment) {
148
- $$.update($$.dirty);
149
- run_all($$.before_update);
150
- $$.fragment.p($$.dirty, $$.ctx);
151
- $$.dirty = null;
152
- $$.after_update.forEach(add_render_callback);
153
- }
154
- }
155
- const outroing = new Set();
156
- function transition_in(block, local) {
157
- if (block && block.i) {
158
- outroing.delete(block);
159
- block.i(local);
160
- }
161
- }
162
- function mount_component(component, target, anchor) {
163
- const { fragment, on_mount, on_destroy, after_update } = component.$$;
164
- fragment.m(target, anchor);
165
- // onMount happens before the initial afterUpdate
166
- add_render_callback(() => {
167
- const new_on_destroy = on_mount.map(run).filter(is_function);
168
- if (on_destroy) {
169
- on_destroy.push(...new_on_destroy);
170
- }
171
- else {
172
- // Edge case - component was destroyed immediately,
173
- // most likely as a result of a binding initialising
174
- run_all(new_on_destroy);
175
- }
176
- component.$$.on_mount = [];
177
- });
178
- after_update.forEach(add_render_callback);
179
- }
180
- function destroy_component(component, detaching) {
181
- if (component.$$.fragment) {
182
- run_all(component.$$.on_destroy);
183
- component.$$.fragment.d(detaching);
184
- // TODO null out other refs, including component.$$ (but need to
185
- // preserve final state?)
186
- component.$$.on_destroy = component.$$.fragment = null;
187
- component.$$.ctx = {};
188
- }
189
- }
190
- function make_dirty(component, key) {
191
- if (!component.$$.dirty) {
192
- dirty_components.push(component);
193
- schedule_update();
194
- component.$$.dirty = blank_object();
195
- }
196
- component.$$.dirty[key] = true;
197
- }
198
- function init(component, options, instance, create_fragment, not_equal, prop_names) {
199
- const parent_component = current_component;
200
- set_current_component(component);
201
- const props = options.props || {};
202
- const $$ = component.$$ = {
203
- fragment: null,
204
- ctx: null,
205
- // state
206
- props: prop_names,
207
- update: noop,
208
- not_equal,
209
- bound: blank_object(),
210
- // lifecycle
211
- on_mount: [],
212
- on_destroy: [],
213
- before_update: [],
214
- after_update: [],
215
- context: new Map(parent_component ? parent_component.$$.context : []),
216
- // everything else
217
- callbacks: blank_object(),
218
- dirty: null
219
- };
220
- let ready = false;
221
- $$.ctx = instance
222
- ? instance(component, props, (key, ret, value = ret) => {
223
- if ($$.ctx && not_equal($$.ctx[key], $$.ctx[key] = value)) {
224
- if ($$.bound[key])
225
- $$.bound[key](value);
226
- if (ready)
227
- make_dirty(component, key);
228
- }
229
- return ret;
230
- })
231
- : props;
232
- $$.update();
233
- ready = true;
234
- run_all($$.before_update);
235
- $$.fragment = create_fragment($$.ctx);
236
- if (options.target) {
237
- if (options.hydrate) {
238
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
239
- $$.fragment.l(children(options.target));
240
- }
241
- else {
242
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
243
- $$.fragment.c();
244
- }
245
- if (options.intro)
246
- transition_in(component.$$.fragment);
247
- mount_component(component, options.target, options.anchor);
248
- flush();
249
- }
250
- set_current_component(parent_component);
251
- }
252
- let SvelteElement;
253
- if (typeof HTMLElement !== 'undefined') {
254
- SvelteElement = class extends HTMLElement {
255
- constructor() {
256
- super();
257
- this.attachShadow({ mode: 'open' });
258
- }
259
- connectedCallback() {
260
- // @ts-ignore todo: improve typings
261
- for (const key in this.$$.slotted) {
262
- // @ts-ignore todo: improve typings
263
- this.appendChild(this.$$.slotted[key]);
264
- }
265
- }
266
- attributeChangedCallback(attr, _oldValue, newValue) {
267
- this[attr] = newValue;
268
- }
269
- $destroy() {
270
- destroy_component(this, 1);
271
- this.$destroy = noop;
272
- }
273
- $on(type, callback) {
274
- // TODO should this delegate to addEventListener?
275
- const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));
276
- callbacks.push(callback);
277
- return () => {
278
- const index = callbacks.indexOf(callback);
279
- if (index !== -1)
280
- callbacks.splice(index, 1);
281
- };
282
- }
283
- $set() {
284
- // overridden by instance, if it has props
285
- }
286
- };
287
- }
288
- class SvelteComponent {
289
- $destroy() {
290
- destroy_component(this, 1);
291
- this.$destroy = noop;
292
- }
293
- $on(type, callback) {
294
- const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));
295
- callbacks.push(callback);
296
- return () => {
297
- const index = callbacks.indexOf(callback);
298
- if (index !== -1)
299
- callbacks.splice(index, 1);
300
- };
301
- }
302
- $set() {
303
- // overridden by instance, if it has props
304
- }
305
- }
306
-
307
- // https://github.com/kaisermann/svelte-css-vars
308
-
309
- const cssVars = (node, props) => {
310
- Object.entries(props).forEach(([key, value]) => {
311
- node.style.setProperty(`--${key}`, value);
312
- });
313
-
314
- return {
315
- update(new_props) {
316
- Object.entries(new_props).forEach(([key, value]) => {
317
- node.style.setProperty(`--${key}`, value);
318
- delete props[key];
319
- });
320
-
321
- Object.keys(props).forEach(name => node.style.removeProperty(`--${name}`));
322
- props = new_props;
323
- },
324
- }
325
- };
326
-
327
- const createClasses = classes => {
328
- let all = "";
329
- for (let cls in classes) {
330
- if (classes[cls]) {
331
- all = all + " " + cls;
332
- }
333
- }
334
- return all
335
- };
336
-
337
- /* src\Container.svelte generated by Svelte v3.12.1 */
338
-
339
- function add_css() {
340
- var style = element("style");
341
- style.id = 'svelte-hu2o2q-style';
342
- style.textContent = ".backgroundColor.svelte-hu2o2q{background-color:var(--backgroundColor)}.color.svelte-hu2o2q{color:var(--color)}.borderColor.svelte-hu2o2q{border-color:var(--borderColor)}.borderWidth.svelte-hu2o2q{border-width:var(--borderWidth)}.borderStyle.svelte-hu2o2q{border-style:var(--borderStyle)}";
343
- append(document.head, style);
344
- }
345
-
346
- // (98:31)
347
- function create_if_block_12(ctx) {
348
- var p, p_class_value, cssVars_action;
349
-
350
- return {
351
- c() {
352
- p = element("p");
353
- this.h();
354
- },
355
-
356
- l(nodes) {
357
- p = claim_element(nodes, "P", { class: true }, false);
358
- var p_nodes = children(p);
359
-
360
- p_nodes.forEach(detach);
361
- this.h();
362
- },
363
-
364
- h() {
365
- attr(p, "class", p_class_value = "" + null_to_empty(ctx.classes) + " svelte-hu2o2q");
366
- },
367
-
368
- m(target, anchor) {
369
- insert(target, p, anchor);
370
- ctx.p_binding(p);
371
- cssVars_action = cssVars.call(null, p, ctx.cssVariables) || {};
372
- },
373
-
374
- p(changed, ctx) {
375
- if ((changed.classes) && p_class_value !== (p_class_value = "" + null_to_empty(ctx.classes) + " svelte-hu2o2q")) {
376
- attr(p, "class", p_class_value);
377
- }
378
-
379
- if (typeof cssVars_action.update === 'function' && changed.cssVariables) {
380
- cssVars_action.update.call(null, ctx.cssVariables);
381
- }
382
- },
383
-
384
- d(detaching) {
385
- if (detaching) {
386
- detach(p);
387
- }
388
-
389
- ctx.p_binding(null);
390
- if (cssVars_action && typeof cssVars_action.destroy === 'function') cssVars_action.destroy();
391
- }
392
- };
393
- }
394
-
395
- // (93:32)
396
- function create_if_block_11(ctx) {
397
- var figcaption, figcaption_class_value, cssVars_action;
398
-
399
- return {
400
- c() {
401
- figcaption = element("figcaption");
402
- this.h();
403
- },
404
-
405
- l(nodes) {
406
- figcaption = claim_element(nodes, "FIGCAPTION", { class: true }, false);
407
- var figcaption_nodes = children(figcaption);
408
-
409
- figcaption_nodes.forEach(detach);
410
- this.h();
411
- },
412
-
413
- h() {
414
- attr(figcaption, "class", figcaption_class_value = "" + null_to_empty(ctx.classes) + " svelte-hu2o2q");
415
- },
416
-
417
- m(target, anchor) {
418
- insert(target, figcaption, anchor);
419
- ctx.figcaption_binding(figcaption);
420
- cssVars_action = cssVars.call(null, figcaption, ctx.cssVariables) || {};
421
- },
422
-
423
- p(changed, ctx) {
424
- if ((changed.classes) && figcaption_class_value !== (figcaption_class_value = "" + null_to_empty(ctx.classes) + " svelte-hu2o2q")) {
425
- attr(figcaption, "class", figcaption_class_value);
426
- }
427
-
428
- if (typeof cssVars_action.update === 'function' && changed.cssVariables) {
429
- cssVars_action.update.call(null, ctx.cssVariables);
430
- }
431
- },
432
-
433
- d(detaching) {
434
- if (detaching) {
435
- detach(figcaption);
436
- }
437
-
438
- ctx.figcaption_binding(null);
439
- if (cssVars_action && typeof cssVars_action.destroy === 'function') cssVars_action.destroy();
440
- }
441
- };
442
- }
443
-
444
- // (88:28)
445
- function create_if_block_10(ctx) {
446
- var figure, figure_class_value, cssVars_action;
447
-
448
- return {
449
- c() {
450
- figure = element("figure");
451
- this.h();
452
- },
453
-
454
- l(nodes) {
455
- figure = claim_element(nodes, "FIGURE", { class: true }, false);
456
- var figure_nodes = children(figure);
457
-
458
- figure_nodes.forEach(detach);
459
- this.h();
460
- },
461
-
462
- h() {
463
- attr(figure, "class", figure_class_value = "" + null_to_empty(ctx.classes) + " svelte-hu2o2q");
464
- },
465
-
466
- m(target, anchor) {
467
- insert(target, figure, anchor);
468
- ctx.figure_binding(figure);
469
- cssVars_action = cssVars.call(null, figure, ctx.cssVariables) || {};
470
- },
471
-
472
- p(changed, ctx) {
473
- if ((changed.classes) && figure_class_value !== (figure_class_value = "" + null_to_empty(ctx.classes) + " svelte-hu2o2q")) {
474
- attr(figure, "class", figure_class_value);
475
- }
476
-
477
- if (typeof cssVars_action.update === 'function' && changed.cssVariables) {
478
- cssVars_action.update.call(null, ctx.cssVariables);
479
- }
480
- },
481
-
482
- d(detaching) {
483
- if (detaching) {
484
- detach(figure);
485
- }
486
-
487
- ctx.figure_binding(null);
488
- if (cssVars_action && typeof cssVars_action.destroy === 'function') cssVars_action.destroy();
489
- }
490
- };
491
- }
492
-
493
- // (83:26)
494
- function create_if_block_9(ctx) {
495
- var mark, mark_class_value, cssVars_action;
496
-
497
- return {
498
- c() {
499
- mark = element("mark");
500
- this.h();
501
- },
502
-
503
- l(nodes) {
504
- mark = claim_element(nodes, "MARK", { class: true }, false);
505
- var mark_nodes = children(mark);
506
-
507
- mark_nodes.forEach(detach);
508
- this.h();
509
- },
510
-
511
- h() {
512
- attr(mark, "class", mark_class_value = "" + null_to_empty(ctx.classes) + " svelte-hu2o2q");
513
- },
514
-
515
- m(target, anchor) {
516
- insert(target, mark, anchor);
517
- ctx.mark_binding(mark);
518
- cssVars_action = cssVars.call(null, mark, ctx.cssVariables) || {};
519
- },
520
-
521
- p(changed, ctx) {
522
- if ((changed.classes) && mark_class_value !== (mark_class_value = "" + null_to_empty(ctx.classes) + " svelte-hu2o2q")) {
523
- attr(mark, "class", mark_class_value);
524
- }
525
-
526
- if (typeof cssVars_action.update === 'function' && changed.cssVariables) {
527
- cssVars_action.update.call(null, ctx.cssVariables);
528
- }
529
- },
530
-
531
- d(detaching) {
532
- if (detaching) {
533
- detach(mark);
534
- }
535
-
536
- ctx.mark_binding(null);
537
- if (cssVars_action && typeof cssVars_action.destroy === 'function') cssVars_action.destroy();
538
- }
539
- };
540
- }
541
-
542
- // (78:25)
543
- function create_if_block_8(ctx) {
544
- var nav, nav_class_value, cssVars_action;
545
-
546
- return {
547
- c() {
548
- nav = element("nav");
549
- this.h();
550
- },
551
-
552
- l(nodes) {
553
- nav = claim_element(nodes, "NAV", { class: true }, false);
554
- var nav_nodes = children(nav);
555
-
556
- nav_nodes.forEach(detach);
557
- this.h();
558
- },
559
-
560
- h() {
561
- attr(nav, "class", nav_class_value = "" + null_to_empty(ctx.classes) + " svelte-hu2o2q");
562
- },
563
-
564
- m(target, anchor) {
565
- insert(target, nav, anchor);
566
- ctx.nav_binding(nav);
567
- cssVars_action = cssVars.call(null, nav, ctx.cssVariables) || {};
568
- },
569
-
570
- p(changed, ctx) {
571
- if ((changed.classes) && nav_class_value !== (nav_class_value = "" + null_to_empty(ctx.classes) + " svelte-hu2o2q")) {
572
- attr(nav, "class", nav_class_value);
573
- }
574
-
575
- if (typeof cssVars_action.update === 'function' && changed.cssVariables) {
576
- cssVars_action.update.call(null, ctx.cssVariables);
577
- }
578
- },
579
-
580
- d(detaching) {
581
- if (detaching) {
582
- detach(nav);
583
- }
584
-
585
- ctx.nav_binding(null);
586
- if (cssVars_action && typeof cssVars_action.destroy === 'function') cssVars_action.destroy();
587
- }
588
- };
589
- }
590
-
591
- // (73:29)
592
- function create_if_block_7(ctx) {
593
- var article, article_class_value, cssVars_action;
594
-
595
- return {
596
- c() {
597
- article = element("article");
598
- this.h();
599
- },
600
-
601
- l(nodes) {
602
- article = claim_element(nodes, "ARTICLE", { class: true }, false);
603
- var article_nodes = children(article);
604
-
605
- article_nodes.forEach(detach);
606
- this.h();
607
- },
608
-
609
- h() {
610
- attr(article, "class", article_class_value = "" + null_to_empty(ctx.classes) + " svelte-hu2o2q");
611
- },
612
-
613
- m(target, anchor) {
614
- insert(target, article, anchor);
615
- ctx.article_binding(article);
616
- cssVars_action = cssVars.call(null, article, ctx.cssVariables) || {};
617
- },
618
-
619
- p(changed, ctx) {
620
- if ((changed.classes) && article_class_value !== (article_class_value = "" + null_to_empty(ctx.classes) + " svelte-hu2o2q")) {
621
- attr(article, "class", article_class_value);
622
- }
623
-
624
- if (typeof cssVars_action.update === 'function' && changed.cssVariables) {
625
- cssVars_action.update.call(null, ctx.cssVariables);
626
- }
627
- },
628
-
629
- d(detaching) {
630
- if (detaching) {
631
- detach(article);
632
- }
633
-
634
- ctx.article_binding(null);
635
- if (cssVars_action && typeof cssVars_action.destroy === 'function') cssVars_action.destroy();
636
- }
637
- };
638
- }
639
-
640
- // (68:29)
641
- function create_if_block_6(ctx) {
642
- var details, details_class_value, cssVars_action;
643
-
644
- return {
645
- c() {
646
- details = element("details");
647
- this.h();
648
- },
649
-
650
- l(nodes) {
651
- details = claim_element(nodes, "DETAILS", { class: true }, false);
652
- var details_nodes = children(details);
653
-
654
- details_nodes.forEach(detach);
655
- this.h();
656
- },
657
-
658
- h() {
659
- attr(details, "class", details_class_value = "" + null_to_empty(ctx.classes) + " svelte-hu2o2q");
660
- },
661
-
662
- m(target, anchor) {
663
- insert(target, details, anchor);
664
- ctx.details_binding(details);
665
- cssVars_action = cssVars.call(null, details, ctx.cssVariables) || {};
666
- },
667
-
668
- p(changed, ctx) {
669
- if ((changed.classes) && details_class_value !== (details_class_value = "" + null_to_empty(ctx.classes) + " svelte-hu2o2q")) {
670
- attr(details, "class", details_class_value);
671
- }
672
-
673
- if (typeof cssVars_action.update === 'function' && changed.cssVariables) {
674
- cssVars_action.update.call(null, ctx.cssVariables);
675
- }
676
- },
677
-
678
- d(detaching) {
679
- if (detaching) {
680
- detach(details);
681
- }
682
-
683
- ctx.details_binding(null);
684
- if (cssVars_action && typeof cssVars_action.destroy === 'function') cssVars_action.destroy();
685
- }
686
- };
687
- }
688
-
689
- // (63:29)
690
- function create_if_block_5(ctx) {
691
- var summary, summary_class_value, cssVars_action;
692
-
693
- return {
694
- c() {
695
- summary = element("summary");
696
- this.h();
697
- },
698
-
699
- l(nodes) {
700
- summary = claim_element(nodes, "SUMMARY", { class: true }, false);
701
- var summary_nodes = children(summary);
702
-
703
- summary_nodes.forEach(detach);
704
- this.h();
705
- },
706
-
707
- h() {
708
- attr(summary, "class", summary_class_value = "" + null_to_empty(ctx.classes) + " svelte-hu2o2q");
709
- },
710
-
711
- m(target, anchor) {
712
- insert(target, summary, anchor);
713
- ctx.summary_binding(summary);
714
- cssVars_action = cssVars.call(null, summary, ctx.cssVariables) || {};
715
- },
716
-
717
- p(changed, ctx) {
718
- if ((changed.classes) && summary_class_value !== (summary_class_value = "" + null_to_empty(ctx.classes) + " svelte-hu2o2q")) {
719
- attr(summary, "class", summary_class_value);
720
- }
721
-
722
- if (typeof cssVars_action.update === 'function' && changed.cssVariables) {
723
- cssVars_action.update.call(null, ctx.cssVariables);
724
- }
725
- },
726
-
727
- d(detaching) {
728
- if (detaching) {
729
- detach(summary);
730
- }
731
-
732
- ctx.summary_binding(null);
733
- if (cssVars_action && typeof cssVars_action.destroy === 'function') cssVars_action.destroy();
734
- }
735
- };
736
- }
737
-
738
- // (58:27)
739
- function create_if_block_4(ctx) {
740
- var aside, aside_class_value, cssVars_action;
741
-
742
- return {
743
- c() {
744
- aside = element("aside");
745
- this.h();
746
- },
747
-
748
- l(nodes) {
749
- aside = claim_element(nodes, "ASIDE", { class: true }, false);
750
- var aside_nodes = children(aside);
751
-
752
- aside_nodes.forEach(detach);
753
- this.h();
754
- },
755
-
756
- h() {
757
- attr(aside, "class", aside_class_value = "" + null_to_empty(ctx.classes) + " svelte-hu2o2q");
758
- },
759
-
760
- m(target, anchor) {
761
- insert(target, aside, anchor);
762
- ctx.aside_binding(aside);
763
- cssVars_action = cssVars.call(null, aside, ctx.cssVariables) || {};
764
- },
765
-
766
- p(changed, ctx) {
767
- if ((changed.classes) && aside_class_value !== (aside_class_value = "" + null_to_empty(ctx.classes) + " svelte-hu2o2q")) {
768
- attr(aside, "class", aside_class_value);
769
- }
770
-
771
- if (typeof cssVars_action.update === 'function' && changed.cssVariables) {
772
- cssVars_action.update.call(null, ctx.cssVariables);
773
- }
774
- },
775
-
776
- d(detaching) {
777
- if (detaching) {
778
- detach(aside);
779
- }
780
-
781
- ctx.aside_binding(null);
782
- if (cssVars_action && typeof cssVars_action.destroy === 'function') cssVars_action.destroy();
783
- }
784
- };
785
- }
786
-
787
- // (53:28)
788
- function create_if_block_3(ctx) {
789
- var footer, footer_class_value, cssVars_action;
790
-
791
- return {
792
- c() {
793
- footer = element("footer");
794
- this.h();
795
- },
796
-
797
- l(nodes) {
798
- footer = claim_element(nodes, "FOOTER", { class: true }, false);
799
- var footer_nodes = children(footer);
800
-
801
- footer_nodes.forEach(detach);
802
- this.h();
803
- },
804
-
805
- h() {
806
- attr(footer, "class", footer_class_value = "" + null_to_empty(ctx.classes) + " svelte-hu2o2q");
807
- },
808
-
809
- m(target, anchor) {
810
- insert(target, footer, anchor);
811
- ctx.footer_binding(footer);
812
- cssVars_action = cssVars.call(null, footer, ctx.cssVariables) || {};
813
- },
814
-
815
- p(changed, ctx) {
816
- if ((changed.classes) && footer_class_value !== (footer_class_value = "" + null_to_empty(ctx.classes) + " svelte-hu2o2q")) {
817
- attr(footer, "class", footer_class_value);
818
- }
819
-
820
- if (typeof cssVars_action.update === 'function' && changed.cssVariables) {
821
- cssVars_action.update.call(null, ctx.cssVariables);
822
- }
823
- },
824
-
825
- d(detaching) {
826
- if (detaching) {
827
- detach(footer);
828
- }
829
-
830
- ctx.footer_binding(null);
831
- if (cssVars_action && typeof cssVars_action.destroy === 'function') cssVars_action.destroy();
832
- }
833
- };
834
- }
835
-
836
- // (48:26)
837
- function create_if_block_2(ctx) {
838
- var main, main_class_value, cssVars_action;
839
-
840
- return {
841
- c() {
842
- main = element("main");
843
- this.h();
844
- },
845
-
846
- l(nodes) {
847
- main = claim_element(nodes, "MAIN", { class: true }, false);
848
- var main_nodes = children(main);
849
-
850
- main_nodes.forEach(detach);
851
- this.h();
852
- },
853
-
854
- h() {
855
- attr(main, "class", main_class_value = "" + null_to_empty(ctx.classes) + " svelte-hu2o2q");
856
- },
857
-
858
- m(target, anchor) {
859
- insert(target, main, anchor);
860
- ctx.main_binding(main);
861
- cssVars_action = cssVars.call(null, main, ctx.cssVariables) || {};
862
- },
863
-
864
- p(changed, ctx) {
865
- if ((changed.classes) && main_class_value !== (main_class_value = "" + null_to_empty(ctx.classes) + " svelte-hu2o2q")) {
866
- attr(main, "class", main_class_value);
867
- }
868
-
869
- if (typeof cssVars_action.update === 'function' && changed.cssVariables) {
870
- cssVars_action.update.call(null, ctx.cssVariables);
871
- }
872
- },
873
-
874
- d(detaching) {
875
- if (detaching) {
876
- detach(main);
877
- }
878
-
879
- ctx.main_binding(null);
880
- if (cssVars_action && typeof cssVars_action.destroy === 'function') cssVars_action.destroy();
881
- }
882
- };
883
- }
884
-
885
- // (43:28)
886
- function create_if_block_1(ctx) {
887
- var header, header_class_value, cssVars_action;
888
-
889
- return {
890
- c() {
891
- header = element("header");
892
- this.h();
893
- },
894
-
895
- l(nodes) {
896
- header = claim_element(nodes, "HEADER", { class: true }, false);
897
- var header_nodes = children(header);
898
-
899
- header_nodes.forEach(detach);
900
- this.h();
901
- },
902
-
903
- h() {
904
- attr(header, "class", header_class_value = "" + null_to_empty(ctx.classes) + " svelte-hu2o2q");
905
- },
906
-
907
- m(target, anchor) {
908
- insert(target, header, anchor);
909
- ctx.header_binding(header);
910
- cssVars_action = cssVars.call(null, header, ctx.cssVariables) || {};
911
- },
912
-
913
- p(changed, ctx) {
914
- if ((changed.classes) && header_class_value !== (header_class_value = "" + null_to_empty(ctx.classes) + " svelte-hu2o2q")) {
915
- attr(header, "class", header_class_value);
916
- }
917
-
918
- if (typeof cssVars_action.update === 'function' && changed.cssVariables) {
919
- cssVars_action.update.call(null, ctx.cssVariables);
920
- }
921
- },
922
-
923
- d(detaching) {
924
- if (detaching) {
925
- detach(header);
926
- }
927
-
928
- ctx.header_binding(null);
929
- if (cssVars_action && typeof cssVars_action.destroy === 'function') cssVars_action.destroy();
930
- }
931
- };
932
- }
933
-
934
- // (38:0) {#if type === 'div'}
935
- function create_if_block(ctx) {
936
- var div, div_class_value, cssVars_action;
937
-
938
- return {
939
- c() {
940
- div = element("div");
941
- this.h();
942
- },
943
-
944
- l(nodes) {
945
- div = claim_element(nodes, "DIV", { class: true }, false);
946
- var div_nodes = children(div);
947
-
948
- div_nodes.forEach(detach);
949
- this.h();
950
- },
951
-
952
- h() {
953
- attr(div, "class", div_class_value = "" + null_to_empty(ctx.classes) + " svelte-hu2o2q");
954
- },
955
-
956
- m(target, anchor) {
957
- insert(target, div, anchor);
958
- ctx.div_binding(div);
959
- cssVars_action = cssVars.call(null, div, ctx.cssVariables) || {};
960
- },
961
-
962
- p(changed, ctx) {
963
- if ((changed.classes) && div_class_value !== (div_class_value = "" + null_to_empty(ctx.classes) + " svelte-hu2o2q")) {
964
- attr(div, "class", div_class_value);
965
- }
966
-
967
- if (typeof cssVars_action.update === 'function' && changed.cssVariables) {
968
- cssVars_action.update.call(null, ctx.cssVariables);
969
- }
970
- },
971
-
972
- d(detaching) {
973
- if (detaching) {
974
- detach(div);
975
- }
976
-
977
- ctx.div_binding(null);
978
- if (cssVars_action && typeof cssVars_action.destroy === 'function') cssVars_action.destroy();
979
- }
980
- };
981
- }
982
-
983
- function create_fragment(ctx) {
984
- var if_block_anchor;
985
-
986
- function select_block_type(changed, ctx) {
987
- if (ctx.type === 'div') return create_if_block;
988
- if (ctx.type === 'header') return create_if_block_1;
989
- if (ctx.type === 'main') return create_if_block_2;
990
- if (ctx.type === 'footer') return create_if_block_3;
991
- if (ctx.type === 'aside') return create_if_block_4;
992
- if (ctx.type === 'summary') return create_if_block_5;
993
- if (ctx.type === 'details') return create_if_block_6;
994
- if (ctx.type === 'article') return create_if_block_7;
995
- if (ctx.type === 'nav') return create_if_block_8;
996
- if (ctx.type === 'mark') return create_if_block_9;
997
- if (ctx.type === 'figure') return create_if_block_10;
998
- if (ctx.type === 'figcaption') return create_if_block_11;
999
- if (ctx.type === 'paragraph') return create_if_block_12;
1000
- }
1001
-
1002
- var current_block_type = select_block_type(null, ctx);
1003
- var if_block = current_block_type && current_block_type(ctx);
1004
-
1005
- return {
1006
- c() {
1007
- if (if_block) if_block.c();
1008
- if_block_anchor = empty();
1009
- },
1010
-
1011
- l(nodes) {
1012
- if (if_block) if_block.l(nodes);
1013
- if_block_anchor = empty();
1014
- },
1015
-
1016
- m(target, anchor) {
1017
- if (if_block) if_block.m(target, anchor);
1018
- insert(target, if_block_anchor, anchor);
1019
- },
1020
-
1021
- p(changed, ctx) {
1022
- if (current_block_type === (current_block_type = select_block_type(changed, ctx)) && if_block) {
1023
- if_block.p(changed, ctx);
1024
- } else {
1025
- if (if_block) if_block.d(1);
1026
- if_block = current_block_type && current_block_type(ctx);
1027
- if (if_block) {
1028
- if_block.c();
1029
- if_block.m(if_block_anchor.parentNode, if_block_anchor);
1030
- }
1031
- }
1032
- },
1033
-
1034
- i: noop,
1035
- o: noop,
1036
-
1037
- d(detaching) {
1038
- if (if_block) if_block.d(detaching);
1039
-
1040
- if (detaching) {
1041
- detach(if_block_anchor);
1042
- }
1043
- }
1044
- };
1045
- }
1046
-
1047
- function instance($$self, $$props, $$invalidate) {
1048
- let { className = "", onLoad, type, backgroundColor, color, borderWidth, borderColor, borderStyle, _bb } = $$props;
1049
-
1050
- let containerElement;
1051
- let hasLoaded;
1052
-
1053
- function div_binding($$value) {
1054
- binding_callbacks[$$value ? 'unshift' : 'push'](() => {
1055
- $$invalidate('containerElement', containerElement = $$value);
1056
- });
1057
- }
1058
-
1059
- function header_binding($$value) {
1060
- binding_callbacks[$$value ? 'unshift' : 'push'](() => {
1061
- $$invalidate('containerElement', containerElement = $$value);
1062
- });
1063
- }
1064
-
1065
- function main_binding($$value) {
1066
- binding_callbacks[$$value ? 'unshift' : 'push'](() => {
1067
- $$invalidate('containerElement', containerElement = $$value);
1068
- });
1069
- }
1070
-
1071
- function footer_binding($$value) {
1072
- binding_callbacks[$$value ? 'unshift' : 'push'](() => {
1073
- $$invalidate('containerElement', containerElement = $$value);
1074
- });
1075
- }
1076
-
1077
- function aside_binding($$value) {
1078
- binding_callbacks[$$value ? 'unshift' : 'push'](() => {
1079
- $$invalidate('containerElement', containerElement = $$value);
1080
- });
1081
- }
1082
-
1083
- function summary_binding($$value) {
1084
- binding_callbacks[$$value ? 'unshift' : 'push'](() => {
1085
- $$invalidate('containerElement', containerElement = $$value);
1086
- });
1087
- }
1088
-
1089
- function details_binding($$value) {
1090
- binding_callbacks[$$value ? 'unshift' : 'push'](() => {
1091
- $$invalidate('containerElement', containerElement = $$value);
1092
- });
1093
- }
1094
-
1095
- function article_binding($$value) {
1096
- binding_callbacks[$$value ? 'unshift' : 'push'](() => {
1097
- $$invalidate('containerElement', containerElement = $$value);
1098
- });
1099
- }
1100
-
1101
- function nav_binding($$value) {
1102
- binding_callbacks[$$value ? 'unshift' : 'push'](() => {
1103
- $$invalidate('containerElement', containerElement = $$value);
1104
- });
1105
- }
1106
-
1107
- function mark_binding($$value) {
1108
- binding_callbacks[$$value ? 'unshift' : 'push'](() => {
1109
- $$invalidate('containerElement', containerElement = $$value);
1110
- });
1111
- }
1112
-
1113
- function figure_binding($$value) {
1114
- binding_callbacks[$$value ? 'unshift' : 'push'](() => {
1115
- $$invalidate('containerElement', containerElement = $$value);
1116
- });
1117
- }
1118
-
1119
- function figcaption_binding($$value) {
1120
- binding_callbacks[$$value ? 'unshift' : 'push'](() => {
1121
- $$invalidate('containerElement', containerElement = $$value);
1122
- });
1123
- }
1124
-
1125
- function p_binding($$value) {
1126
- binding_callbacks[$$value ? 'unshift' : 'push'](() => {
1127
- $$invalidate('containerElement', containerElement = $$value);
1128
- });
1129
- }
1130
-
1131
- $$self.$set = $$props => {
1132
- if ('className' in $$props) $$invalidate('className', className = $$props.className);
1133
- if ('onLoad' in $$props) $$invalidate('onLoad', onLoad = $$props.onLoad);
1134
- if ('type' in $$props) $$invalidate('type', type = $$props.type);
1135
- if ('backgroundColor' in $$props) $$invalidate('backgroundColor', backgroundColor = $$props.backgroundColor);
1136
- if ('color' in $$props) $$invalidate('color', color = $$props.color);
1137
- if ('borderWidth' in $$props) $$invalidate('borderWidth', borderWidth = $$props.borderWidth);
1138
- if ('borderColor' in $$props) $$invalidate('borderColor', borderColor = $$props.borderColor);
1139
- if ('borderStyle' in $$props) $$invalidate('borderStyle', borderStyle = $$props.borderStyle);
1140
- if ('_bb' in $$props) $$invalidate('_bb', _bb = $$props._bb);
1141
- };
1142
-
1143
- let cssVariables, classes;
1144
-
1145
- $$self.$$.update = ($$dirty = { backgroundColor: 1, color: 1, borderWidth: 1, borderColor: 1, borderStyle: 1, cssVariables: 1, className: 1, containerElement: 1, _bb: 1, hasLoaded: 1, onLoad: 1 }) => {
1146
- if ($$dirty.backgroundColor || $$dirty.color || $$dirty.borderWidth || $$dirty.borderColor || $$dirty.borderStyle) { $$invalidate('cssVariables', cssVariables = {
1147
- backgroundColor,
1148
- color,
1149
- borderWidth,
1150
- borderColor,
1151
- borderStyle,
1152
- }); }
1153
- if ($$dirty.cssVariables || $$dirty.className) { $$invalidate('classes', classes = `${createClasses(cssVariables)} ${className}`); }
1154
- if ($$dirty.containerElement || $$dirty._bb || $$dirty.hasLoaded || $$dirty.onLoad) { {
1155
- if (containerElement) {
1156
- _bb.attachChildren(containerElement);
1157
- if (!hasLoaded) {
1158
- _bb.call(onLoad);
1159
- $$invalidate('hasLoaded', hasLoaded = true);
1160
- }
1161
- }
1162
- } }
1163
- };
1164
-
1165
- return {
1166
- className,
1167
- onLoad,
1168
- type,
1169
- backgroundColor,
1170
- color,
1171
- borderWidth,
1172
- borderColor,
1173
- borderStyle,
1174
- _bb,
1175
- containerElement,
1176
- cssVariables,
1177
- classes,
1178
- div_binding,
1179
- header_binding,
1180
- main_binding,
1181
- footer_binding,
1182
- aside_binding,
1183
- summary_binding,
1184
- details_binding,
1185
- article_binding,
1186
- nav_binding,
1187
- mark_binding,
1188
- figure_binding,
1189
- figcaption_binding,
1190
- p_binding
1191
- };
1192
- }
1193
-
1194
- class Container extends SvelteComponent {
1195
- constructor(options) {
1196
- super();
1197
- if (!document.getElementById("svelte-hu2o2q-style")) add_css();
1198
- init(this, options, instance, create_fragment, safe_not_equal, ["className", "onLoad", "type", "backgroundColor", "color", "borderWidth", "borderColor", "borderStyle", "_bb"]);
1199
- }
1200
- }
1201
-
1202
- const buildStyle = styles => {
1203
- let str = "";
1204
- for (let s in styles) {
1205
- if (styles[s]) {
1206
- str += `${s}: ${styles[s]}; `;
1207
- }
1208
- }
1209
- return str
1210
- };
1211
-
1212
- /* src\Text.svelte generated by Svelte v3.12.1 */
1213
-
1214
- // (53:0) {:else}
1215
- function create_else_block(ctx) {
1216
- var t;
1217
-
1218
- return {
1219
- c() {
1220
- t = text(ctx.text);
1221
- },
1222
-
1223
- l(nodes) {
1224
- t = claim_text(nodes, ctx.text);
1225
- },
1226
-
1227
- m(target, anchor) {
1228
- insert(target, t, anchor);
1229
- },
1230
-
1231
- p(changed, ctx) {
1232
- if (changed.text) {
1233
- set_data(t, ctx.text);
1234
- }
1235
- },
1236
-
1237
- d(detaching) {
1238
- if (detaching) {
1239
- detach(t);
1240
- }
1241
- }
1242
- };
1243
- }
1244
-
1245
- // (51:25)
1246
- function create_if_block_10$1(ctx) {
1247
- var sup, t;
1248
-
1249
- return {
1250
- c() {
1251
- sup = element("sup");
1252
- t = text(ctx.text);
1253
- this.h();
1254
- },
1255
-
1256
- l(nodes) {
1257
- sup = claim_element(nodes, "SUP", { class: true, style: true }, false);
1258
- var sup_nodes = children(sup);
1259
-
1260
- t = claim_text(sup_nodes, ctx.text);
1261
- sup_nodes.forEach(detach);
1262
- this.h();
1263
- },
1264
-
1265
- h() {
1266
- attr(sup, "class", ctx.className);
1267
- attr(sup, "style", ctx.style);
1268
- },
1269
-
1270
- m(target, anchor) {
1271
- insert(target, sup, anchor);
1272
- append(sup, t);
1273
- },
1274
-
1275
- p(changed, ctx) {
1276
- if (changed.text) {
1277
- set_data(t, ctx.text);
1278
- }
1279
-
1280
- if (changed.className) {
1281
- attr(sup, "class", ctx.className);
1282
- }
1283
-
1284
- if (changed.style) {
1285
- attr(sup, "style", ctx.style);
1286
- }
1287
- },
1288
-
1289
- d(detaching) {
1290
- if (detaching) {
1291
- detach(sup);
1292
- }
1293
- }
1294
- };
1295
- }
1296
-
1297
- // (49:25)
1298
- function create_if_block_9$1(ctx) {
1299
- var sub, t;
1300
-
1301
- return {
1302
- c() {
1303
- sub = element("sub");
1304
- t = text(ctx.text);
1305
- this.h();
1306
- },
1307
-
1308
- l(nodes) {
1309
- sub = claim_element(nodes, "SUB", { class: true, style: true }, false);
1310
- var sub_nodes = children(sub);
1311
-
1312
- t = claim_text(sub_nodes, ctx.text);
1313
- sub_nodes.forEach(detach);
1314
- this.h();
1315
- },
1316
-
1317
- h() {
1318
- attr(sub, "class", ctx.className);
1319
- attr(sub, "style", ctx.style);
1320
- },
1321
-
1322
- m(target, anchor) {
1323
- insert(target, sub, anchor);
1324
- append(sub, t);
1325
- },
1326
-
1327
- p(changed, ctx) {
1328
- if (changed.text) {
1329
- set_data(t, ctx.text);
1330
- }
1331
-
1332
- if (changed.className) {
1333
- attr(sub, "class", ctx.className);
1334
- }
1335
-
1336
- if (changed.style) {
1337
- attr(sub, "style", ctx.style);
1338
- }
1339
- },
1340
-
1341
- d(detaching) {
1342
- if (detaching) {
1343
- detach(sub);
1344
- }
1345
- }
1346
- };
1347
- }
1348
-
1349
- // (47:25)
1350
- function create_if_block_8$1(ctx) {
1351
- var ins, t;
1352
-
1353
- return {
1354
- c() {
1355
- ins = element("ins");
1356
- t = text(ctx.text);
1357
- this.h();
1358
- },
1359
-
1360
- l(nodes) {
1361
- ins = claim_element(nodes, "INS", { class: true, style: true }, false);
1362
- var ins_nodes = children(ins);
1363
-
1364
- t = claim_text(ins_nodes, ctx.text);
1365
- ins_nodes.forEach(detach);
1366
- this.h();
1367
- },
1368
-
1369
- h() {
1370
- attr(ins, "class", ctx.className);
1371
- attr(ins, "style", ctx.style);
1372
- },
1373
-
1374
- m(target, anchor) {
1375
- insert(target, ins, anchor);
1376
- append(ins, t);
1377
- },
1378
-
1379
- p(changed, ctx) {
1380
- if (changed.text) {
1381
- set_data(t, ctx.text);
1382
- }
1383
-
1384
- if (changed.className) {
1385
- attr(ins, "class", ctx.className);
1386
- }
1387
-
1388
- if (changed.style) {
1389
- attr(ins, "style", ctx.style);
1390
- }
1391
- },
1392
-
1393
- d(detaching) {
1394
- if (detaching) {
1395
- detach(ins);
1396
- }
1397
- }
1398
- };
1399
- }
1400
-
1401
- // (45:25)
1402
- function create_if_block_7$1(ctx) {
1403
- var del, t;
1404
-
1405
- return {
1406
- c() {
1407
- del = element("del");
1408
- t = text(ctx.text);
1409
- this.h();
1410
- },
1411
-
1412
- l(nodes) {
1413
- del = claim_element(nodes, "DEL", { class: true, style: true }, false);
1414
- var del_nodes = children(del);
1415
-
1416
- t = claim_text(del_nodes, ctx.text);
1417
- del_nodes.forEach(detach);
1418
- this.h();
1419
- },
1420
-
1421
- h() {
1422
- attr(del, "class", ctx.className);
1423
- attr(del, "style", ctx.style);
1424
- },
1425
-
1426
- m(target, anchor) {
1427
- insert(target, del, anchor);
1428
- append(del, t);
1429
- },
1430
-
1431
- p(changed, ctx) {
1432
- if (changed.text) {
1433
- set_data(t, ctx.text);
1434
- }
1435
-
1436
- if (changed.className) {
1437
- attr(del, "class", ctx.className);
1438
- }
1439
-
1440
- if (changed.style) {
1441
- attr(del, "style", ctx.style);
1442
- }
1443
- },
1444
-
1445
- d(detaching) {
1446
- if (detaching) {
1447
- detach(del);
1448
- }
1449
- }
1450
- };
1451
- }
1452
-
1453
- // (43:27)
1454
- function create_if_block_6$1(ctx) {
1455
- var small, t;
1456
-
1457
- return {
1458
- c() {
1459
- small = element("small");
1460
- t = text(ctx.text);
1461
- this.h();
1462
- },
1463
-
1464
- l(nodes) {
1465
- small = claim_element(nodes, "SMALL", { class: true, style: true }, false);
1466
- var small_nodes = children(small);
1467
-
1468
- t = claim_text(small_nodes, ctx.text);
1469
- small_nodes.forEach(detach);
1470
- this.h();
1471
- },
1472
-
1473
- h() {
1474
- attr(small, "class", ctx.className);
1475
- attr(small, "style", ctx.style);
1476
- },
1477
-
1478
- m(target, anchor) {
1479
- insert(target, small, anchor);
1480
- append(small, t);
1481
- },
1482
-
1483
- p(changed, ctx) {
1484
- if (changed.text) {
1485
- set_data(t, ctx.text);
1486
- }
1487
-
1488
- if (changed.className) {
1489
- attr(small, "class", ctx.className);
1490
- }
1491
-
1492
- if (changed.style) {
1493
- attr(small, "style", ctx.style);
1494
- }
1495
- },
1496
-
1497
- d(detaching) {
1498
- if (detaching) {
1499
- detach(small);
1500
- }
1501
- }
1502
- };
1503
- }
1504
-
1505
- // (41:26)
1506
- function create_if_block_5$1(ctx) {
1507
- var mark, t;
1508
-
1509
- return {
1510
- c() {
1511
- mark = element("mark");
1512
- t = text(ctx.text);
1513
- this.h();
1514
- },
1515
-
1516
- l(nodes) {
1517
- mark = claim_element(nodes, "MARK", { class: true, style: true }, false);
1518
- var mark_nodes = children(mark);
1519
-
1520
- t = claim_text(mark_nodes, ctx.text);
1521
- mark_nodes.forEach(detach);
1522
- this.h();
1523
- },
1524
-
1525
- h() {
1526
- attr(mark, "class", ctx.className);
1527
- attr(mark, "style", ctx.style);
1528
- },
1529
-
1530
- m(target, anchor) {
1531
- insert(target, mark, anchor);
1532
- append(mark, t);
1533
- },
1534
-
1535
- p(changed, ctx) {
1536
- if (changed.text) {
1537
- set_data(t, ctx.text);
1538
- }
1539
-
1540
- if (changed.className) {
1541
- attr(mark, "class", ctx.className);
1542
- }
1543
-
1544
- if (changed.style) {
1545
- attr(mark, "style", ctx.style);
1546
- }
1547
- },
1548
-
1549
- d(detaching) {
1550
- if (detaching) {
1551
- detach(mark);
1552
- }
1553
- }
1554
- };
1555
- }
1556
-
1557
- // (39:24)
1558
- function create_if_block_4$1(ctx) {
1559
- var em, t;
1560
-
1561
- return {
1562
- c() {
1563
- em = element("em");
1564
- t = text(ctx.text);
1565
- this.h();
1566
- },
1567
-
1568
- l(nodes) {
1569
- em = claim_element(nodes, "EM", { class: true, style: true }, false);
1570
- var em_nodes = children(em);
1571
-
1572
- t = claim_text(em_nodes, ctx.text);
1573
- em_nodes.forEach(detach);
1574
- this.h();
1575
- },
1576
-
1577
- h() {
1578
- attr(em, "class", ctx.className);
1579
- attr(em, "style", ctx.style);
1580
- },
1581
-
1582
- m(target, anchor) {
1583
- insert(target, em, anchor);
1584
- append(em, t);
1585
- },
1586
-
1587
- p(changed, ctx) {
1588
- if (changed.text) {
1589
- set_data(t, ctx.text);
1590
- }
1591
-
1592
- if (changed.className) {
1593
- attr(em, "class", ctx.className);
1594
- }
1595
-
1596
- if (changed.style) {
1597
- attr(em, "style", ctx.style);
1598
- }
1599
- },
1600
-
1601
- d(detaching) {
1602
- if (detaching) {
1603
- detach(em);
1604
- }
1605
- }
1606
- };
1607
- }
1608
-
1609
- // (37:23)
1610
- function create_if_block_3$1(ctx) {
1611
- var i, t;
1612
-
1613
- return {
1614
- c() {
1615
- i = element("i");
1616
- t = text(ctx.text);
1617
- this.h();
1618
- },
1619
-
1620
- l(nodes) {
1621
- i = claim_element(nodes, "I", { class: true, style: true }, false);
1622
- var i_nodes = children(i);
1623
-
1624
- t = claim_text(i_nodes, ctx.text);
1625
- i_nodes.forEach(detach);
1626
- this.h();
1627
- },
1628
-
1629
- h() {
1630
- attr(i, "class", ctx.className);
1631
- attr(i, "style", ctx.style);
1632
- },
1633
-
1634
- m(target, anchor) {
1635
- insert(target, i, anchor);
1636
- append(i, t);
1637
- },
1638
-
1639
- p(changed, ctx) {
1640
- if (changed.text) {
1641
- set_data(t, ctx.text);
1642
- }
1643
-
1644
- if (changed.className) {
1645
- attr(i, "class", ctx.className);
1646
- }
1647
-
1648
- if (changed.style) {
1649
- attr(i, "style", ctx.style);
1650
- }
1651
- },
1652
-
1653
- d(detaching) {
1654
- if (detaching) {
1655
- detach(i);
1656
- }
1657
- }
1658
- };
1659
- }
1660
-
1661
- // (35:28)
1662
- function create_if_block_2$1(ctx) {
1663
- var strong, t;
1664
-
1665
- return {
1666
- c() {
1667
- strong = element("strong");
1668
- t = text(ctx.text);
1669
- this.h();
1670
- },
1671
-
1672
- l(nodes) {
1673
- strong = claim_element(nodes, "STRONG", { class: true, style: true }, false);
1674
- var strong_nodes = children(strong);
1675
-
1676
- t = claim_text(strong_nodes, ctx.text);
1677
- strong_nodes.forEach(detach);
1678
- this.h();
1679
- },
1680
-
1681
- h() {
1682
- attr(strong, "class", ctx.className);
1683
- attr(strong, "style", ctx.style);
1684
- },
1685
-
1686
- m(target, anchor) {
1687
- insert(target, strong, anchor);
1688
- append(strong, t);
1689
- },
1690
-
1691
- p(changed, ctx) {
1692
- if (changed.text) {
1693
- set_data(t, ctx.text);
1694
- }
1695
-
1696
- if (changed.className) {
1697
- attr(strong, "class", ctx.className);
1698
- }
1699
-
1700
- if (changed.style) {
1701
- attr(strong, "style", ctx.style);
1702
- }
1703
- },
1704
-
1705
- d(detaching) {
1706
- if (detaching) {
1707
- detach(strong);
1708
- }
1709
- }
1710
- };
1711
- }
1712
-
1713
- // (33:23)
1714
- function create_if_block_1$1(ctx) {
1715
- var b, t;
1716
-
1717
- return {
1718
- c() {
1719
- b = element("b");
1720
- t = text(ctx.text);
1721
- this.h();
1722
- },
1723
-
1724
- l(nodes) {
1725
- b = claim_element(nodes, "B", { class: true, style: true }, false);
1726
- var b_nodes = children(b);
1727
-
1728
- t = claim_text(b_nodes, ctx.text);
1729
- b_nodes.forEach(detach);
1730
- this.h();
1731
- },
1732
-
1733
- h() {
1734
- attr(b, "class", ctx.className);
1735
- attr(b, "style", ctx.style);
1736
- },
1737
-
1738
- m(target, anchor) {
1739
- insert(target, b, anchor);
1740
- append(b, t);
1741
- },
1742
-
1743
- p(changed, ctx) {
1744
- if (changed.text) {
1745
- set_data(t, ctx.text);
1746
- }
1747
-
1748
- if (changed.className) {
1749
- attr(b, "class", ctx.className);
1750
- }
1751
-
1752
- if (changed.style) {
1753
- attr(b, "style", ctx.style);
1754
- }
1755
- },
1756
-
1757
- d(detaching) {
1758
- if (detaching) {
1759
- detach(b);
1760
- }
1761
- }
1762
- };
1763
- }
1764
-
1765
- // (31:0) {#if isTag('none')}
1766
- function create_if_block$1(ctx) {
1767
- var span, t;
1768
-
1769
- return {
1770
- c() {
1771
- span = element("span");
1772
- t = text(ctx.text);
1773
- },
1774
-
1775
- l(nodes) {
1776
- span = claim_element(nodes, "SPAN", {}, false);
1777
- var span_nodes = children(span);
1778
-
1779
- t = claim_text(span_nodes, ctx.text);
1780
- span_nodes.forEach(detach);
1781
- },
1782
-
1783
- m(target, anchor) {
1784
- insert(target, span, anchor);
1785
- append(span, t);
1786
- },
1787
-
1788
- p(changed, ctx) {
1789
- if (changed.text) {
1790
- set_data(t, ctx.text);
1791
- }
1792
- },
1793
-
1794
- d(detaching) {
1795
- if (detaching) {
1796
- detach(span);
1797
- }
1798
- }
1799
- };
1800
- }
1801
-
1802
- function create_fragment$1(ctx) {
1803
- var if_block_anchor;
1804
-
1805
- function select_block_type(changed, ctx) {
1806
- if (ctx.isTag('none')) return create_if_block$1;
1807
- if (ctx.isTag('<b>')) return create_if_block_1$1;
1808
- if (ctx.isTag('<strong>')) return create_if_block_2$1;
1809
- if (ctx.isTag('<i>')) return create_if_block_3$1;
1810
- if (ctx.isTag('<em>')) return create_if_block_4$1;
1811
- if (ctx.isTag('<mark>')) return create_if_block_5$1;
1812
- if (ctx.isTag('<small>')) return create_if_block_6$1;
1813
- if (ctx.isTag('<del>')) return create_if_block_7$1;
1814
- if (ctx.isTag('<ins>')) return create_if_block_8$1;
1815
- if (ctx.isTag('<sub>')) return create_if_block_9$1;
1816
- if (ctx.isTag('<sup>')) return create_if_block_10$1;
1817
- return create_else_block;
1818
- }
1819
-
1820
- var current_block_type = select_block_type(null, ctx);
1821
- var if_block = current_block_type(ctx);
1822
-
1823
- return {
1824
- c() {
1825
- if_block.c();
1826
- if_block_anchor = empty();
1827
- },
1828
-
1829
- l(nodes) {
1830
- if_block.l(nodes);
1831
- if_block_anchor = empty();
1832
- },
1833
-
1834
- m(target, anchor) {
1835
- if_block.m(target, anchor);
1836
- insert(target, if_block_anchor, anchor);
1837
- },
1838
-
1839
- p(changed, ctx) {
1840
- if_block.p(changed, ctx);
1841
- },
1842
-
1843
- i: noop,
1844
- o: noop,
1845
-
1846
- d(detaching) {
1847
- if_block.d(detaching);
1848
-
1849
- if (detaching) {
1850
- detach(if_block_anchor);
1851
- }
1852
- }
1853
- };
1854
- }
1855
-
1856
- function instance$1($$self, $$props, $$invalidate) {
1857
- let { text = "", className = "", formattingTag = "", font = "", textAlign = "", verticalAlign = "", color = "", _bb } = $$props;
1858
-
1859
- let style = "";
1860
-
1861
- const isTag = tag => (formattingTag || "").indexOf(tag) > -1;
1862
-
1863
- $$self.$set = $$props => {
1864
- if ('text' in $$props) $$invalidate('text', text = $$props.text);
1865
- if ('className' in $$props) $$invalidate('className', className = $$props.className);
1866
- if ('formattingTag' in $$props) $$invalidate('formattingTag', formattingTag = $$props.formattingTag);
1867
- if ('font' in $$props) $$invalidate('font', font = $$props.font);
1868
- if ('textAlign' in $$props) $$invalidate('textAlign', textAlign = $$props.textAlign);
1869
- if ('verticalAlign' in $$props) $$invalidate('verticalAlign', verticalAlign = $$props.verticalAlign);
1870
- if ('color' in $$props) $$invalidate('color', color = $$props.color);
1871
- if ('_bb' in $$props) $$invalidate('_bb', _bb = $$props._bb);
1872
- };
1873
-
1874
- $$self.$$.update = ($$dirty = { font: 1, verticalAlign: 1, color: 1, textAlign: 1 }) => {
1875
- if ($$dirty.font || $$dirty.verticalAlign || $$dirty.color || $$dirty.textAlign) { {
1876
- $$invalidate('style', style = buildStyle({
1877
- font,
1878
- verticalAlign,
1879
- color,
1880
- "text-align": textAlign,
1881
- "vertical-align": verticalAlign,
1882
- }));
1883
- } }
1884
- };
1885
-
1886
- return {
1887
- text,
1888
- className,
1889
- formattingTag,
1890
- font,
1891
- textAlign,
1892
- verticalAlign,
1893
- color,
1894
- _bb,
1895
- style,
1896
- isTag
1897
- };
1898
- }
1899
-
1900
- class Text extends SvelteComponent {
1901
- constructor(options) {
1902
- super();
1903
- init(this, options, instance$1, create_fragment$1, safe_not_equal, ["text", "className", "formattingTag", "font", "textAlign", "verticalAlign", "color", "_bb"]);
1904
- }
1905
- }
1906
-
1907
- /* src\Heading.svelte generated by Svelte v3.12.1 */
1908
-
1909
- // (21:24)
1910
- function create_if_block_5$2(ctx) {
1911
- var h6;
1912
-
1913
- return {
1914
- c() {
1915
- h6 = element("h6");
1916
- this.h();
1917
- },
1918
-
1919
- l(nodes) {
1920
- h6 = claim_element(nodes, "H6", { class: true }, false);
1921
- var h6_nodes = children(h6);
1922
-
1923
- h6_nodes.forEach(detach);
1924
- this.h();
1925
- },
1926
-
1927
- h() {
1928
- attr(h6, "class", ctx.className);
1929
- },
1930
-
1931
- m(target, anchor) {
1932
- insert(target, h6, anchor);
1933
- ctx.h6_binding(h6);
1934
- },
1935
-
1936
- p(changed, ctx) {
1937
- if (changed.className) {
1938
- attr(h6, "class", ctx.className);
1939
- }
1940
- },
1941
-
1942
- d(detaching) {
1943
- if (detaching) {
1944
- detach(h6);
1945
- }
1946
-
1947
- ctx.h6_binding(null);
1948
- }
1949
- };
1950
- }
1951
-
1952
- // (19:24)
1953
- function create_if_block_4$2(ctx) {
1954
- var h5;
1955
-
1956
- return {
1957
- c() {
1958
- h5 = element("h5");
1959
- this.h();
1960
- },
1961
-
1962
- l(nodes) {
1963
- h5 = claim_element(nodes, "H5", { class: true }, false);
1964
- var h5_nodes = children(h5);
1965
-
1966
- h5_nodes.forEach(detach);
1967
- this.h();
1968
- },
1969
-
1970
- h() {
1971
- attr(h5, "class", ctx.className);
1972
- },
1973
-
1974
- m(target, anchor) {
1975
- insert(target, h5, anchor);
1976
- ctx.h5_binding(h5);
1977
- },
1978
-
1979
- p(changed, ctx) {
1980
- if (changed.className) {
1981
- attr(h5, "class", ctx.className);
1982
- }
1983
- },
1984
-
1985
- d(detaching) {
1986
- if (detaching) {
1987
- detach(h5);
1988
- }
1989
-
1990
- ctx.h5_binding(null);
1991
- }
1992
- };
1993
- }
1994
-
1995
- // (17:24)
1996
- function create_if_block_3$2(ctx) {
1997
- var h4;
1998
-
1999
- return {
2000
- c() {
2001
- h4 = element("h4");
2002
- this.h();
2003
- },
2004
-
2005
- l(nodes) {
2006
- h4 = claim_element(nodes, "H4", { class: true }, false);
2007
- var h4_nodes = children(h4);
2008
-
2009
- h4_nodes.forEach(detach);
2010
- this.h();
2011
- },
2012
-
2013
- h() {
2014
- attr(h4, "class", ctx.className);
2015
- },
2016
-
2017
- m(target, anchor) {
2018
- insert(target, h4, anchor);
2019
- ctx.h4_binding(h4);
2020
- },
2021
-
2022
- p(changed, ctx) {
2023
- if (changed.className) {
2024
- attr(h4, "class", ctx.className);
2025
- }
2026
- },
2027
-
2028
- d(detaching) {
2029
- if (detaching) {
2030
- detach(h4);
2031
- }
2032
-
2033
- ctx.h4_binding(null);
2034
- }
2035
- };
2036
- }
2037
-
2038
- // (15:24)
2039
- function create_if_block_2$2(ctx) {
2040
- var h3;
2041
-
2042
- return {
2043
- c() {
2044
- h3 = element("h3");
2045
- this.h();
2046
- },
2047
-
2048
- l(nodes) {
2049
- h3 = claim_element(nodes, "H3", { class: true }, false);
2050
- var h3_nodes = children(h3);
2051
-
2052
- h3_nodes.forEach(detach);
2053
- this.h();
2054
- },
2055
-
2056
- h() {
2057
- attr(h3, "class", ctx.className);
2058
- },
2059
-
2060
- m(target, anchor) {
2061
- insert(target, h3, anchor);
2062
- ctx.h3_binding(h3);
2063
- },
2064
-
2065
- p(changed, ctx) {
2066
- if (changed.className) {
2067
- attr(h3, "class", ctx.className);
2068
- }
2069
- },
2070
-
2071
- d(detaching) {
2072
- if (detaching) {
2073
- detach(h3);
2074
- }
2075
-
2076
- ctx.h3_binding(null);
2077
- }
2078
- };
2079
- }
2080
-
2081
- // (13:24)
2082
- function create_if_block_1$2(ctx) {
2083
- var h2;
2084
-
2085
- return {
2086
- c() {
2087
- h2 = element("h2");
2088
- this.h();
2089
- },
2090
-
2091
- l(nodes) {
2092
- h2 = claim_element(nodes, "H2", { class: true }, false);
2093
- var h2_nodes = children(h2);
2094
-
2095
- h2_nodes.forEach(detach);
2096
- this.h();
2097
- },
2098
-
2099
- h() {
2100
- attr(h2, "class", ctx.className);
2101
- },
2102
-
2103
- m(target, anchor) {
2104
- insert(target, h2, anchor);
2105
- ctx.h2_binding(h2);
2106
- },
2107
-
2108
- p(changed, ctx) {
2109
- if (changed.className) {
2110
- attr(h2, "class", ctx.className);
2111
- }
2112
- },
2113
-
2114
- d(detaching) {
2115
- if (detaching) {
2116
- detach(h2);
2117
- }
2118
-
2119
- ctx.h2_binding(null);
2120
- }
2121
- };
2122
- }
2123
-
2124
- // (11:0) {#if type === 'h1'}
2125
- function create_if_block$2(ctx) {
2126
- var h1;
2127
-
2128
- return {
2129
- c() {
2130
- h1 = element("h1");
2131
- this.h();
2132
- },
2133
-
2134
- l(nodes) {
2135
- h1 = claim_element(nodes, "H1", { class: true }, false);
2136
- var h1_nodes = children(h1);
2137
-
2138
- h1_nodes.forEach(detach);
2139
- this.h();
2140
- },
2141
-
2142
- h() {
2143
- attr(h1, "class", ctx.className);
2144
- },
2145
-
2146
- m(target, anchor) {
2147
- insert(target, h1, anchor);
2148
- ctx.h1_binding(h1);
2149
- },
2150
-
2151
- p(changed, ctx) {
2152
- if (changed.className) {
2153
- attr(h1, "class", ctx.className);
2154
- }
2155
- },
2156
-
2157
- d(detaching) {
2158
- if (detaching) {
2159
- detach(h1);
2160
- }
2161
-
2162
- ctx.h1_binding(null);
2163
- }
2164
- };
2165
- }
2166
-
2167
- function create_fragment$2(ctx) {
2168
- var if_block_anchor;
2169
-
2170
- function select_block_type(changed, ctx) {
2171
- if (ctx.type === 'h1') return create_if_block$2;
2172
- if (ctx.type === 'h2') return create_if_block_1$2;
2173
- if (ctx.type === 'h3') return create_if_block_2$2;
2174
- if (ctx.type === 'h4') return create_if_block_3$2;
2175
- if (ctx.type === 'h5') return create_if_block_4$2;
2176
- if (ctx.type === 'h6') return create_if_block_5$2;
2177
- }
2178
-
2179
- var current_block_type = select_block_type(null, ctx);
2180
- var if_block = current_block_type && current_block_type(ctx);
2181
-
2182
- return {
2183
- c() {
2184
- if (if_block) if_block.c();
2185
- if_block_anchor = empty();
2186
- },
2187
-
2188
- l(nodes) {
2189
- if (if_block) if_block.l(nodes);
2190
- if_block_anchor = empty();
2191
- },
2192
-
2193
- m(target, anchor) {
2194
- if (if_block) if_block.m(target, anchor);
2195
- insert(target, if_block_anchor, anchor);
2196
- },
2197
-
2198
- p(changed, ctx) {
2199
- if (current_block_type === (current_block_type = select_block_type(changed, ctx)) && if_block) {
2200
- if_block.p(changed, ctx);
2201
- } else {
2202
- if (if_block) if_block.d(1);
2203
- if_block = current_block_type && current_block_type(ctx);
2204
- if (if_block) {
2205
- if_block.c();
2206
- if_block.m(if_block_anchor.parentNode, if_block_anchor);
2207
- }
2208
- }
2209
- },
2210
-
2211
- i: noop,
2212
- o: noop,
2213
-
2214
- d(detaching) {
2215
- if (if_block) if_block.d(detaching);
2216
-
2217
- if (detaching) {
2218
- detach(if_block_anchor);
2219
- }
2220
- }
2221
- };
2222
- }
2223
-
2224
- function instance$2($$self, $$props, $$invalidate) {
2225
- let { className = "", type, _bb } = $$props;
2226
-
2227
- let containerElement;
2228
-
2229
- function h1_binding($$value) {
2230
- binding_callbacks[$$value ? 'unshift' : 'push'](() => {
2231
- $$invalidate('containerElement', containerElement = $$value);
2232
- });
2233
- }
2234
-
2235
- function h2_binding($$value) {
2236
- binding_callbacks[$$value ? 'unshift' : 'push'](() => {
2237
- $$invalidate('containerElement', containerElement = $$value);
2238
- });
2239
- }
2240
-
2241
- function h3_binding($$value) {
2242
- binding_callbacks[$$value ? 'unshift' : 'push'](() => {
2243
- $$invalidate('containerElement', containerElement = $$value);
2244
- });
2245
- }
2246
-
2247
- function h4_binding($$value) {
2248
- binding_callbacks[$$value ? 'unshift' : 'push'](() => {
2249
- $$invalidate('containerElement', containerElement = $$value);
2250
- });
2251
- }
2252
-
2253
- function h5_binding($$value) {
2254
- binding_callbacks[$$value ? 'unshift' : 'push'](() => {
2255
- $$invalidate('containerElement', containerElement = $$value);
2256
- });
2257
- }
2258
-
2259
- function h6_binding($$value) {
2260
- binding_callbacks[$$value ? 'unshift' : 'push'](() => {
2261
- $$invalidate('containerElement', containerElement = $$value);
2262
- });
2263
- }
2264
-
2265
- $$self.$set = $$props => {
2266
- if ('className' in $$props) $$invalidate('className', className = $$props.className);
2267
- if ('type' in $$props) $$invalidate('type', type = $$props.type);
2268
- if ('_bb' in $$props) $$invalidate('_bb', _bb = $$props._bb);
2269
- };
2270
-
2271
- $$self.$$.update = ($$dirty = { containerElement: 1, _bb: 1 }) => {
2272
- if ($$dirty.containerElement || $$dirty._bb) { containerElement && _bb.attachChildren(containerElement); }
2273
- };
2274
-
2275
- return {
2276
- className,
2277
- type,
2278
- _bb,
2279
- containerElement,
2280
- h1_binding,
2281
- h2_binding,
2282
- h3_binding,
2283
- h4_binding,
2284
- h5_binding,
2285
- h6_binding
2286
- };
2287
- }
2288
-
2289
- class Heading extends SvelteComponent {
2290
- constructor(options) {
2291
- super();
2292
- init(this, options, instance$2, create_fragment$2, safe_not_equal, ["className", "type", "_bb"]);
2293
- }
2294
- }
2295
-
2296
- /* src\Input.svelte generated by Svelte v3.12.1 */
2297
-
2298
- function create_fragment$3(ctx) {
2299
- var input, dispose;
2300
-
2301
- return {
2302
- c() {
2303
- input = element("input");
2304
- this.h();
2305
- },
2306
-
2307
- l(nodes) {
2308
- input = claim_element(nodes, "INPUT", { class: true, type: true, value: true }, false);
2309
- var input_nodes = children(input);
2310
-
2311
- input_nodes.forEach(detach);
2312
- this.h();
2313
- },
2314
-
2315
- h() {
2316
- attr(input, "class", ctx.className);
2317
- attr(input, "type", ctx.type);
2318
- input.value = ctx.value;
2319
- dispose = listen(input, "change", ctx.onchange);
2320
- },
2321
-
2322
- m(target, anchor) {
2323
- insert(target, input, anchor);
2324
- },
2325
-
2326
- p(changed, ctx) {
2327
- if (changed.className) {
2328
- attr(input, "class", ctx.className);
2329
- }
2330
-
2331
- if (changed.type) {
2332
- attr(input, "type", ctx.type);
2333
- }
2334
-
2335
- if (changed.value) {
2336
- input.value = ctx.value;
2337
- }
2338
- },
2339
-
2340
- i: noop,
2341
- o: noop,
2342
-
2343
- d(detaching) {
2344
- if (detaching) {
2345
- detach(input);
2346
- }
2347
-
2348
- dispose();
2349
- }
2350
- };
2351
- }
2352
-
2353
- function instance$3($$self, $$props, $$invalidate) {
2354
- let { value = "", className = "", type = "text", _bb } = $$props;
2355
-
2356
- const onchange = ev => {
2357
- if (_bb) {
2358
- _bb.setStateFromBinding(_bb.props.value, ev.target.value);
2359
- }
2360
- };
2361
-
2362
- $$self.$set = $$props => {
2363
- if ('value' in $$props) $$invalidate('value', value = $$props.value);
2364
- if ('className' in $$props) $$invalidate('className', className = $$props.className);
2365
- if ('type' in $$props) $$invalidate('type', type = $$props.type);
2366
- if ('_bb' in $$props) $$invalidate('_bb', _bb = $$props._bb);
2367
- };
2368
-
2369
- return { value, className, type, _bb, onchange };
2370
- }
2371
-
2372
- class Input extends SvelteComponent {
2373
- constructor(options) {
2374
- super();
2375
- init(this, options, instance$3, create_fragment$3, safe_not_equal, ["value", "className", "type", "_bb"]);
2376
- }
2377
- }
2378
-
2379
- /* src\Select.svelte generated by Svelte v3.12.1 */
2380
-
2381
- function create_fragment$4(ctx) {
2382
- var select, select_value_value, dispose;
2383
-
2384
- return {
2385
- c() {
2386
- select = element("select");
2387
- this.h();
2388
- },
2389
-
2390
- l(nodes) {
2391
- select = claim_element(nodes, "SELECT", { class: true, value: true }, false);
2392
- var select_nodes = children(select);
2393
-
2394
- select_nodes.forEach(detach);
2395
- this.h();
2396
- },
2397
-
2398
- h() {
2399
- attr(select, "class", ctx.className);
2400
- dispose = listen(select, "change", ctx.onchange);
2401
- },
2402
-
2403
- m(target, anchor) {
2404
- insert(target, select, anchor);
2405
- ctx.select_binding(select);
2406
-
2407
- select_value_value = ctx.value;
2408
- for (var i = 0; i < select.options.length; i += 1) {
2409
- var option = select.options[i];
2410
-
2411
- if (option.__value === select_value_value) {
2412
- option.selected = true;
2413
- break;
2414
- }
2415
- }
2416
- },
2417
-
2418
- p(changed, ctx) {
2419
- if (changed.className) {
2420
- attr(select, "class", ctx.className);
2421
- }
2422
-
2423
- if ((changed.value) && select_value_value !== (select_value_value = ctx.value)) {
2424
- for (var i = 0; i < select.options.length; i += 1) {
2425
- var option = select.options[i];
2426
-
2427
- if (option.__value === select_value_value) {
2428
- option.selected = true;
2429
- break;
2430
- }
2431
- }
2432
- }
2433
- },
2434
-
2435
- i: noop,
2436
- o: noop,
2437
-
2438
- d(detaching) {
2439
- if (detaching) {
2440
- detach(select);
2441
- }
2442
-
2443
- ctx.select_binding(null);
2444
- dispose();
2445
- }
2446
- };
2447
- }
2448
-
2449
- function instance$4($$self, $$props, $$invalidate) {
2450
- let { value = "", className = "", _bb } = $$props;
2451
- let selectElement;
2452
-
2453
- const onchange = ev => {
2454
- if (_bb) {
2455
- _bb.setStateFromBinding(_bb.props.value, ev.target.value);
2456
- }
2457
- };
2458
-
2459
- function select_binding($$value) {
2460
- binding_callbacks[$$value ? 'unshift' : 'push'](() => {
2461
- $$invalidate('selectElement', selectElement = $$value);
2462
- });
2463
- }
2464
-
2465
- $$self.$set = $$props => {
2466
- if ('value' in $$props) $$invalidate('value', value = $$props.value);
2467
- if ('className' in $$props) $$invalidate('className', className = $$props.className);
2468
- if ('_bb' in $$props) $$invalidate('_bb', _bb = $$props._bb);
2469
- };
2470
-
2471
- $$self.$$.update = ($$dirty = { selectElement: 1, _bb: 1 }) => {
2472
- if ($$dirty.selectElement || $$dirty._bb) { selectElement && _bb.attachChildren(selectElement); }
2473
- };
2474
-
2475
- return {
2476
- value,
2477
- className,
2478
- _bb,
2479
- selectElement,
2480
- onchange,
2481
- select_binding
2482
- };
2483
- }
2484
-
2485
- class Select extends SvelteComponent {
2486
- constructor(options) {
2487
- super();
2488
- init(this, options, instance$4, create_fragment$4, safe_not_equal, ["value", "className", "_bb"]);
2489
- }
2490
- }
2491
-
2492
- /* src\Option.svelte generated by Svelte v3.12.1 */
2493
-
2494
- function create_fragment$5(ctx) {
2495
- var option, t;
2496
-
2497
- return {
2498
- c() {
2499
- option = element("option");
2500
- t = text(ctx.actualText);
2501
- this.h();
2502
- },
2503
-
2504
- l(nodes) {
2505
- option = claim_element(nodes, "OPTION", { value: true }, false);
2506
- var option_nodes = children(option);
2507
-
2508
- t = claim_text(option_nodes, ctx.actualText);
2509
- option_nodes.forEach(detach);
2510
- this.h();
2511
- },
2512
-
2513
- h() {
2514
- option.__value = ctx.actualValue;
2515
- option.value = option.__value;
2516
- },
2517
-
2518
- m(target, anchor) {
2519
- insert(target, option, anchor);
2520
- append(option, t);
2521
- },
2522
-
2523
- p(changed, ctx) {
2524
- if (changed.actualText) {
2525
- set_data(t, ctx.actualText);
2526
- }
2527
-
2528
- if (changed.actualValue) {
2529
- option.__value = ctx.actualValue;
2530
- }
2531
-
2532
- option.value = option.__value;
2533
- },
2534
-
2535
- i: noop,
2536
- o: noop,
2537
-
2538
- d(detaching) {
2539
- if (detaching) {
2540
- detach(option);
2541
- }
2542
- }
2543
- };
2544
- }
2545
-
2546
- function instance$5($$self, $$props, $$invalidate) {
2547
- let { value = "", text = "", _bb } = $$props;
2548
-
2549
- let actualValue;
2550
- let actualText;
2551
-
2552
- $$self.$set = $$props => {
2553
- if ('value' in $$props) $$invalidate('value', value = $$props.value);
2554
- if ('text' in $$props) $$invalidate('text', text = $$props.text);
2555
- if ('_bb' in $$props) $$invalidate('_bb', _bb = $$props._bb);
2556
- };
2557
-
2558
- $$self.$$.update = ($$dirty = { value: 1, text: 1 }) => {
2559
- if ($$dirty.value || $$dirty.text) { $$invalidate('actualValue', actualValue = value || text || ""); }
2560
- if ($$dirty.text || $$dirty.value) { $$invalidate('actualText', actualText = text || value || ""); }
2561
- };
2562
-
2563
- return {
2564
- value,
2565
- text,
2566
- _bb,
2567
- actualValue,
2568
- actualText
2569
- };
2570
- }
2571
-
2572
- class Option extends SvelteComponent {
2573
- constructor(options) {
2574
- super();
2575
- init(this, options, instance$5, create_fragment$5, safe_not_equal, ["value", "text", "_bb"]);
2576
- }
2577
- }
2578
-
2579
- /* src\Button.svelte generated by Svelte v3.12.1 */
2580
-
2581
- function add_css$1() {
2582
- var style = element("style");
2583
- style.id = 'svelte-vmpdcw-style';
2584
- style.textContent = ".default.svelte-vmpdcw{font-family:inherit;font-size:inherit;padding:0.4em;margin:0 0 0.5em 0;box-sizing:border-box;border:1px solid #ccc;border-radius:2px;color:#333;background-color:#f4f4f4;outline:none}.default.svelte-vmpdcw:active{background-color:#ddd}.default.svelte-vmpdcw:focus{border-color:#666}.border.svelte-vmpdcw{border:var(--border)}.color.svelte-vmpdcw{color:var(--color)}.background.svelte-vmpdcw{background:var(--background)}.hoverBorder.svelte-vmpdcw:hover{border:var(--hoverBorder)}.hoverColor.svelte-vmpdcw:hover{color:var(--hoverColor)}.hoverBack.svelte-vmpdcw:hover{background:var(--hoverBackground)}";
2585
- append(document.head, style);
2586
- }
2587
-
2588
- // (67:2) {#if !_bb.props._children || _bb.props._children.length === 0}
2589
- function create_if_block$3(ctx) {
2590
- var t;
2591
-
2592
- return {
2593
- c() {
2594
- t = text(ctx.contentText);
2595
- },
2596
-
2597
- l(nodes) {
2598
- t = claim_text(nodes, ctx.contentText);
2599
- },
2600
-
2601
- m(target, anchor) {
2602
- insert(target, t, anchor);
2603
- },
2604
-
2605
- p(changed, ctx) {
2606
- if (changed.contentText) {
2607
- set_data(t, ctx.contentText);
2608
- }
2609
- },
2610
-
2611
- d(detaching) {
2612
- if (detaching) {
2613
- detach(t);
2614
- }
2615
- }
2616
- };
2617
- }
2618
-
2619
- function create_fragment$6(ctx) {
2620
- var button, button_class_value, button_disabled_value, cssVars_action, dispose;
2621
-
2622
- var if_block = (!ctx._bb.props._children || ctx._bb.props._children.length === 0) && create_if_block$3(ctx);
2623
-
2624
- return {
2625
- c() {
2626
- button = element("button");
2627
- if (if_block) if_block.c();
2628
- this.h();
2629
- },
2630
-
2631
- l(nodes) {
2632
- button = claim_element(nodes, "BUTTON", { class: true, disabled: true, style: true }, false);
2633
- var button_nodes = children(button);
2634
-
2635
- if (if_block) if_block.l(button_nodes);
2636
- button_nodes.forEach(detach);
2637
- this.h();
2638
- },
2639
-
2640
- h() {
2641
- attr(button, "class", button_class_value = "" + ctx.className + "\r\n " + ctx.customClasses + " svelte-vmpdcw");
2642
- button.disabled = button_disabled_value = ctx.disabled || false;
2643
- attr(button, "style", ctx.buttonStyles);
2644
- dispose = listen(button, "click", ctx.clickHandler);
2645
- },
2646
-
2647
- m(target, anchor) {
2648
- insert(target, button, anchor);
2649
- if (if_block) if_block.m(button, null);
2650
- ctx.button_binding(button);
2651
- cssVars_action = cssVars.call(null, button, ctx.cssVariables) || {};
2652
- },
2653
-
2654
- p(changed, ctx) {
2655
- if (!ctx._bb.props._children || ctx._bb.props._children.length === 0) {
2656
- if (if_block) {
2657
- if_block.p(changed, ctx);
2658
- } else {
2659
- if_block = create_if_block$3(ctx);
2660
- if_block.c();
2661
- if_block.m(button, null);
2662
- }
2663
- } else if (if_block) {
2664
- if_block.d(1);
2665
- if_block = null;
2666
- }
2667
-
2668
- if ((changed.className || changed.customClasses) && button_class_value !== (button_class_value = "" + ctx.className + "\r\n " + ctx.customClasses + " svelte-vmpdcw")) {
2669
- attr(button, "class", button_class_value);
2670
- }
2671
-
2672
- if ((changed.disabled) && button_disabled_value !== (button_disabled_value = ctx.disabled || false)) {
2673
- button.disabled = button_disabled_value;
2674
- }
2675
-
2676
- if (changed.buttonStyles) {
2677
- attr(button, "style", ctx.buttonStyles);
2678
- }
2679
-
2680
- if (typeof cssVars_action.update === 'function' && changed.cssVariables) {
2681
- cssVars_action.update.call(null, ctx.cssVariables);
2682
- }
2683
- },
2684
-
2685
- i: noop,
2686
- o: noop,
2687
-
2688
- d(detaching) {
2689
- if (detaching) {
2690
- detach(button);
2691
- }
2692
-
2693
- if (if_block) if_block.d();
2694
- ctx.button_binding(null);
2695
- if (cssVars_action && typeof cssVars_action.destroy === 'function') cssVars_action.destroy();
2696
- dispose();
2697
- }
2698
- };
2699
- }
2700
-
2701
- function instance$6($$self, $$props, $$invalidate) {
2702
-
2703
- let { className = "default", disabled = false, contentText, onClick, background, color, border, padding, hoverColor, hoverBackground, hoverBorder, _bb } = $$props;
2704
- let theButton;
2705
- let cssVariables;
2706
- let buttonStyles;
2707
-
2708
- let customClasses = "";
2709
-
2710
- const clickHandler = () => {
2711
- _bb.call(onClick);
2712
- };
2713
-
2714
- function button_binding($$value) {
2715
- binding_callbacks[$$value ? 'unshift' : 'push'](() => {
2716
- $$invalidate('theButton', theButton = $$value);
2717
- });
2718
- }
2719
-
2720
- $$self.$set = $$props => {
2721
- if ('className' in $$props) $$invalidate('className', className = $$props.className);
2722
- if ('disabled' in $$props) $$invalidate('disabled', disabled = $$props.disabled);
2723
- if ('contentText' in $$props) $$invalidate('contentText', contentText = $$props.contentText);
2724
- if ('onClick' in $$props) $$invalidate('onClick', onClick = $$props.onClick);
2725
- if ('background' in $$props) $$invalidate('background', background = $$props.background);
2726
- if ('color' in $$props) $$invalidate('color', color = $$props.color);
2727
- if ('border' in $$props) $$invalidate('border', border = $$props.border);
2728
- if ('padding' in $$props) $$invalidate('padding', padding = $$props.padding);
2729
- if ('hoverColor' in $$props) $$invalidate('hoverColor', hoverColor = $$props.hoverColor);
2730
- if ('hoverBackground' in $$props) $$invalidate('hoverBackground', hoverBackground = $$props.hoverBackground);
2731
- if ('hoverBorder' in $$props) $$invalidate('hoverBorder', hoverBorder = $$props.hoverBorder);
2732
- if ('_bb' in $$props) $$invalidate('_bb', _bb = $$props._bb);
2733
- };
2734
-
2735
- $$self.$$.update = ($$dirty = { _bb: 1, theButton: 1, hoverColor: 1, hoverBorder: 1, hoverBackground: 1, background: 1, color: 1, border: 1, padding: 1 }) => {
2736
- if ($$dirty._bb || $$dirty.theButton) { if (_bb.props._children && _bb.props._children.length > 0)
2737
- theButton && _bb.attachChildren(theButton); }
2738
- if ($$dirty.hoverColor || $$dirty.hoverBorder || $$dirty.hoverBackground || $$dirty.background || $$dirty.color || $$dirty.border || $$dirty.padding) { {
2739
- $$invalidate('cssVariables', cssVariables = {
2740
- hoverColor,
2741
- hoverBorder,
2742
- hoverBackground,
2743
- background,
2744
- color,
2745
- border,
2746
- });
2747
-
2748
- $$invalidate('buttonStyles', buttonStyles = buildStyle({
2749
- padding,
2750
- }));
2751
-
2752
- $$invalidate('customClasses', customClasses = createClasses({
2753
- hoverColor,
2754
- hoverBorder,
2755
- hoverBackground,
2756
- background,
2757
- border,
2758
- color,
2759
- }));
2760
- } }
2761
- };
2762
-
2763
- return {
2764
- className,
2765
- disabled,
2766
- contentText,
2767
- onClick,
2768
- background,
2769
- color,
2770
- border,
2771
- padding,
2772
- hoverColor,
2773
- hoverBackground,
2774
- hoverBorder,
2775
- _bb,
2776
- theButton,
2777
- cssVariables,
2778
- buttonStyles,
2779
- customClasses,
2780
- clickHandler,
2781
- button_binding
2782
- };
2783
- }
2784
-
2785
- class Button extends SvelteComponent {
2786
- constructor(options) {
2787
- super();
2788
- if (!document.getElementById("svelte-vmpdcw-style")) add_css$1();
2789
- init(this, options, instance$6, create_fragment$6, safe_not_equal, ["className", "disabled", "contentText", "onClick", "background", "color", "border", "padding", "hoverColor", "hoverBackground", "hoverBorder", "_bb"]);
2790
- }
2791
- }
2792
-
2793
- /* src\Login.svelte generated by Svelte v3.12.1 */
2794
-
2795
- function add_css$2() {
2796
- var style = element("style");
2797
- style.id = 'svelte-x36wrk-style';
2798
- style.textContent = ".root.svelte-x36wrk{height:100%;display:grid;grid-template-columns:[left] 1fr [middle] auto [right] 1fr;grid-template-rows:[top] 1fr [center] auto [bottom] 1fr}.content.svelte-x36wrk{grid-column-start:middle;grid-row-start:center;width:400px}.logo-container.svelte-x36wrk{margin-bottom:20px}.logo-container.svelte-x36wrk>img.svelte-x36wrk{max-width:100%}.login-button-container.svelte-x36wrk{text-align:right;margin-top:20px}.incorrect-details-panel.svelte-x36wrk{margin-top:30px;padding:10px;border-style:solid;border-width:1px;border-color:maroon;border-radius:1px;text-align:center;color:maroon;background-color:mistyrose}.form-root.svelte-x36wrk{display:grid;grid-template-columns:[label] auto [control] 1fr}.label.svelte-x36wrk{grid-column-start:label;padding:5px 10px;vertical-align:middle}.control.svelte-x36wrk{grid-column-start:control;padding:5px 10px}.default-input.svelte-x36wrk{font-family:inherit;font-size:inherit;padding:0.4em;margin:0 0 0.5em 0;box-sizing:border-box;border:1px solid #ccc;border-radius:2px;width:100%}.default-button.svelte-x36wrk{font-family:inherit;font-size:inherit;padding:0.4em;margin:0 0 0.5em 0;box-sizing:border-box;border:1px solid #ccc;border-radius:2px;color:#333;background-color:#f4f4f4;outline:none}.default-button.svelte-x36wrk:active{background-color:#ddd}.default-button.svelte-x36wrk:focus{border-color:#666}";
2799
- append(document.head, style);
2800
- }
2801
-
2802
- // (54:4) {#if _logo}
2803
- function create_if_block_1$3(ctx) {
2804
- var div, img;
2805
-
2806
- return {
2807
- c() {
2808
- div = element("div");
2809
- img = element("img");
2810
- this.h();
2811
- },
2812
-
2813
- l(nodes) {
2814
- div = claim_element(nodes, "DIV", { class: true }, false);
2815
- var div_nodes = children(div);
2816
-
2817
- img = claim_element(div_nodes, "IMG", { src: true, alt: true, class: true }, false);
2818
- var img_nodes = children(img);
2819
-
2820
- img_nodes.forEach(detach);
2821
- div_nodes.forEach(detach);
2822
- this.h();
2823
- },
2824
-
2825
- h() {
2826
- attr(img, "src", ctx._logo);
2827
- attr(img, "alt", "logo");
2828
- attr(img, "class", "svelte-x36wrk");
2829
- attr(div, "class", "logo-container svelte-x36wrk");
2830
- },
2831
-
2832
- m(target, anchor) {
2833
- insert(target, div, anchor);
2834
- append(div, img);
2835
- },
2836
-
2837
- p(changed, ctx) {
2838
- if (changed._logo) {
2839
- attr(img, "src", ctx._logo);
2840
- }
2841
- },
2842
-
2843
- d(detaching) {
2844
- if (detaching) {
2845
- detach(div);
2846
- }
2847
- }
2848
- };
2849
- }
2850
-
2851
- // (77:4) {#if incorrect}
2852
- function create_if_block$4(ctx) {
2853
- var div, t;
2854
-
2855
- return {
2856
- c() {
2857
- div = element("div");
2858
- t = text("Incorrect username or password");
2859
- this.h();
2860
- },
2861
-
2862
- l(nodes) {
2863
- div = claim_element(nodes, "DIV", { class: true }, false);
2864
- var div_nodes = children(div);
2865
-
2866
- t = claim_text(div_nodes, "Incorrect username or password");
2867
- div_nodes.forEach(detach);
2868
- this.h();
2869
- },
2870
-
2871
- h() {
2872
- attr(div, "class", "incorrect-details-panel svelte-x36wrk");
2873
- },
2874
-
2875
- m(target, anchor) {
2876
- insert(target, div, anchor);
2877
- append(div, t);
2878
- },
2879
-
2880
- d(detaching) {
2881
- if (detaching) {
2882
- detach(div);
2883
- }
2884
- }
2885
- };
2886
- }
2887
-
2888
- function create_fragment$7(ctx) {
2889
- var div7, div6, t0, div4, div0, t1, t2, div1, input0, input0_class_value, t3, div2, t4, t5, div3, input1, input1_class_value, t6, div5, button, t7, button_class_value, t8, dispose;
2890
-
2891
- var if_block0 = (ctx._logo) && create_if_block_1$3(ctx);
2892
-
2893
- var if_block1 = (ctx.incorrect) && create_if_block$4();
2894
-
2895
- return {
2896
- c() {
2897
- div7 = element("div");
2898
- div6 = element("div");
2899
- if (if_block0) if_block0.c();
2900
- t0 = space();
2901
- div4 = element("div");
2902
- div0 = element("div");
2903
- t1 = text(ctx.usernameLabel);
2904
- t2 = space();
2905
- div1 = element("div");
2906
- input0 = element("input");
2907
- t3 = space();
2908
- div2 = element("div");
2909
- t4 = text(ctx.passwordLabel);
2910
- t5 = space();
2911
- div3 = element("div");
2912
- input1 = element("input");
2913
- t6 = space();
2914
- div5 = element("div");
2915
- button = element("button");
2916
- t7 = text(ctx.loginButtonLabel);
2917
- t8 = space();
2918
- if (if_block1) if_block1.c();
2919
- this.h();
2920
- },
2921
-
2922
- l(nodes) {
2923
- div7 = claim_element(nodes, "DIV", { class: true }, false);
2924
- var div7_nodes = children(div7);
2925
-
2926
- div6 = claim_element(div7_nodes, "DIV", { class: true }, false);
2927
- var div6_nodes = children(div6);
2928
-
2929
- if (if_block0) if_block0.l(div6_nodes);
2930
- t0 = claim_space(div6_nodes);
2931
-
2932
- div4 = claim_element(div6_nodes, "DIV", { class: true }, false);
2933
- var div4_nodes = children(div4);
2934
-
2935
- div0 = claim_element(div4_nodes, "DIV", { class: true }, false);
2936
- var div0_nodes = children(div0);
2937
-
2938
- t1 = claim_text(div0_nodes, ctx.usernameLabel);
2939
- div0_nodes.forEach(detach);
2940
- t2 = claim_space(div4_nodes);
2941
-
2942
- div1 = claim_element(div4_nodes, "DIV", { class: true }, false);
2943
- var div1_nodes = children(div1);
2944
-
2945
- input0 = claim_element(div1_nodes, "INPUT", { type: true, class: true }, false);
2946
- var input0_nodes = children(input0);
2947
-
2948
- input0_nodes.forEach(detach);
2949
- div1_nodes.forEach(detach);
2950
- t3 = claim_space(div4_nodes);
2951
-
2952
- div2 = claim_element(div4_nodes, "DIV", { class: true }, false);
2953
- var div2_nodes = children(div2);
2954
-
2955
- t4 = claim_text(div2_nodes, ctx.passwordLabel);
2956
- div2_nodes.forEach(detach);
2957
- t5 = claim_space(div4_nodes);
2958
-
2959
- div3 = claim_element(div4_nodes, "DIV", { class: true }, false);
2960
- var div3_nodes = children(div3);
2961
-
2962
- input1 = claim_element(div3_nodes, "INPUT", { type: true, class: true }, false);
2963
- var input1_nodes = children(input1);
2964
-
2965
- input1_nodes.forEach(detach);
2966
- div3_nodes.forEach(detach);
2967
- div4_nodes.forEach(detach);
2968
- t6 = claim_space(div6_nodes);
2969
-
2970
- div5 = claim_element(div6_nodes, "DIV", { class: true }, false);
2971
- var div5_nodes = children(div5);
2972
-
2973
- button = claim_element(div5_nodes, "BUTTON", { disabled: true, class: true }, false);
2974
- var button_nodes = children(button);
2975
-
2976
- t7 = claim_text(button_nodes, ctx.loginButtonLabel);
2977
- button_nodes.forEach(detach);
2978
- div5_nodes.forEach(detach);
2979
- t8 = claim_space(div6_nodes);
2980
- if (if_block1) if_block1.l(div6_nodes);
2981
- div6_nodes.forEach(detach);
2982
- div7_nodes.forEach(detach);
2983
- this.h();
2984
- },
2985
-
2986
- h() {
2987
- attr(div0, "class", "label svelte-x36wrk");
2988
- attr(input0, "type", "text");
2989
- attr(input0, "class", input0_class_value = "" + null_to_empty(ctx._inputClass) + " svelte-x36wrk");
2990
- attr(div1, "class", "control svelte-x36wrk");
2991
- attr(div2, "class", "label svelte-x36wrk");
2992
- attr(input1, "type", "password");
2993
- attr(input1, "class", input1_class_value = "" + null_to_empty(ctx._inputClass) + " svelte-x36wrk");
2994
- attr(div3, "class", "control svelte-x36wrk");
2995
- attr(div4, "class", "form-root svelte-x36wrk");
2996
- button.disabled = ctx.busy;
2997
- attr(button, "class", button_class_value = "" + null_to_empty(ctx._buttonClass) + " svelte-x36wrk");
2998
- attr(div5, "class", "login-button-container svelte-x36wrk");
2999
- attr(div6, "class", "content svelte-x36wrk");
3000
- attr(div7, "class", "root svelte-x36wrk");
3001
-
3002
- dispose = [
3003
- listen(input0, "input", ctx.input0_input_handler),
3004
- listen(input1, "input", ctx.input1_input_handler),
3005
- listen(button, "click", ctx.login)
3006
- ];
3007
- },
3008
-
3009
- m(target, anchor) {
3010
- insert(target, div7, anchor);
3011
- append(div7, div6);
3012
- if (if_block0) if_block0.m(div6, null);
3013
- append(div6, t0);
3014
- append(div6, div4);
3015
- append(div4, div0);
3016
- append(div0, t1);
3017
- append(div4, t2);
3018
- append(div4, div1);
3019
- append(div1, input0);
3020
-
3021
- set_input_value(input0, ctx.username);
3022
-
3023
- append(div4, t3);
3024
- append(div4, div2);
3025
- append(div2, t4);
3026
- append(div4, t5);
3027
- append(div4, div3);
3028
- append(div3, input1);
3029
-
3030
- set_input_value(input1, ctx.password);
3031
-
3032
- append(div6, t6);
3033
- append(div6, div5);
3034
- append(div5, button);
3035
- append(button, t7);
3036
- append(div6, t8);
3037
- if (if_block1) if_block1.m(div6, null);
3038
- },
3039
-
3040
- p(changed, ctx) {
3041
- if (ctx._logo) {
3042
- if (if_block0) {
3043
- if_block0.p(changed, ctx);
3044
- } else {
3045
- if_block0 = create_if_block_1$3(ctx);
3046
- if_block0.c();
3047
- if_block0.m(div6, t0);
3048
- }
3049
- } else if (if_block0) {
3050
- if_block0.d(1);
3051
- if_block0 = null;
3052
- }
3053
-
3054
- if (changed.usernameLabel) {
3055
- set_data(t1, ctx.usernameLabel);
3056
- }
3057
-
3058
- if (changed.username && (input0.value !== ctx.username)) set_input_value(input0, ctx.username);
3059
-
3060
- if ((changed._inputClass) && input0_class_value !== (input0_class_value = "" + null_to_empty(ctx._inputClass) + " svelte-x36wrk")) {
3061
- attr(input0, "class", input0_class_value);
3062
- }
3063
-
3064
- if (changed.passwordLabel) {
3065
- set_data(t4, ctx.passwordLabel);
3066
- }
3067
-
3068
- if (changed.password && (input1.value !== ctx.password)) set_input_value(input1, ctx.password);
3069
-
3070
- if ((changed._inputClass) && input1_class_value !== (input1_class_value = "" + null_to_empty(ctx._inputClass) + " svelte-x36wrk")) {
3071
- attr(input1, "class", input1_class_value);
3072
- }
3073
-
3074
- if (changed.loginButtonLabel) {
3075
- set_data(t7, ctx.loginButtonLabel);
3076
- }
3077
-
3078
- if (changed.busy) {
3079
- button.disabled = ctx.busy;
3080
- }
3081
-
3082
- if ((changed._buttonClass) && button_class_value !== (button_class_value = "" + null_to_empty(ctx._buttonClass) + " svelte-x36wrk")) {
3083
- attr(button, "class", button_class_value);
3084
- }
3085
-
3086
- if (ctx.incorrect) {
3087
- if (!if_block1) {
3088
- if_block1 = create_if_block$4();
3089
- if_block1.c();
3090
- if_block1.m(div6, null);
3091
- }
3092
- } else if (if_block1) {
3093
- if_block1.d(1);
3094
- if_block1 = null;
3095
- }
3096
- },
3097
-
3098
- i: noop,
3099
- o: noop,
3100
-
3101
- d(detaching) {
3102
- if (detaching) {
3103
- detach(div7);
3104
- }
3105
-
3106
- if (if_block0) if_block0.d();
3107
- if (if_block1) if_block1.d();
3108
- run_all(dispose);
3109
- }
3110
- };
3111
- }
3112
-
3113
- function instance$7($$self, $$props, $$invalidate) {
3114
- let { usernameLabel = "Username", passwordLabel = "Password", loginButtonLabel = "Login", loginRedirect = "", logo = "", buttonClass = "", inputClass = "", _bb } = $$props;
3115
-
3116
- let username = "";
3117
- let password = "";
3118
- let busy = false;
3119
- let incorrect = false;
3120
- let _logo = "";
3121
- let _buttonClass = "";
3122
- let _inputClass = "";
3123
-
3124
- const login = () => {
3125
- $$invalidate('busy', busy = true);
3126
- _bb.api
3127
- .post("/api/authenticate", { username, password })
3128
- .then(r => {
3129
- $$invalidate('busy', busy = false);
3130
- if (r.status === 200) {
3131
- return r.json()
3132
- } else {
3133
- $$invalidate('incorrect', incorrect = true);
3134
- return
3135
- }
3136
- })
3137
- .then(user => {
3138
- if (user) {
3139
- localStorage.setItem("budibase:user", JSON.stringify(user));
3140
- location.reload();
3141
- }
3142
- });
3143
- };
3144
-
3145
- function input0_input_handler() {
3146
- username = this.value;
3147
- $$invalidate('username', username);
3148
- }
3149
-
3150
- function input1_input_handler() {
3151
- password = this.value;
3152
- $$invalidate('password', password);
3153
- }
3154
-
3155
- $$self.$set = $$props => {
3156
- if ('usernameLabel' in $$props) $$invalidate('usernameLabel', usernameLabel = $$props.usernameLabel);
3157
- if ('passwordLabel' in $$props) $$invalidate('passwordLabel', passwordLabel = $$props.passwordLabel);
3158
- if ('loginButtonLabel' in $$props) $$invalidate('loginButtonLabel', loginButtonLabel = $$props.loginButtonLabel);
3159
- if ('loginRedirect' in $$props) $$invalidate('loginRedirect', loginRedirect = $$props.loginRedirect);
3160
- if ('logo' in $$props) $$invalidate('logo', logo = $$props.logo);
3161
- if ('buttonClass' in $$props) $$invalidate('buttonClass', buttonClass = $$props.buttonClass);
3162
- if ('inputClass' in $$props) $$invalidate('inputClass', inputClass = $$props.inputClass);
3163
- if ('_bb' in $$props) $$invalidate('_bb', _bb = $$props._bb);
3164
- };
3165
-
3166
- $$self.$$.update = ($$dirty = { _bb: 1, logo: 1, buttonClass: 1, inputClass: 1 }) => {
3167
- if ($$dirty._bb || $$dirty.logo || $$dirty.buttonClass || $$dirty.inputClass) { {
3168
- $$invalidate('_logo', _logo = _bb.relativeUrl(logo));
3169
- $$invalidate('_buttonClass', _buttonClass = buttonClass || "default-button");
3170
- $$invalidate('_inputClass', _inputClass = inputClass || "default-input");
3171
- } }
3172
- };
3173
-
3174
- return {
3175
- usernameLabel,
3176
- passwordLabel,
3177
- loginButtonLabel,
3178
- loginRedirect,
3179
- logo,
3180
- buttonClass,
3181
- inputClass,
3182
- _bb,
3183
- username,
3184
- password,
3185
- busy,
3186
- incorrect,
3187
- _logo,
3188
- _buttonClass,
3189
- _inputClass,
3190
- login,
3191
- input0_input_handler,
3192
- input1_input_handler
3193
- };
3194
- }
3195
-
3196
- class Login extends SvelteComponent {
3197
- constructor(options) {
3198
- super();
3199
- if (!document.getElementById("svelte-x36wrk-style")) add_css$2();
3200
- init(this, options, instance$7, create_fragment$7, safe_not_equal, ["usernameLabel", "passwordLabel", "loginButtonLabel", "loginRedirect", "logo", "buttonClass", "inputClass", "_bb"]);
3201
- }
3202
- }
3203
-
3204
- var saveRecordButton = ({ records }) =>
3205
- records.map(r => ({
3206
- name: `Save ${r.name} Button`,
3207
- props: buttonProps(r),
3208
- }));
3209
-
3210
- const buttonProps = record => ({
3211
- _component: "@budibase/standard-components/button",
3212
- _children: [
3213
- {
3214
- _component: "@budibase/standard-components/text",
3215
- text: `Save ${record.name}`,
3216
- },
3217
- ],
3218
- onClick: [
3219
- {
3220
- "##eventHandlerType": "Save Record",
3221
- parameters: {
3222
- statePath: `${record.name}`,
3223
- },
3224
- },
3225
- ],
3226
- });
3227
-
3228
- /* src\Link.svelte generated by Svelte v3.12.1 */
3229
-
3230
- function add_css$3() {
3231
- var style = element("style");
3232
- style.id = 'svelte-vgj7gq-style';
3233
- style.textContent = ".color.svelte-vgj7gq{color:var(--color)}.hoverColor.svelte-vgj7gq:hover{color:var(--color)}.textDecoration.svelte-vgj7gq{text-decoration:var(--textDecoration)}.fontSize.svelte-vgj7gq{font-size:var(--fontSize)}";
3234
- append(document.head, style);
3235
- }
3236
-
3237
- function create_fragment$8(ctx) {
3238
- var a, t, a_class_value, cssVars_action;
3239
-
3240
- return {
3241
- c() {
3242
- a = element("a");
3243
- t = text(ctx.text);
3244
- this.h();
3245
- },
3246
-
3247
- l(nodes) {
3248
- a = claim_element(nodes, "A", { href: true, class: true, target: true }, false);
3249
- var a_nodes = children(a);
3250
-
3251
- t = claim_text(a_nodes, ctx.text);
3252
- a_nodes.forEach(detach);
3253
- this.h();
3254
- },
3255
-
3256
- h() {
3257
- attr(a, "href", ctx.url);
3258
- attr(a, "class", a_class_value = "" + null_to_empty(ctx.classes) + " svelte-vgj7gq");
3259
- attr(a, "target", ctx.target);
3260
- },
3261
-
3262
- m(target_1, anchor) {
3263
- insert(target_1, a, anchor);
3264
- append(a, t);
3265
- ctx.a_binding(a);
3266
- cssVars_action = cssVars.call(null, a, ctx.cssVariables) || {};
3267
- },
3268
-
3269
- p(changed, ctx) {
3270
- if (changed.text) {
3271
- set_data(t, ctx.text);
3272
- }
3273
-
3274
- if (changed.url) {
3275
- attr(a, "href", ctx.url);
3276
- }
3277
-
3278
- if ((changed.classes) && a_class_value !== (a_class_value = "" + null_to_empty(ctx.classes) + " svelte-vgj7gq")) {
3279
- attr(a, "class", a_class_value);
3280
- }
3281
-
3282
- if (changed.target) {
3283
- attr(a, "target", ctx.target);
3284
- }
3285
-
3286
- if (typeof cssVars_action.update === 'function' && changed.cssVariables) {
3287
- cssVars_action.update.call(null, ctx.cssVariables);
3288
- }
3289
- },
3290
-
3291
- i: noop,
3292
- o: noop,
3293
-
3294
- d(detaching) {
3295
- if (detaching) {
3296
- detach(a);
3297
- }
3298
-
3299
- ctx.a_binding(null);
3300
- if (cssVars_action && typeof cssVars_action.destroy === 'function') cssVars_action.destroy();
3301
- }
3302
- };
3303
- }
3304
-
3305
- function instance$8($$self, $$props, $$invalidate) {
3306
- let { url = "", text = "", openInNewTab = false, color, hoverColor, underline = false, fontSize, _bb } = $$props;
3307
-
3308
- let anchorElement;
3309
-
3310
- function a_binding($$value) {
3311
- binding_callbacks[$$value ? 'unshift' : 'push'](() => {
3312
- $$invalidate('anchorElement', anchorElement = $$value);
3313
- });
3314
- }
3315
-
3316
- $$self.$set = $$props => {
3317
- if ('url' in $$props) $$invalidate('url', url = $$props.url);
3318
- if ('text' in $$props) $$invalidate('text', text = $$props.text);
3319
- if ('openInNewTab' in $$props) $$invalidate('openInNewTab', openInNewTab = $$props.openInNewTab);
3320
- if ('color' in $$props) $$invalidate('color', color = $$props.color);
3321
- if ('hoverColor' in $$props) $$invalidate('hoverColor', hoverColor = $$props.hoverColor);
3322
- if ('underline' in $$props) $$invalidate('underline', underline = $$props.underline);
3323
- if ('fontSize' in $$props) $$invalidate('fontSize', fontSize = $$props.fontSize);
3324
- if ('_bb' in $$props) $$invalidate('_bb', _bb = $$props._bb);
3325
- };
3326
-
3327
- let target, cssVariables, classes;
3328
-
3329
- $$self.$$.update = ($$dirty = { anchorElement: 1, text: 1, _bb: 1, openInNewTab: 1, hoverColor: 1, color: 1, underline: 1, fontSize: 1, cssVariables: 1 }) => {
3330
- if ($$dirty.anchorElement || $$dirty.text || $$dirty._bb) { anchorElement && !text && _bb.attachChildren(anchorElement); }
3331
- if ($$dirty.openInNewTab) { $$invalidate('target', target = openInNewTab ? "_blank" : "_self"); }
3332
- if ($$dirty.hoverColor || $$dirty.color || $$dirty.underline || $$dirty.fontSize) { $$invalidate('cssVariables', cssVariables = {
3333
- hoverColor,
3334
- color,
3335
- textDecoration: underline ? "underline" : "none",
3336
- fontSize,
3337
- }); }
3338
- if ($$dirty.cssVariables) { $$invalidate('classes', classes = createClasses(cssVariables)); }
3339
- };
3340
-
3341
- return {
3342
- url,
3343
- text,
3344
- openInNewTab,
3345
- color,
3346
- hoverColor,
3347
- underline,
3348
- fontSize,
3349
- _bb,
3350
- anchorElement,
3351
- target,
3352
- cssVariables,
3353
- classes,
3354
- a_binding
3355
- };
3356
- }
3357
-
3358
- class Link extends SvelteComponent {
3359
- constructor(options) {
3360
- super();
3361
- if (!document.getElementById("svelte-vgj7gq-style")) add_css$3();
3362
- init(this, options, instance$8, create_fragment$8, safe_not_equal, ["url", "text", "openInNewTab", "color", "hoverColor", "underline", "fontSize", "_bb"]);
3363
- }
3364
- }
3365
-
3366
- /* src\Image.svelte generated by Svelte v3.12.1 */
3367
-
3368
- function create_fragment$9(ctx) {
3369
- var img;
3370
-
3371
- return {
3372
- c() {
3373
- img = element("img");
3374
- this.h();
3375
- },
3376
-
3377
- l(nodes) {
3378
- img = claim_element(nodes, "IMG", { class: true, style: true, src: true, alt: true }, false);
3379
- var img_nodes = children(img);
3380
-
3381
- img_nodes.forEach(detach);
3382
- this.h();
3383
- },
3384
-
3385
- h() {
3386
- attr(img, "class", ctx.className);
3387
- attr(img, "style", ctx.style);
3388
- attr(img, "src", ctx.url);
3389
- attr(img, "alt", ctx.description);
3390
- },
3391
-
3392
- m(target, anchor) {
3393
- insert(target, img, anchor);
3394
- },
3395
-
3396
- p(changed, ctx) {
3397
- if (changed.className) {
3398
- attr(img, "class", ctx.className);
3399
- }
3400
-
3401
- if (changed.style) {
3402
- attr(img, "style", ctx.style);
3403
- }
3404
-
3405
- if (changed.url) {
3406
- attr(img, "src", ctx.url);
3407
- }
3408
-
3409
- if (changed.description) {
3410
- attr(img, "alt", ctx.description);
3411
- }
3412
- },
3413
-
3414
- i: noop,
3415
- o: noop,
3416
-
3417
- d(detaching) {
3418
- if (detaching) {
3419
- detach(img);
3420
- }
3421
- }
3422
- };
3423
- }
3424
-
3425
- function instance$9($$self, $$props, $$invalidate) {
3426
- let { className = "", url = "", description = "", height, width } = $$props;
3427
-
3428
- $$self.$set = $$props => {
3429
- if ('className' in $$props) $$invalidate('className', className = $$props.className);
3430
- if ('url' in $$props) $$invalidate('url', url = $$props.url);
3431
- if ('description' in $$props) $$invalidate('description', description = $$props.description);
3432
- if ('height' in $$props) $$invalidate('height', height = $$props.height);
3433
- if ('width' in $$props) $$invalidate('width', width = $$props.width);
3434
- };
3435
-
3436
- let style;
3437
-
3438
- $$self.$$.update = ($$dirty = { height: 1, width: 1 }) => {
3439
- if ($$dirty.height || $$dirty.width) { $$invalidate('style', style = buildStyle({ height, width })); }
3440
- };
3441
-
3442
- return {
3443
- className,
3444
- url,
3445
- description,
3446
- height,
3447
- width,
3448
- style
3449
- };
3450
- }
3451
-
3452
- class Image extends SvelteComponent {
3453
- constructor(options) {
3454
- super();
3455
- init(this, options, instance$9, create_fragment$9, safe_not_equal, ["className", "url", "description", "height", "width"]);
3456
- }
3457
- }
3458
-
3459
- export { Button as button, Container as container, Heading as heading, Image as image, Input as input, Link as link, Login as login, Option as option, saveRecordButton, Select as select, Text as text };
3460
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy9zdmVsdGUvaW50ZXJuYWwvaW5kZXgubWpzIiwiLi4vc3JjL2Nzc1ZhcnMuanMiLCIuLi9zcmMvQ29udGFpbmVyLnN2ZWx0ZSIsIi4uL3NyYy9idWlsZFN0eWxlLmpzIiwiLi4vc3JjL1RleHQuc3ZlbHRlIiwiLi4vc3JjL0hlYWRpbmcuc3ZlbHRlIiwiLi4vc3JjL0lucHV0LnN2ZWx0ZSIsIi4uL3NyYy9TZWxlY3Quc3ZlbHRlIiwiLi4vc3JjL09wdGlvbi5zdmVsdGUiLCIuLi9zcmMvQnV0dG9uLnN2ZWx0ZSIsIi4uL3NyYy9Mb2dpbi5zdmVsdGUiLCIuLi9zcmMvVGVtcGxhdGVzL3NhdmVSZWNvcmRCdXR0b24uanMiLCIuLi9zcmMvTGluay5zdmVsdGUiLCIuLi9zcmMvSW1hZ2Uuc3ZlbHRlIl0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIG5vb3AoKSB7IH1cbmNvbnN0IGlkZW50aXR5ID0geCA9PiB4O1xuZnVuY3Rpb24gYXNzaWduKHRhciwgc3JjKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGZvciAoY29uc3QgayBpbiBzcmMpXG4gICAgICAgIHRhcltrXSA9IHNyY1trXTtcbiAgICByZXR1cm4gdGFyO1xufVxuZnVuY3Rpb24gaXNfcHJvbWlzZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSAnZnVuY3Rpb24nO1xufVxuZnVuY3Rpb24gYWRkX2xvY2F0aW9uKGVsZW1lbnQsIGZpbGUsIGxpbmUsIGNvbHVtbiwgY2hhcikge1xuICAgIGVsZW1lbnQuX19zdmVsdGVfbWV0YSA9IHtcbiAgICAgICAgbG9jOiB7IGZpbGUsIGxpbmUsIGNvbHVtbiwgY2hhciB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHJ1bihmbikge1xuICAgIHJldHVybiBmbigpO1xufVxuZnVuY3Rpb24gYmxhbmtfb2JqZWN0KCkge1xuICAgIHJldHVybiBPYmplY3QuY3JlYXRlKG51bGwpO1xufVxuZnVuY3Rpb24gcnVuX2FsbChmbnMpIHtcbiAgICBmbnMuZm9yRWFjaChydW4pO1xufVxuZnVuY3Rpb24gaXNfZnVuY3Rpb24odGhpbmcpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaW5nID09PSAnZnVuY3Rpb24nO1xufVxuZnVuY3Rpb24gc2FmZV9ub3RfZXF1YWwoYSwgYikge1xuICAgIHJldHVybiBhICE9IGEgPyBiID09IGIgOiBhICE9PSBiIHx8ICgoYSAmJiB0eXBlb2YgYSA9PT0gJ29iamVjdCcpIHx8IHR5cGVvZiBhID09PSAnZnVuY3Rpb24nKTtcbn1cbmZ1bmN0aW9uIG5vdF9lcXVhbChhLCBiKSB7XG4gICAgcmV0dXJuIGEgIT0gYSA/IGIgPT0gYiA6IGEgIT09IGI7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZV9zdG9yZShzdG9yZSwgbmFtZSkge1xuICAgIGlmICghc3RvcmUgfHwgdHlwZW9mIHN0b3JlLnN1YnNjcmliZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke25hbWV9JyBpcyBub3QgYSBzdG9yZSB3aXRoIGEgJ3N1YnNjcmliZScgbWV0aG9kYCk7XG4gICAgfVxufVxuZnVuY3Rpb24gc3Vic2NyaWJlKHN0b3JlLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHVuc3ViID0gc3RvcmUuc3Vic2NyaWJlKGNhbGxiYWNrKTtcbiAgICByZXR1cm4gdW5zdWIudW5zdWJzY3JpYmUgPyAoKSA9PiB1bnN1Yi51bnN1YnNjcmliZSgpIDogdW5zdWI7XG59XG5mdW5jdGlvbiBnZXRfc3RvcmVfdmFsdWUoc3RvcmUpIHtcbiAgICBsZXQgdmFsdWU7XG4gICAgc3Vic2NyaWJlKHN0b3JlLCBfID0+IHZhbHVlID0gXykoKTtcbiAgICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBjb21wb25lbnRfc3Vic2NyaWJlKGNvbXBvbmVudCwgc3RvcmUsIGNhbGxiYWNrKSB7XG4gICAgY29tcG9uZW50LiQkLm9uX2Rlc3Ryb3kucHVzaChzdWJzY3JpYmUoc3RvcmUsIGNhbGxiYWNrKSk7XG59XG5mdW5jdGlvbiBjcmVhdGVfc2xvdChkZWZpbml0aW9uLCBjdHgsIGZuKSB7XG4gICAgaWYgKGRlZmluaXRpb24pIHtcbiAgICAgICAgY29uc3Qgc2xvdF9jdHggPSBnZXRfc2xvdF9jb250ZXh0KGRlZmluaXRpb24sIGN0eCwgZm4pO1xuICAgICAgICByZXR1cm4gZGVmaW5pdGlvblswXShzbG90X2N0eCk7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0X3Nsb3RfY29udGV4dChkZWZpbml0aW9uLCBjdHgsIGZuKSB7XG4gICAgcmV0dXJuIGRlZmluaXRpb25bMV1cbiAgICAgICAgPyBhc3NpZ24oe30sIGFzc2lnbihjdHguJCRzY29wZS5jdHgsIGRlZmluaXRpb25bMV0oZm4gPyBmbihjdHgpIDoge30pKSlcbiAgICAgICAgOiBjdHguJCRzY29wZS5jdHg7XG59XG5mdW5jdGlvbiBnZXRfc2xvdF9jaGFuZ2VzKGRlZmluaXRpb24sIGN0eCwgY2hhbmdlZCwgZm4pIHtcbiAgICByZXR1cm4gZGVmaW5pdGlvblsxXVxuICAgICAgICA/IGFzc2lnbih7fSwgYXNzaWduKGN0eC4kJHNjb3BlLmNoYW5nZWQgfHwge30sIGRlZmluaXRpb25bMV0oZm4gPyBmbihjaGFuZ2VkKSA6IHt9KSkpXG4gICAgICAgIDogY3R4LiQkc2NvcGUuY2hhbmdlZCB8fCB7fTtcbn1cbmZ1bmN0aW9uIGV4Y2x1ZGVfaW50ZXJuYWxfcHJvcHMocHJvcHMpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGsgaW4gcHJvcHMpXG4gICAgICAgIGlmIChrWzBdICE9PSAnJCcpXG4gICAgICAgICAgICByZXN1bHRba10gPSBwcm9wc1trXTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gb25jZShmbikge1xuICAgIGxldCByYW4gPSBmYWxzZTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKHJhbilcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgcmFuID0gdHJ1ZTtcbiAgICAgICAgZm4uY2FsbCh0aGlzLCAuLi5hcmdzKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gbnVsbF90b19lbXB0eSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gJycgOiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHNldF9zdG9yZV92YWx1ZShzdG9yZSwgcmV0LCB2YWx1ZSA9IHJldCkge1xuICAgIHN0b3JlLnNldCh2YWx1ZSk7XG4gICAgcmV0dXJuIHJldDtcbn1cblxuY29uc3QgaXNfY2xpZW50ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCc7XG5sZXQgbm93ID0gaXNfY2xpZW50XG4gICAgPyAoKSA9PiB3aW5kb3cucGVyZm9ybWFuY2Uubm93KClcbiAgICA6ICgpID0+IERhdGUubm93KCk7XG5sZXQgcmFmID0gaXNfY2xpZW50ID8gY2IgPT4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNiKSA6IG5vb3A7XG4vLyB1c2VkIGludGVybmFsbHkgZm9yIHRlc3RpbmdcbmZ1bmN0aW9uIHNldF9ub3coZm4pIHtcbiAgICBub3cgPSBmbjtcbn1cbmZ1bmN0aW9uIHNldF9yYWYoZm4pIHtcbiAgICByYWYgPSBmbjtcbn1cblxuY29uc3QgdGFza3MgPSBuZXcgU2V0KCk7XG5sZXQgcnVubmluZyA9IGZhbHNlO1xuZnVuY3Rpb24gcnVuX3Rhc2tzKCkge1xuICAgIHRhc2tzLmZvckVhY2godGFzayA9PiB7XG4gICAgICAgIGlmICghdGFza1swXShub3coKSkpIHtcbiAgICAgICAgICAgIHRhc2tzLmRlbGV0ZSh0YXNrKTtcbiAgICAgICAgICAgIHRhc2tbMV0oKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJ1bm5pbmcgPSB0YXNrcy5zaXplID4gMDtcbiAgICBpZiAocnVubmluZylcbiAgICAgICAgcmFmKHJ1bl90YXNrcyk7XG59XG5mdW5jdGlvbiBjbGVhcl9sb29wcygpIHtcbiAgICAvLyBmb3IgdGVzdGluZy4uLlxuICAgIHRhc2tzLmZvckVhY2godGFzayA9PiB0YXNrcy5kZWxldGUodGFzaykpO1xuICAgIHJ1bm5pbmcgPSBmYWxzZTtcbn1cbmZ1bmN0aW9uIGxvb3AoZm4pIHtcbiAgICBsZXQgdGFzaztcbiAgICBpZiAoIXJ1bm5pbmcpIHtcbiAgICAgICAgcnVubmluZyA9IHRydWU7XG4gICAgICAgIHJhZihydW5fdGFza3MpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBwcm9taXNlOiBuZXcgUHJvbWlzZShmdWxmaWwgPT4ge1xuICAgICAgICAgICAgdGFza3MuYWRkKHRhc2sgPSBbZm4sIGZ1bGZpbF0pO1xuICAgICAgICB9KSxcbiAgICAgICAgYWJvcnQoKSB7XG4gICAgICAgICAgICB0YXNrcy5kZWxldGUodGFzayk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5mdW5jdGlvbiBhcHBlbmQodGFyZ2V0LCBub2RlKSB7XG4gICAgdGFyZ2V0LmFwcGVuZENoaWxkKG5vZGUpO1xufVxuZnVuY3Rpb24gaW5zZXJ0KHRhcmdldCwgbm9kZSwgYW5jaG9yKSB7XG4gICAgdGFyZ2V0Lmluc2VydEJlZm9yZShub2RlLCBhbmNob3IgfHwgbnVsbCk7XG59XG5mdW5jdGlvbiBkZXRhY2gobm9kZSkge1xuICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTtcbn1cbmZ1bmN0aW9uIGRlc3Ryb3lfZWFjaChpdGVyYXRpb25zLCBkZXRhY2hpbmcpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZXJhdGlvbnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgaWYgKGl0ZXJhdGlvbnNbaV0pXG4gICAgICAgICAgICBpdGVyYXRpb25zW2ldLmQoZGV0YWNoaW5nKTtcbiAgICB9XG59XG5mdW5jdGlvbiBlbGVtZW50KG5hbWUpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKTtcbn1cbmZ1bmN0aW9uIGVsZW1lbnRfaXMobmFtZSwgaXMpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lLCB7IGlzIH0pO1xufVxuZnVuY3Rpb24gb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllcyhvYmosIGV4Y2x1ZGUpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW9iamVjdC1saXRlcmFsLXR5cGUtYXNzZXJ0aW9uXG4gICAgY29uc3QgdGFyZ2V0ID0ge307XG4gICAgZm9yIChjb25zdCBrIGluIG9iaikge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaylcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICYmIGV4Y2x1ZGUuaW5kZXhPZihrKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHRhcmdldFtrXSA9IG9ialtrXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuZnVuY3Rpb24gc3ZnX2VsZW1lbnQobmFtZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgbmFtZSk7XG59XG5mdW5jdGlvbiB0ZXh0KGRhdGEpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZGF0YSk7XG59XG5mdW5jdGlvbiBzcGFjZSgpIHtcbiAgICByZXR1cm4gdGV4dCgnICcpO1xufVxuZnVuY3Rpb24gZW1wdHkoKSB7XG4gICAgcmV0dXJuIHRleHQoJycpO1xufVxuZnVuY3Rpb24gbGlzdGVuKG5vZGUsIGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKSB7XG4gICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKTtcbiAgICByZXR1cm4gKCkgPT4gbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIHByZXZlbnRfZGVmYXVsdChmbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBldmVudCk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHN0b3BfcHJvcGFnYXRpb24oZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJldHVybiBmbi5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICB9O1xufVxuZnVuY3Rpb24gc2VsZihmbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSB0aGlzKVxuICAgICAgICAgICAgZm4uY2FsbCh0aGlzLCBldmVudCk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGF0dHIobm9kZSwgYXR0cmlidXRlLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKVxuICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUpO1xuICAgIGVsc2VcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZSk7XG59XG5mdW5jdGlvbiBzZXRfYXR0cmlidXRlcyhub2RlLCBhdHRyaWJ1dGVzKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gYXR0cmlidXRlcykge1xuICAgICAgICBpZiAoa2V5ID09PSAnc3R5bGUnKSB7XG4gICAgICAgICAgICBub2RlLnN0eWxlLmNzc1RleHQgPSBhdHRyaWJ1dGVzW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoa2V5IGluIG5vZGUpIHtcbiAgICAgICAgICAgIG5vZGVba2V5XSA9IGF0dHJpYnV0ZXNba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGF0dHIobm9kZSwga2V5LCBhdHRyaWJ1dGVzW2tleV0pO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gc2V0X3N2Z19hdHRyaWJ1dGVzKG5vZGUsIGF0dHJpYnV0ZXMpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIGF0dHIobm9kZSwga2V5LCBhdHRyaWJ1dGVzW2tleV0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNldF9jdXN0b21fZWxlbWVudF9kYXRhKG5vZGUsIHByb3AsIHZhbHVlKSB7XG4gICAgaWYgKHByb3AgaW4gbm9kZSkge1xuICAgICAgICBub2RlW3Byb3BdID0gdmFsdWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBhdHRyKG5vZGUsIHByb3AsIHZhbHVlKTtcbiAgICB9XG59XG5mdW5jdGlvbiB4bGlua19hdHRyKG5vZGUsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcbiAgICBub2RlLnNldEF0dHJpYnV0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgYXR0cmlidXRlLCB2YWx1ZSk7XG59XG5mdW5jdGlvbiBnZXRfYmluZGluZ19ncm91cF92YWx1ZShncm91cCkge1xuICAgIGNvbnN0IHZhbHVlID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncm91cC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBpZiAoZ3JvdXBbaV0uY2hlY2tlZClcbiAgICAgICAgICAgIHZhbHVlLnB1c2goZ3JvdXBbaV0uX192YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHRvX251bWJlcih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gJycgPyB1bmRlZmluZWQgOiArdmFsdWU7XG59XG5mdW5jdGlvbiB0aW1lX3Jhbmdlc190b19hcnJheShyYW5nZXMpIHtcbiAgICBjb25zdCBhcnJheSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGFycmF5LnB1c2goeyBzdGFydDogcmFuZ2VzLnN0YXJ0KGkpLCBlbmQ6IHJhbmdlcy5lbmQoaSkgfSk7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbn1cbmZ1bmN0aW9uIGNoaWxkcmVuKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShlbGVtZW50LmNoaWxkTm9kZXMpO1xufVxuZnVuY3Rpb24gY2xhaW1fZWxlbWVudChub2RlcywgbmFtZSwgYXR0cmlidXRlcywgc3ZnKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIGlmIChub2RlLm5vZGVOYW1lID09PSBuYW1lKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG5vZGUuYXR0cmlidXRlcy5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IG5vZGUuYXR0cmlidXRlc1tqXTtcbiAgICAgICAgICAgICAgICBpZiAoIWF0dHJpYnV0ZXNbYXR0cmlidXRlLm5hbWVdKVxuICAgICAgICAgICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbm9kZXMuc3BsaWNlKGksIDEpWzBdOyAvLyBUT0RPIHN0cmlwIHVud2FudGVkIGF0dHJpYnV0ZXNcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3ZnID8gc3ZnX2VsZW1lbnQobmFtZSkgOiBlbGVtZW50KG5hbWUpO1xufVxuZnVuY3Rpb24gY2xhaW1fdGV4dChub2RlcywgZGF0YSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgbm9kZS5kYXRhID0gJycgKyBkYXRhO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGVzLnNwbGljZShpLCAxKVswXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGV4dChkYXRhKTtcbn1cbmZ1bmN0aW9uIGNsYWltX3NwYWNlKG5vZGVzKSB7XG4gICAgcmV0dXJuIGNsYWltX3RleHQobm9kZXMsICcgJyk7XG59XG5mdW5jdGlvbiBzZXRfZGF0YSh0ZXh0LCBkYXRhKSB7XG4gICAgZGF0YSA9ICcnICsgZGF0YTtcbiAgICBpZiAodGV4dC5kYXRhICE9PSBkYXRhKVxuICAgICAgICB0ZXh0LmRhdGEgPSBkYXRhO1xufVxuZnVuY3Rpb24gc2V0X2lucHV0X3ZhbHVlKGlucHV0LCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSAhPSBudWxsIHx8IGlucHV0LnZhbHVlKSB7XG4gICAgICAgIGlucHV0LnZhbHVlID0gdmFsdWU7XG4gICAgfVxufVxuZnVuY3Rpb24gc2V0X2lucHV0X3R5cGUoaW5wdXQsIHR5cGUpIHtcbiAgICB0cnkge1xuICAgICAgICBpbnB1dC50eXBlID0gdHlwZTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNldF9zdHlsZShub2RlLCBrZXksIHZhbHVlLCBpbXBvcnRhbnQpIHtcbiAgICBub2RlLnN0eWxlLnNldFByb3BlcnR5KGtleSwgdmFsdWUsIGltcG9ydGFudCA/ICdpbXBvcnRhbnQnIDogJycpO1xufVxuZnVuY3Rpb24gc2VsZWN0X29wdGlvbihzZWxlY3QsIHZhbHVlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Qub3B0aW9ucy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBvcHRpb24gPSBzZWxlY3Qub3B0aW9uc1tpXTtcbiAgICAgICAgaWYgKG9wdGlvbi5fX3ZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHNlbGVjdF9vcHRpb25zKHNlbGVjdCwgdmFsdWUpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdC5vcHRpb25zLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IHNlbGVjdC5vcHRpb25zW2ldO1xuICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSB+dmFsdWUuaW5kZXhPZihvcHRpb24uX192YWx1ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gc2VsZWN0X3ZhbHVlKHNlbGVjdCkge1xuICAgIGNvbnN0IHNlbGVjdGVkX29wdGlvbiA9IHNlbGVjdC5xdWVyeVNlbGVjdG9yKCc6Y2hlY2tlZCcpIHx8IHNlbGVjdC5vcHRpb25zWzBdO1xuICAgIHJldHVybiBzZWxlY3RlZF9vcHRpb24gJiYgc2VsZWN0ZWRfb3B0aW9uLl9fdmFsdWU7XG59XG5mdW5jdGlvbiBzZWxlY3RfbXVsdGlwbGVfdmFsdWUoc2VsZWN0KSB7XG4gICAgcmV0dXJuIFtdLm1hcC5jYWxsKHNlbGVjdC5xdWVyeVNlbGVjdG9yQWxsKCc6Y2hlY2tlZCcpLCBvcHRpb24gPT4gb3B0aW9uLl9fdmFsdWUpO1xufVxuZnVuY3Rpb24gYWRkX3Jlc2l6ZV9saXN0ZW5lcihlbGVtZW50LCBmbikge1xuICAgIGlmIChnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJykge1xuICAgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB9XG4gICAgY29uc3Qgb2JqZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb2JqZWN0Jyk7XG4gICAgb2JqZWN0LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZGlzcGxheTogYmxvY2s7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBsZWZ0OiAwOyBoZWlnaHQ6IDEwMCU7IHdpZHRoOiAxMDAlOyBvdmVyZmxvdzogaGlkZGVuOyBwb2ludGVyLWV2ZW50czogbm9uZTsgei1pbmRleDogLTE7Jyk7XG4gICAgb2JqZWN0LnR5cGUgPSAndGV4dC9odG1sJztcbiAgICBvYmplY3QudGFiSW5kZXggPSAtMTtcbiAgICBsZXQgd2luO1xuICAgIG9iamVjdC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgIHdpbiA9IG9iamVjdC5jb250ZW50RG9jdW1lbnQuZGVmYXVsdFZpZXc7XG4gICAgICAgIHdpbi5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBmbik7XG4gICAgfTtcbiAgICBpZiAoL1RyaWRlbnQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHtcbiAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChvYmplY3QpO1xuICAgICAgICBvYmplY3QuZGF0YSA9ICdhYm91dDpibGFuayc7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBvYmplY3QuZGF0YSA9ICdhYm91dDpibGFuayc7XG4gICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQob2JqZWN0KTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2FuY2VsOiAoKSA9PiB7XG4gICAgICAgICAgICB3aW4gJiYgd2luLnJlbW92ZUV2ZW50TGlzdGVuZXIgJiYgd2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGZuKTtcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQob2JqZWN0KTtcbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiB0b2dnbGVfY2xhc3MoZWxlbWVudCwgbmFtZSwgdG9nZ2xlKSB7XG4gICAgZWxlbWVudC5jbGFzc0xpc3RbdG9nZ2xlID8gJ2FkZCcgOiAncmVtb3ZlJ10obmFtZSk7XG59XG5mdW5jdGlvbiBjdXN0b21fZXZlbnQodHlwZSwgZGV0YWlsKSB7XG4gICAgY29uc3QgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO1xuICAgIGUuaW5pdEN1c3RvbUV2ZW50KHR5cGUsIGZhbHNlLCBmYWxzZSwgZGV0YWlsKTtcbiAgICByZXR1cm4gZTtcbn1cbmNsYXNzIEh0bWxUYWcge1xuICAgIGNvbnN0cnVjdG9yKGh0bWwsIGFuY2hvciA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5lID0gZWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHRoaXMuYSA9IGFuY2hvcjtcbiAgICAgICAgdGhpcy51KGh0bWwpO1xuICAgIH1cbiAgICBtKHRhcmdldCwgYW5jaG9yID0gbnVsbCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubi5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgaW5zZXJ0KHRhcmdldCwgdGhpcy5uW2ldLCBhbmNob3IpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudCA9IHRhcmdldDtcbiAgICB9XG4gICAgdShodG1sKSB7XG4gICAgICAgIHRoaXMuZS5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgICB0aGlzLm4gPSBBcnJheS5mcm9tKHRoaXMuZS5jaGlsZE5vZGVzKTtcbiAgICB9XG4gICAgcChodG1sKSB7XG4gICAgICAgIHRoaXMuZCgpO1xuICAgICAgICB0aGlzLnUoaHRtbCk7XG4gICAgICAgIHRoaXMubSh0aGlzLnQsIHRoaXMuYSk7XG4gICAgfVxuICAgIGQoKSB7XG4gICAgICAgIHRoaXMubi5mb3JFYWNoKGRldGFjaCk7XG4gICAgfVxufVxuXG5sZXQgc3R5bGVzaGVldDtcbmxldCBhY3RpdmUgPSAwO1xubGV0IGN1cnJlbnRfcnVsZXMgPSB7fTtcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJrc2t5YXBwL3N0cmluZy1oYXNoL2Jsb2IvbWFzdGVyL2luZGV4LmpzXG5mdW5jdGlvbiBoYXNoKHN0cikge1xuICAgIGxldCBoYXNoID0gNTM4MTtcbiAgICBsZXQgaSA9IHN0ci5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSlcbiAgICAgICAgaGFzaCA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpIF4gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgcmV0dXJuIGhhc2ggPj4+IDA7XG59XG5mdW5jdGlvbiBjcmVhdGVfcnVsZShub2RlLCBhLCBiLCBkdXJhdGlvbiwgZGVsYXksIGVhc2UsIGZuLCB1aWQgPSAwKSB7XG4gICAgY29uc3Qgc3RlcCA9IDE2LjY2NiAvIGR1cmF0aW9uO1xuICAgIGxldCBrZXlmcmFtZXMgPSAne1xcbic7XG4gICAgZm9yIChsZXQgcCA9IDA7IHAgPD0gMTsgcCArPSBzdGVwKSB7XG4gICAgICAgIGNvbnN0IHQgPSBhICsgKGIgLSBhKSAqIGVhc2UocCk7XG4gICAgICAgIGtleWZyYW1lcyArPSBwICogMTAwICsgYCV7JHtmbih0LCAxIC0gdCl9fVxcbmA7XG4gICAgfVxuICAgIGNvbnN0IHJ1bGUgPSBrZXlmcmFtZXMgKyBgMTAwJSB7JHtmbihiLCAxIC0gYil9fVxcbn1gO1xuICAgIGNvbnN0IG5hbWUgPSBgX19zdmVsdGVfJHtoYXNoKHJ1bGUpfV8ke3VpZH1gO1xuICAgIGlmICghY3VycmVudF9ydWxlc1tuYW1lXSkge1xuICAgICAgICBpZiAoIXN0eWxlc2hlZXQpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gZWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICAgICAgICAgICAgc3R5bGVzaGVldCA9IHN0eWxlLnNoZWV0O1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRfcnVsZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICBzdHlsZXNoZWV0Lmluc2VydFJ1bGUoYEBrZXlmcmFtZXMgJHtuYW1lfSAke3J1bGV9YCwgc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGgpO1xuICAgIH1cbiAgICBjb25zdCBhbmltYXRpb24gPSBub2RlLnN0eWxlLmFuaW1hdGlvbiB8fCAnJztcbiAgICBub2RlLnN0eWxlLmFuaW1hdGlvbiA9IGAke2FuaW1hdGlvbiA/IGAke2FuaW1hdGlvbn0sIGAgOiBgYH0ke25hbWV9ICR7ZHVyYXRpb259bXMgbGluZWFyICR7ZGVsYXl9bXMgMSBib3RoYDtcbiAgICBhY3RpdmUgKz0gMTtcbiAgICByZXR1cm4gbmFtZTtcbn1cbmZ1bmN0aW9uIGRlbGV0ZV9ydWxlKG5vZGUsIG5hbWUpIHtcbiAgICBub2RlLnN0eWxlLmFuaW1hdGlvbiA9IChub2RlLnN0eWxlLmFuaW1hdGlvbiB8fCAnJylcbiAgICAgICAgLnNwbGl0KCcsICcpXG4gICAgICAgIC5maWx0ZXIobmFtZVxuICAgICAgICA/IGFuaW0gPT4gYW5pbS5pbmRleE9mKG5hbWUpIDwgMCAvLyByZW1vdmUgc3BlY2lmaWMgYW5pbWF0aW9uXG4gICAgICAgIDogYW5pbSA9PiBhbmltLmluZGV4T2YoJ19fc3ZlbHRlJykgPT09IC0xIC8vIHJlbW92ZSBhbGwgU3ZlbHRlIGFuaW1hdGlvbnNcbiAgICApXG4gICAgICAgIC5qb2luKCcsICcpO1xuICAgIGlmIChuYW1lICYmICEtLWFjdGl2ZSlcbiAgICAgICAgY2xlYXJfcnVsZXMoKTtcbn1cbmZ1bmN0aW9uIGNsZWFyX3J1bGVzKCkge1xuICAgIHJhZigoKSA9PiB7XG4gICAgICAgIGlmIChhY3RpdmUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBpID0gc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGg7XG4gICAgICAgIHdoaWxlIChpLS0pXG4gICAgICAgICAgICBzdHlsZXNoZWV0LmRlbGV0ZVJ1bGUoaSk7XG4gICAgICAgIGN1cnJlbnRfcnVsZXMgPSB7fTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlX2FuaW1hdGlvbihub2RlLCBmcm9tLCBmbiwgcGFyYW1zKSB7XG4gICAgaWYgKCFmcm9tKVxuICAgICAgICByZXR1cm4gbm9vcDtcbiAgICBjb25zdCB0byA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgaWYgKGZyb20ubGVmdCA9PT0gdG8ubGVmdCAmJiBmcm9tLnJpZ2h0ID09PSB0by5yaWdodCAmJiBmcm9tLnRvcCA9PT0gdG8udG9wICYmIGZyb20uYm90dG9tID09PSB0by5ib3R0b20pXG4gICAgICAgIHJldHVybiBub29wO1xuICAgIGNvbnN0IHsgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDMwMCwgZWFzaW5nID0gaWRlbnRpdHksIFxuICAgIC8vIEB0cy1pZ25vcmUgdG9kbzogc2hvdWxkIHRoaXMgYmUgc2VwYXJhdGVkIGZyb20gZGVzdHJ1Y3R1cmluZz8gT3Igc3RhcnQvZW5kIGFkZGVkIHRvIHB1YmxpYyBhcGkgYW5kIGRvY3VtZW50YXRpb24/XG4gICAgc3RhcnQ6IHN0YXJ0X3RpbWUgPSBub3coKSArIGRlbGF5LCBcbiAgICAvLyBAdHMtaWdub3JlIHRvZG86XG4gICAgZW5kID0gc3RhcnRfdGltZSArIGR1cmF0aW9uLCB0aWNrID0gbm9vcCwgY3NzIH0gPSBmbihub2RlLCB7IGZyb20sIHRvIH0sIHBhcmFtcyk7XG4gICAgbGV0IHJ1bm5pbmcgPSB0cnVlO1xuICAgIGxldCBzdGFydGVkID0gZmFsc2U7XG4gICAgbGV0IG5hbWU7XG4gICAgZnVuY3Rpb24gc3RhcnQoKSB7XG4gICAgICAgIGlmIChjc3MpIHtcbiAgICAgICAgICAgIG5hbWUgPSBjcmVhdGVfcnVsZShub2RlLCAwLCAxLCBkdXJhdGlvbiwgZGVsYXksIGVhc2luZywgY3NzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRlbGF5KSB7XG4gICAgICAgICAgICBzdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzdG9wKCkge1xuICAgICAgICBpZiAoY3NzKVxuICAgICAgICAgICAgZGVsZXRlX3J1bGUobm9kZSwgbmFtZSk7XG4gICAgICAgIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgbG9vcChub3cgPT4ge1xuICAgICAgICBpZiAoIXN0YXJ0ZWQgJiYgbm93ID49IHN0YXJ0X3RpbWUpIHtcbiAgICAgICAgICAgIHN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydGVkICYmIG5vdyA+PSBlbmQpIHtcbiAgICAgICAgICAgIHRpY2soMSwgMCk7XG4gICAgICAgICAgICBzdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFydW5uaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHAgPSBub3cgLSBzdGFydF90aW1lO1xuICAgICAgICAgICAgY29uc3QgdCA9IDAgKyAxICogZWFzaW5nKHAgLyBkdXJhdGlvbik7XG4gICAgICAgICAgICB0aWNrKHQsIDEgLSB0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgICBzdGFydCgpO1xuICAgIHRpY2soMCwgMSk7XG4gICAgcmV0dXJuIHN0b3A7XG59XG5mdW5jdGlvbiBmaXhfcG9zaXRpb24obm9kZSkge1xuICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcbiAgICBpZiAoc3R5bGUucG9zaXRpb24gIT09ICdhYnNvbHV0ZScgJiYgc3R5bGUucG9zaXRpb24gIT09ICdmaXhlZCcpIHtcbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBzdHlsZTtcbiAgICAgICAgY29uc3QgYSA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIG5vZGUuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICBub2RlLnN0eWxlLndpZHRoID0gd2lkdGg7XG4gICAgICAgIG5vZGUuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICBhZGRfdHJhbnNmb3JtKG5vZGUsIGEpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFkZF90cmFuc2Zvcm0obm9kZSwgYSkge1xuICAgIGNvbnN0IGIgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChhLmxlZnQgIT09IGIubGVmdCB8fCBhLnRvcCAhPT0gYi50b3ApIHtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBzdHlsZS50cmFuc2Zvcm0gPT09ICdub25lJyA/ICcnIDogc3R5bGUudHJhbnNmb3JtO1xuICAgICAgICBub2RlLnN0eWxlLnRyYW5zZm9ybSA9IGAke3RyYW5zZm9ybX0gdHJhbnNsYXRlKCR7YS5sZWZ0IC0gYi5sZWZ0fXB4LCAke2EudG9wIC0gYi50b3B9cHgpYDtcbiAgICB9XG59XG5cbmxldCBjdXJyZW50X2NvbXBvbmVudDtcbmZ1bmN0aW9uIHNldF9jdXJyZW50X2NvbXBvbmVudChjb21wb25lbnQpIHtcbiAgICBjdXJyZW50X2NvbXBvbmVudCA9IGNvbXBvbmVudDtcbn1cbmZ1bmN0aW9uIGdldF9jdXJyZW50X2NvbXBvbmVudCgpIHtcbiAgICBpZiAoIWN1cnJlbnRfY29tcG9uZW50KVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZ1bmN0aW9uIGNhbGxlZCBvdXRzaWRlIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbmApO1xuICAgIHJldHVybiBjdXJyZW50X2NvbXBvbmVudDtcbn1cbmZ1bmN0aW9uIGJlZm9yZVVwZGF0ZShmbikge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmJlZm9yZV91cGRhdGUucHVzaChmbik7XG59XG5mdW5jdGlvbiBvbk1vdW50KGZuKSB7XG4gICAgZ2V0X2N1cnJlbnRfY29tcG9uZW50KCkuJCQub25fbW91bnQucHVzaChmbik7XG59XG5mdW5jdGlvbiBhZnRlclVwZGF0ZShmbikge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmFmdGVyX3VwZGF0ZS5wdXNoKGZuKTtcbn1cbmZ1bmN0aW9uIG9uRGVzdHJveShmbikge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLm9uX2Rlc3Ryb3kucHVzaChmbik7XG59XG5mdW5jdGlvbiBjcmVhdGVFdmVudERpc3BhdGNoZXIoKSB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gY3VycmVudF9jb21wb25lbnQ7XG4gICAgcmV0dXJuICh0eXBlLCBkZXRhaWwpID0+IHtcbiAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gY29tcG9uZW50LiQkLmNhbGxiYWNrc1t0eXBlXTtcbiAgICAgICAgaWYgKGNhbGxiYWNrcykge1xuICAgICAgICAgICAgLy8gVE9ETyBhcmUgdGhlcmUgc2l0dWF0aW9ucyB3aGVyZSBldmVudHMgY291bGQgYmUgZGlzcGF0Y2hlZFxuICAgICAgICAgICAgLy8gaW4gYSBzZXJ2ZXIgKG5vbi1ET00pIGVudmlyb25tZW50P1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBjdXN0b21fZXZlbnQodHlwZSwgZGV0YWlsKTtcbiAgICAgICAgICAgIGNhbGxiYWNrcy5zbGljZSgpLmZvckVhY2goZm4gPT4ge1xuICAgICAgICAgICAgICAgIGZuLmNhbGwoY29tcG9uZW50LCBldmVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiBzZXRDb250ZXh0KGtleSwgY29udGV4dCkge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmNvbnRleHQuc2V0KGtleSwgY29udGV4dCk7XG59XG5mdW5jdGlvbiBnZXRDb250ZXh0KGtleSkge1xuICAgIHJldHVybiBnZXRfY3VycmVudF9jb21wb25lbnQoKS4kJC5jb250ZXh0LmdldChrZXkpO1xufVxuLy8gVE9ETyBmaWd1cmUgb3V0IGlmIHdlIHN0aWxsIHdhbnQgdG8gc3VwcG9ydFxuLy8gc2hvcnRoYW5kIGV2ZW50cywgb3IgaWYgd2Ugd2FudCB0byBpbXBsZW1lbnRcbi8vIGEgcmVhbCBidWJibGluZyBtZWNoYW5pc21cbmZ1bmN0aW9uIGJ1YmJsZShjb21wb25lbnQsIGV2ZW50KSB7XG4gICAgY29uc3QgY2FsbGJhY2tzID0gY29tcG9uZW50LiQkLmNhbGxiYWNrc1tldmVudC50eXBlXTtcbiAgICBpZiAoY2FsbGJhY2tzKSB7XG4gICAgICAgIGNhbGxiYWNrcy5zbGljZSgpLmZvckVhY2goZm4gPT4gZm4oZXZlbnQpKTtcbiAgICB9XG59XG5cbmNvbnN0IGRpcnR5X2NvbXBvbmVudHMgPSBbXTtcbmNvbnN0IGludHJvcyA9IHsgZW5hYmxlZDogZmFsc2UgfTtcbmNvbnN0IGJpbmRpbmdfY2FsbGJhY2tzID0gW107XG5jb25zdCByZW5kZXJfY2FsbGJhY2tzID0gW107XG5jb25zdCBmbHVzaF9jYWxsYmFja3MgPSBbXTtcbmNvbnN0IHJlc29sdmVkX3Byb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbmxldCB1cGRhdGVfc2NoZWR1bGVkID0gZmFsc2U7XG5mdW5jdGlvbiBzY2hlZHVsZV91cGRhdGUoKSB7XG4gICAgaWYgKCF1cGRhdGVfc2NoZWR1bGVkKSB7XG4gICAgICAgIHVwZGF0ZV9zY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgICByZXNvbHZlZF9wcm9taXNlLnRoZW4oZmx1c2gpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHRpY2soKSB7XG4gICAgc2NoZWR1bGVfdXBkYXRlKCk7XG4gICAgcmV0dXJuIHJlc29sdmVkX3Byb21pc2U7XG59XG5mdW5jdGlvbiBhZGRfcmVuZGVyX2NhbGxiYWNrKGZuKSB7XG4gICAgcmVuZGVyX2NhbGxiYWNrcy5wdXNoKGZuKTtcbn1cbmZ1bmN0aW9uIGFkZF9mbHVzaF9jYWxsYmFjayhmbikge1xuICAgIGZsdXNoX2NhbGxiYWNrcy5wdXNoKGZuKTtcbn1cbmZ1bmN0aW9uIGZsdXNoKCkge1xuICAgIGNvbnN0IHNlZW5fY2FsbGJhY2tzID0gbmV3IFNldCgpO1xuICAgIGRvIHtcbiAgICAgICAgLy8gZmlyc3QsIGNhbGwgYmVmb3JlVXBkYXRlIGZ1bmN0aW9uc1xuICAgICAgICAvLyBhbmQgdXBkYXRlIGNvbXBvbmVudHNcbiAgICAgICAgd2hpbGUgKGRpcnR5X2NvbXBvbmVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBkaXJ0eV9jb21wb25lbnRzLnNoaWZ0KCk7XG4gICAgICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQoY29tcG9uZW50KTtcbiAgICAgICAgICAgIHVwZGF0ZShjb21wb25lbnQuJCQpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChiaW5kaW5nX2NhbGxiYWNrcy5sZW5ndGgpXG4gICAgICAgICAgICBiaW5kaW5nX2NhbGxiYWNrcy5wb3AoKSgpO1xuICAgICAgICAvLyB0aGVuLCBvbmNlIGNvbXBvbmVudHMgYXJlIHVwZGF0ZWQsIGNhbGxcbiAgICAgICAgLy8gYWZ0ZXJVcGRhdGUgZnVuY3Rpb25zLiBUaGlzIG1heSBjYXVzZVxuICAgICAgICAvLyBzdWJzZXF1ZW50IHVwZGF0ZXMuLi5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZW5kZXJfY2FsbGJhY2tzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IHJlbmRlcl9jYWxsYmFja3NbaV07XG4gICAgICAgICAgICBpZiAoIXNlZW5fY2FsbGJhY2tzLmhhcyhjYWxsYmFjaykpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIC8vIC4uLnNvIGd1YXJkIGFnYWluc3QgaW5maW5pdGUgbG9vcHNcbiAgICAgICAgICAgICAgICBzZWVuX2NhbGxiYWNrcy5hZGQoY2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlbmRlcl9jYWxsYmFja3MubGVuZ3RoID0gMDtcbiAgICB9IHdoaWxlIChkaXJ0eV9jb21wb25lbnRzLmxlbmd0aCk7XG4gICAgd2hpbGUgKGZsdXNoX2NhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgZmx1c2hfY2FsbGJhY2tzLnBvcCgpKCk7XG4gICAgfVxuICAgIHVwZGF0ZV9zY2hlZHVsZWQgPSBmYWxzZTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZSgkJCkge1xuICAgIGlmICgkJC5mcmFnbWVudCkge1xuICAgICAgICAkJC51cGRhdGUoJCQuZGlydHkpO1xuICAgICAgICBydW5fYWxsKCQkLmJlZm9yZV91cGRhdGUpO1xuICAgICAgICAkJC5mcmFnbWVudC5wKCQkLmRpcnR5LCAkJC5jdHgpO1xuICAgICAgICAkJC5kaXJ0eSA9IG51bGw7XG4gICAgICAgICQkLmFmdGVyX3VwZGF0ZS5mb3JFYWNoKGFkZF9yZW5kZXJfY2FsbGJhY2spO1xuICAgIH1cbn1cblxubGV0IHByb21pc2U7XG5mdW5jdGlvbiB3YWl0KCkge1xuICAgIGlmICghcHJvbWlzZSkge1xuICAgICAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIHByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBwcm9taXNlID0gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBwcm9taXNlO1xufVxuZnVuY3Rpb24gZGlzcGF0Y2gobm9kZSwgZGlyZWN0aW9uLCBraW5kKSB7XG4gICAgbm9kZS5kaXNwYXRjaEV2ZW50KGN1c3RvbV9ldmVudChgJHtkaXJlY3Rpb24gPyAnaW50cm8nIDogJ291dHJvJ30ke2tpbmR9YCkpO1xufVxuY29uc3Qgb3V0cm9pbmcgPSBuZXcgU2V0KCk7XG5sZXQgb3V0cm9zO1xuZnVuY3Rpb24gZ3JvdXBfb3V0cm9zKCkge1xuICAgIG91dHJvcyA9IHtcbiAgICAgICAgcjogMCxcbiAgICAgICAgYzogW10sXG4gICAgICAgIHA6IG91dHJvcyAvLyBwYXJlbnQgZ3JvdXBcbiAgICB9O1xufVxuZnVuY3Rpb24gY2hlY2tfb3V0cm9zKCkge1xuICAgIGlmICghb3V0cm9zLnIpIHtcbiAgICAgICAgcnVuX2FsbChvdXRyb3MuYyk7XG4gICAgfVxuICAgIG91dHJvcyA9IG91dHJvcy5wO1xufVxuZnVuY3Rpb24gdHJhbnNpdGlvbl9pbihibG9jaywgbG9jYWwpIHtcbiAgICBpZiAoYmxvY2sgJiYgYmxvY2suaSkge1xuICAgICAgICBvdXRyb2luZy5kZWxldGUoYmxvY2spO1xuICAgICAgICBibG9jay5pKGxvY2FsKTtcbiAgICB9XG59XG5mdW5jdGlvbiB0cmFuc2l0aW9uX291dChibG9jaywgbG9jYWwsIGRldGFjaCwgY2FsbGJhY2spIHtcbiAgICBpZiAoYmxvY2sgJiYgYmxvY2subykge1xuICAgICAgICBpZiAob3V0cm9pbmcuaGFzKGJsb2NrKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgb3V0cm9pbmcuYWRkKGJsb2NrKTtcbiAgICAgICAgb3V0cm9zLmMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICBvdXRyb2luZy5kZWxldGUoYmxvY2spO1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRldGFjaClcbiAgICAgICAgICAgICAgICAgICAgYmxvY2suZCgxKTtcbiAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgYmxvY2subyhsb2NhbCk7XG4gICAgfVxufVxuY29uc3QgbnVsbF90cmFuc2l0aW9uID0geyBkdXJhdGlvbjogMCB9O1xuZnVuY3Rpb24gY3JlYXRlX2luX3RyYW5zaXRpb24obm9kZSwgZm4sIHBhcmFtcykge1xuICAgIGxldCBjb25maWcgPSBmbihub2RlLCBwYXJhbXMpO1xuICAgIGxldCBydW5uaW5nID0gZmFsc2U7XG4gICAgbGV0IGFuaW1hdGlvbl9uYW1lO1xuICAgIGxldCB0YXNrO1xuICAgIGxldCB1aWQgPSAwO1xuICAgIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgICAgIGlmIChhbmltYXRpb25fbmFtZSlcbiAgICAgICAgICAgIGRlbGV0ZV9ydWxlKG5vZGUsIGFuaW1hdGlvbl9uYW1lKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ28oKSB7XG4gICAgICAgIGNvbnN0IHsgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDMwMCwgZWFzaW5nID0gaWRlbnRpdHksIHRpY2sgPSBub29wLCBjc3MgfSA9IGNvbmZpZyB8fCBudWxsX3RyYW5zaXRpb247XG4gICAgICAgIGlmIChjc3MpXG4gICAgICAgICAgICBhbmltYXRpb25fbmFtZSA9IGNyZWF0ZV9ydWxlKG5vZGUsIDAsIDEsIGR1cmF0aW9uLCBkZWxheSwgZWFzaW5nLCBjc3MsIHVpZCsrKTtcbiAgICAgICAgdGljaygwLCAxKTtcbiAgICAgICAgY29uc3Qgc3RhcnRfdGltZSA9IG5vdygpICsgZGVsYXk7XG4gICAgICAgIGNvbnN0IGVuZF90aW1lID0gc3RhcnRfdGltZSArIGR1cmF0aW9uO1xuICAgICAgICBpZiAodGFzaylcbiAgICAgICAgICAgIHRhc2suYWJvcnQoKTtcbiAgICAgICAgcnVubmluZyA9IHRydWU7XG4gICAgICAgIGFkZF9yZW5kZXJfY2FsbGJhY2soKCkgPT4gZGlzcGF0Y2gobm9kZSwgdHJ1ZSwgJ3N0YXJ0JykpO1xuICAgICAgICB0YXNrID0gbG9vcChub3cgPT4ge1xuICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAobm93ID49IGVuZF90aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRpY2soMSwgMCk7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKG5vZGUsIHRydWUsICdlbmQnKTtcbiAgICAgICAgICAgICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm93ID49IHN0YXJ0X3RpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGVhc2luZygobm93IC0gc3RhcnRfdGltZSkgLyBkdXJhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIHRpY2sodCwgMSAtIHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBydW5uaW5nO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgbGV0IHN0YXJ0ZWQgPSBmYWxzZTtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydCgpIHtcbiAgICAgICAgICAgIGlmIChzdGFydGVkKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGRlbGV0ZV9ydWxlKG5vZGUpO1xuICAgICAgICAgICAgaWYgKGlzX2Z1bmN0aW9uKGNvbmZpZykpIHtcbiAgICAgICAgICAgICAgICBjb25maWcgPSBjb25maWcoKTtcbiAgICAgICAgICAgICAgICB3YWl0KCkudGhlbihnbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBnbygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBpbnZhbGlkYXRlKCkge1xuICAgICAgICAgICAgc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICB9LFxuICAgICAgICBlbmQoKSB7XG4gICAgICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgICAgICBydW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlX291dF90cmFuc2l0aW9uKG5vZGUsIGZuLCBwYXJhbXMpIHtcbiAgICBsZXQgY29uZmlnID0gZm4obm9kZSwgcGFyYW1zKTtcbiAgICBsZXQgcnVubmluZyA9IHRydWU7XG4gICAgbGV0IGFuaW1hdGlvbl9uYW1lO1xuICAgIGNvbnN0IGdyb3VwID0gb3V0cm9zO1xuICAgIGdyb3VwLnIgKz0gMTtcbiAgICBmdW5jdGlvbiBnbygpIHtcbiAgICAgICAgY29uc3QgeyBkZWxheSA9IDAsIGR1cmF0aW9uID0gMzAwLCBlYXNpbmcgPSBpZGVudGl0eSwgdGljayA9IG5vb3AsIGNzcyB9ID0gY29uZmlnIHx8IG51bGxfdHJhbnNpdGlvbjtcbiAgICAgICAgaWYgKGNzcylcbiAgICAgICAgICAgIGFuaW1hdGlvbl9uYW1lID0gY3JlYXRlX3J1bGUobm9kZSwgMSwgMCwgZHVyYXRpb24sIGRlbGF5LCBlYXNpbmcsIGNzcyk7XG4gICAgICAgIGNvbnN0IHN0YXJ0X3RpbWUgPSBub3coKSArIGRlbGF5O1xuICAgICAgICBjb25zdCBlbmRfdGltZSA9IHN0YXJ0X3RpbWUgKyBkdXJhdGlvbjtcbiAgICAgICAgYWRkX3JlbmRlcl9jYWxsYmFjaygoKSA9PiBkaXNwYXRjaChub2RlLCBmYWxzZSwgJ3N0YXJ0JykpO1xuICAgICAgICBsb29wKG5vdyA9PiB7XG4gICAgICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgICAgICAgIGlmIChub3cgPj0gZW5kX3RpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGljaygwLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2gobm9kZSwgZmFsc2UsICdlbmQnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEtLWdyb3VwLnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgd2lsbCByZXN1bHQgaW4gYGVuZCgpYCBiZWluZyBjYWxsZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBkb24ndCBuZWVkIHRvIGNsZWFuIHVwIGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9hbGwoZ3JvdXAuYyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm93ID49IHN0YXJ0X3RpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGVhc2luZygobm93IC0gc3RhcnRfdGltZSkgLyBkdXJhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIHRpY2soMSAtIHQsIHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBydW5uaW5nO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGlzX2Z1bmN0aW9uKGNvbmZpZykpIHtcbiAgICAgICAgd2FpdCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uZmlnID0gY29uZmlnKCk7XG4gICAgICAgICAgICBnbygpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGdvKCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGVuZChyZXNldCkge1xuICAgICAgICAgICAgaWYgKHJlc2V0ICYmIGNvbmZpZy50aWNrKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLnRpY2soMSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgICAgICAgIGlmIChhbmltYXRpb25fbmFtZSlcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlX3J1bGUobm9kZSwgYW5pbWF0aW9uX25hbWUpO1xuICAgICAgICAgICAgICAgIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiBjcmVhdGVfYmlkaXJlY3Rpb25hbF90cmFuc2l0aW9uKG5vZGUsIGZuLCBwYXJhbXMsIGludHJvKSB7XG4gICAgbGV0IGNvbmZpZyA9IGZuKG5vZGUsIHBhcmFtcyk7XG4gICAgbGV0IHQgPSBpbnRybyA/IDAgOiAxO1xuICAgIGxldCBydW5uaW5nX3Byb2dyYW0gPSBudWxsO1xuICAgIGxldCBwZW5kaW5nX3Byb2dyYW0gPSBudWxsO1xuICAgIGxldCBhbmltYXRpb25fbmFtZSA9IG51bGw7XG4gICAgZnVuY3Rpb24gY2xlYXJfYW5pbWF0aW9uKCkge1xuICAgICAgICBpZiAoYW5pbWF0aW9uX25hbWUpXG4gICAgICAgICAgICBkZWxldGVfcnVsZShub2RlLCBhbmltYXRpb25fbmFtZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGluaXQocHJvZ3JhbSwgZHVyYXRpb24pIHtcbiAgICAgICAgY29uc3QgZCA9IHByb2dyYW0uYiAtIHQ7XG4gICAgICAgIGR1cmF0aW9uICo9IE1hdGguYWJzKGQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYTogdCxcbiAgICAgICAgICAgIGI6IHByb2dyYW0uYixcbiAgICAgICAgICAgIGQsXG4gICAgICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgICAgIHN0YXJ0OiBwcm9ncmFtLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBwcm9ncmFtLnN0YXJ0ICsgZHVyYXRpb24sXG4gICAgICAgICAgICBncm91cDogcHJvZ3JhbS5ncm91cFxuICAgICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBnbyhiKSB7XG4gICAgICAgIGNvbnN0IHsgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDMwMCwgZWFzaW5nID0gaWRlbnRpdHksIHRpY2sgPSBub29wLCBjc3MgfSA9IGNvbmZpZyB8fCBudWxsX3RyYW5zaXRpb247XG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSB7XG4gICAgICAgICAgICBzdGFydDogbm93KCkgKyBkZWxheSxcbiAgICAgICAgICAgIGJcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFiKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlIHRvZG86IGltcHJvdmUgdHlwaW5nc1xuICAgICAgICAgICAgcHJvZ3JhbS5ncm91cCA9IG91dHJvcztcbiAgICAgICAgICAgIG91dHJvcy5yICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJ1bm5pbmdfcHJvZ3JhbSkge1xuICAgICAgICAgICAgcGVuZGluZ19wcm9ncmFtID0gcHJvZ3JhbTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYW4gaW50cm8sIGFuZCB0aGVyZSdzIGEgZGVsYXksIHdlIG5lZWQgdG8gZG9cbiAgICAgICAgICAgIC8vIGFuIGluaXRpYWwgdGljayBhbmQvb3IgYXBwbHkgQ1NTIGFuaW1hdGlvbiBpbW1lZGlhdGVseVxuICAgICAgICAgICAgaWYgKGNzcykge1xuICAgICAgICAgICAgICAgIGNsZWFyX2FuaW1hdGlvbigpO1xuICAgICAgICAgICAgICAgIGFuaW1hdGlvbl9uYW1lID0gY3JlYXRlX3J1bGUobm9kZSwgdCwgYiwgZHVyYXRpb24sIGRlbGF5LCBlYXNpbmcsIGNzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYilcbiAgICAgICAgICAgICAgICB0aWNrKDAsIDEpO1xuICAgICAgICAgICAgcnVubmluZ19wcm9ncmFtID0gaW5pdChwcm9ncmFtLCBkdXJhdGlvbik7XG4gICAgICAgICAgICBhZGRfcmVuZGVyX2NhbGxiYWNrKCgpID0+IGRpc3BhdGNoKG5vZGUsIGIsICdzdGFydCcpKTtcbiAgICAgICAgICAgIGxvb3Aobm93ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocGVuZGluZ19wcm9ncmFtICYmIG5vdyA+IHBlbmRpbmdfcHJvZ3JhbS5zdGFydCkge1xuICAgICAgICAgICAgICAgICAgICBydW5uaW5nX3Byb2dyYW0gPSBpbml0KHBlbmRpbmdfcHJvZ3JhbSwgZHVyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX3Byb2dyYW0gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChub2RlLCBydW5uaW5nX3Byb2dyYW0uYiwgJ3N0YXJ0Jyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyX2FuaW1hdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uX25hbWUgPSBjcmVhdGVfcnVsZShub2RlLCB0LCBydW5uaW5nX3Byb2dyYW0uYiwgcnVubmluZ19wcm9ncmFtLmR1cmF0aW9uLCAwLCBlYXNpbmcsIGNvbmZpZy5jc3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChydW5uaW5nX3Byb2dyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vdyA+PSBydW5uaW5nX3Byb2dyYW0uZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWNrKHQgPSBydW5uaW5nX3Byb2dyYW0uYiwgMSAtIHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2gobm9kZSwgcnVubmluZ19wcm9ncmFtLmIsICdlbmQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGVuZGluZ19wcm9ncmFtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgZG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydW5uaW5nX3Byb2dyYW0uYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRybyDigJQgd2UgY2FuIHRpZHkgdXAgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJfYW5pbWF0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRybyDigJQgbmVlZHMgdG8gYmUgY29vcmRpbmF0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEtLXJ1bm5pbmdfcHJvZ3JhbS5ncm91cC5yKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuX2FsbChydW5uaW5nX3Byb2dyYW0uZ3JvdXAuYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZ19wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChub3cgPj0gcnVubmluZ19wcm9ncmFtLnN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwID0gbm93IC0gcnVubmluZ19wcm9ncmFtLnN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHJ1bm5pbmdfcHJvZ3JhbS5hICsgcnVubmluZ19wcm9ncmFtLmQgKiBlYXNpbmcocCAvIHJ1bm5pbmdfcHJvZ3JhbS5kdXJhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWNrKHQsIDEgLSB0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gISEocnVubmluZ19wcm9ncmFtIHx8IHBlbmRpbmdfcHJvZ3JhbSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBydW4oYikge1xuICAgICAgICAgICAgaWYgKGlzX2Z1bmN0aW9uKGNvbmZpZykpIHtcbiAgICAgICAgICAgICAgICB3YWl0KCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gY29uZmlnKCk7XG4gICAgICAgICAgICAgICAgICAgIGdvKGIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZ28oYik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVuZCgpIHtcbiAgICAgICAgICAgIGNsZWFyX2FuaW1hdGlvbigpO1xuICAgICAgICAgICAgcnVubmluZ19wcm9ncmFtID0gcGVuZGluZ19wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGhhbmRsZV9wcm9taXNlKHByb21pc2UsIGluZm8pIHtcbiAgICBjb25zdCB0b2tlbiA9IGluZm8udG9rZW4gPSB7fTtcbiAgICBmdW5jdGlvbiB1cGRhdGUodHlwZSwgaW5kZXgsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKGluZm8udG9rZW4gIT09IHRva2VuKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpbmZvLnJlc29sdmVkID0ga2V5ICYmIHsgW2tleV06IHZhbHVlIH07XG4gICAgICAgIGNvbnN0IGNoaWxkX2N0eCA9IGFzc2lnbihhc3NpZ24oe30sIGluZm8uY3R4KSwgaW5mby5yZXNvbHZlZCk7XG4gICAgICAgIGNvbnN0IGJsb2NrID0gdHlwZSAmJiAoaW5mby5jdXJyZW50ID0gdHlwZSkoY2hpbGRfY3R4KTtcbiAgICAgICAgaWYgKGluZm8uYmxvY2spIHtcbiAgICAgICAgICAgIGlmIChpbmZvLmJsb2Nrcykge1xuICAgICAgICAgICAgICAgIGluZm8uYmxvY2tzLmZvckVhY2goKGJsb2NrLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpICE9PSBpbmRleCAmJiBibG9jaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfb3V0cm9zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uX291dChibG9jaywgMSwgMSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uYmxvY2tzW2ldID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfb3V0cm9zKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGluZm8uYmxvY2suZCgxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJsb2NrLmMoKTtcbiAgICAgICAgICAgIHRyYW5zaXRpb25faW4oYmxvY2ssIDEpO1xuICAgICAgICAgICAgYmxvY2subShpbmZvLm1vdW50KCksIGluZm8uYW5jaG9yKTtcbiAgICAgICAgICAgIGZsdXNoKCk7XG4gICAgICAgIH1cbiAgICAgICAgaW5mby5ibG9jayA9IGJsb2NrO1xuICAgICAgICBpZiAoaW5mby5ibG9ja3MpXG4gICAgICAgICAgICBpbmZvLmJsb2Nrc1tpbmRleF0gPSBibG9jaztcbiAgICB9XG4gICAgaWYgKGlzX3Byb21pc2UocHJvbWlzZSkpIHtcbiAgICAgICAgY29uc3QgY3VycmVudF9jb21wb25lbnQgPSBnZXRfY3VycmVudF9jb21wb25lbnQoKTtcbiAgICAgICAgcHJvbWlzZS50aGVuKHZhbHVlID0+IHtcbiAgICAgICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChjdXJyZW50X2NvbXBvbmVudCk7XG4gICAgICAgICAgICB1cGRhdGUoaW5mby50aGVuLCAxLCBpbmZvLnZhbHVlLCB2YWx1ZSk7XG4gICAgICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQobnVsbCk7XG4gICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChjdXJyZW50X2NvbXBvbmVudCk7XG4gICAgICAgICAgICB1cGRhdGUoaW5mby5jYXRjaCwgMiwgaW5mby5lcnJvciwgZXJyb3IpO1xuICAgICAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KG51bGwpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gaWYgd2UgcHJldmlvdXNseSBoYWQgYSB0aGVuL2NhdGNoIGJsb2NrLCBkZXN0cm95IGl0XG4gICAgICAgIGlmIChpbmZvLmN1cnJlbnQgIT09IGluZm8ucGVuZGluZykge1xuICAgICAgICAgICAgdXBkYXRlKGluZm8ucGVuZGluZywgMCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKGluZm8uY3VycmVudCAhPT0gaW5mby50aGVuKSB7XG4gICAgICAgICAgICB1cGRhdGUoaW5mby50aGVuLCAxLCBpbmZvLnZhbHVlLCBwcm9taXNlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGluZm8ucmVzb2x2ZWQgPSB7IFtpbmZvLnZhbHVlXTogcHJvbWlzZSB9O1xuICAgIH1cbn1cblxuY29uc3QgZ2xvYmFscyA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IGdsb2JhbCk7XG5cbmZ1bmN0aW9uIGRlc3Ryb3lfYmxvY2soYmxvY2ssIGxvb2t1cCkge1xuICAgIGJsb2NrLmQoMSk7XG4gICAgbG9va3VwLmRlbGV0ZShibG9jay5rZXkpO1xufVxuZnVuY3Rpb24gb3V0cm9fYW5kX2Rlc3Ryb3lfYmxvY2soYmxvY2ssIGxvb2t1cCkge1xuICAgIHRyYW5zaXRpb25fb3V0KGJsb2NrLCAxLCAxLCAoKSA9PiB7XG4gICAgICAgIGxvb2t1cC5kZWxldGUoYmxvY2sua2V5KTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGZpeF9hbmRfZGVzdHJveV9ibG9jayhibG9jaywgbG9va3VwKSB7XG4gICAgYmxvY2suZigpO1xuICAgIGRlc3Ryb3lfYmxvY2soYmxvY2ssIGxvb2t1cCk7XG59XG5mdW5jdGlvbiBmaXhfYW5kX291dHJvX2FuZF9kZXN0cm95X2Jsb2NrKGJsb2NrLCBsb29rdXApIHtcbiAgICBibG9jay5mKCk7XG4gICAgb3V0cm9fYW5kX2Rlc3Ryb3lfYmxvY2soYmxvY2ssIGxvb2t1cCk7XG59XG5mdW5jdGlvbiB1cGRhdGVfa2V5ZWRfZWFjaChvbGRfYmxvY2tzLCBjaGFuZ2VkLCBnZXRfa2V5LCBkeW5hbWljLCBjdHgsIGxpc3QsIGxvb2t1cCwgbm9kZSwgZGVzdHJveSwgY3JlYXRlX2VhY2hfYmxvY2ssIG5leHQsIGdldF9jb250ZXh0KSB7XG4gICAgbGV0IG8gPSBvbGRfYmxvY2tzLmxlbmd0aDtcbiAgICBsZXQgbiA9IGxpc3QubGVuZ3RoO1xuICAgIGxldCBpID0gbztcbiAgICBjb25zdCBvbGRfaW5kZXhlcyA9IHt9O1xuICAgIHdoaWxlIChpLS0pXG4gICAgICAgIG9sZF9pbmRleGVzW29sZF9ibG9ja3NbaV0ua2V5XSA9IGk7XG4gICAgY29uc3QgbmV3X2Jsb2NrcyA9IFtdO1xuICAgIGNvbnN0IG5ld19sb29rdXAgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgZGVsdGFzID0gbmV3IE1hcCgpO1xuICAgIGkgPSBuO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgY29uc3QgY2hpbGRfY3R4ID0gZ2V0X2NvbnRleHQoY3R4LCBsaXN0LCBpKTtcbiAgICAgICAgY29uc3Qga2V5ID0gZ2V0X2tleShjaGlsZF9jdHgpO1xuICAgICAgICBsZXQgYmxvY2sgPSBsb29rdXAuZ2V0KGtleSk7XG4gICAgICAgIGlmICghYmxvY2spIHtcbiAgICAgICAgICAgIGJsb2NrID0gY3JlYXRlX2VhY2hfYmxvY2soa2V5LCBjaGlsZF9jdHgpO1xuICAgICAgICAgICAgYmxvY2suYygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGR5bmFtaWMpIHtcbiAgICAgICAgICAgIGJsb2NrLnAoY2hhbmdlZCwgY2hpbGRfY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBuZXdfbG9va3VwLnNldChrZXksIG5ld19ibG9ja3NbaV0gPSBibG9jayk7XG4gICAgICAgIGlmIChrZXkgaW4gb2xkX2luZGV4ZXMpXG4gICAgICAgICAgICBkZWx0YXMuc2V0KGtleSwgTWF0aC5hYnMoaSAtIG9sZF9pbmRleGVzW2tleV0pKTtcbiAgICB9XG4gICAgY29uc3Qgd2lsbF9tb3ZlID0gbmV3IFNldCgpO1xuICAgIGNvbnN0IGRpZF9tb3ZlID0gbmV3IFNldCgpO1xuICAgIGZ1bmN0aW9uIGluc2VydChibG9jaykge1xuICAgICAgICB0cmFuc2l0aW9uX2luKGJsb2NrLCAxKTtcbiAgICAgICAgYmxvY2subShub2RlLCBuZXh0KTtcbiAgICAgICAgbG9va3VwLnNldChibG9jay5rZXksIGJsb2NrKTtcbiAgICAgICAgbmV4dCA9IGJsb2NrLmZpcnN0O1xuICAgICAgICBuLS07XG4gICAgfVxuICAgIHdoaWxlIChvICYmIG4pIHtcbiAgICAgICAgY29uc3QgbmV3X2Jsb2NrID0gbmV3X2Jsb2Nrc1tuIC0gMV07XG4gICAgICAgIGNvbnN0IG9sZF9ibG9jayA9IG9sZF9ibG9ja3NbbyAtIDFdO1xuICAgICAgICBjb25zdCBuZXdfa2V5ID0gbmV3X2Jsb2NrLmtleTtcbiAgICAgICAgY29uc3Qgb2xkX2tleSA9IG9sZF9ibG9jay5rZXk7XG4gICAgICAgIGlmIChuZXdfYmxvY2sgPT09IG9sZF9ibG9jaykge1xuICAgICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICAgICAgbmV4dCA9IG5ld19ibG9jay5maXJzdDtcbiAgICAgICAgICAgIG8tLTtcbiAgICAgICAgICAgIG4tLTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghbmV3X2xvb2t1cC5oYXMob2xkX2tleSkpIHtcbiAgICAgICAgICAgIC8vIHJlbW92ZSBvbGQgYmxvY2tcbiAgICAgICAgICAgIGRlc3Ryb3kob2xkX2Jsb2NrLCBsb29rdXApO1xuICAgICAgICAgICAgby0tO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFsb29rdXAuaGFzKG5ld19rZXkpIHx8IHdpbGxfbW92ZS5oYXMobmV3X2tleSkpIHtcbiAgICAgICAgICAgIGluc2VydChuZXdfYmxvY2spO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRpZF9tb3ZlLmhhcyhvbGRfa2V5KSkge1xuICAgICAgICAgICAgby0tO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRlbHRhcy5nZXQobmV3X2tleSkgPiBkZWx0YXMuZ2V0KG9sZF9rZXkpKSB7XG4gICAgICAgICAgICBkaWRfbW92ZS5hZGQobmV3X2tleSk7XG4gICAgICAgICAgICBpbnNlcnQobmV3X2Jsb2NrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHdpbGxfbW92ZS5hZGQob2xkX2tleSk7XG4gICAgICAgICAgICBvLS07XG4gICAgICAgIH1cbiAgICB9XG4gICAgd2hpbGUgKG8tLSkge1xuICAgICAgICBjb25zdCBvbGRfYmxvY2sgPSBvbGRfYmxvY2tzW29dO1xuICAgICAgICBpZiAoIW5ld19sb29rdXAuaGFzKG9sZF9ibG9jay5rZXkpKVxuICAgICAgICAgICAgZGVzdHJveShvbGRfYmxvY2ssIGxvb2t1cCk7XG4gICAgfVxuICAgIHdoaWxlIChuKVxuICAgICAgICBpbnNlcnQobmV3X2Jsb2Nrc1tuIC0gMV0pO1xuICAgIHJldHVybiBuZXdfYmxvY2tzO1xufVxuZnVuY3Rpb24gbWVhc3VyZShibG9ja3MpIHtcbiAgICBjb25zdCByZWN0cyA9IHt9O1xuICAgIGxldCBpID0gYmxvY2tzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKVxuICAgICAgICByZWN0c1tibG9ja3NbaV0ua2V5XSA9IGJsb2Nrc1tpXS5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJldHVybiByZWN0cztcbn1cblxuZnVuY3Rpb24gZ2V0X3NwcmVhZF91cGRhdGUobGV2ZWxzLCB1cGRhdGVzKSB7XG4gICAgY29uc3QgdXBkYXRlID0ge307XG4gICAgY29uc3QgdG9fbnVsbF9vdXQgPSB7fTtcbiAgICBjb25zdCBhY2NvdW50ZWRfZm9yID0geyAkJHNjb3BlOiAxIH07XG4gICAgbGV0IGkgPSBsZXZlbHMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgY29uc3QgbyA9IGxldmVsc1tpXTtcbiAgICAgICAgY29uc3QgbiA9IHVwZGF0ZXNbaV07XG4gICAgICAgIGlmIChuKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEoa2V5IGluIG4pKVxuICAgICAgICAgICAgICAgICAgICB0b19udWxsX291dFtrZXldID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG4pIHtcbiAgICAgICAgICAgICAgICBpZiAoIWFjY291bnRlZF9mb3Jba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVba2V5XSA9IG5ba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgYWNjb3VudGVkX2ZvcltrZXldID0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXZlbHNbaV0gPSBuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbykge1xuICAgICAgICAgICAgICAgIGFjY291bnRlZF9mb3Jba2V5XSA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdG9fbnVsbF9vdXQpIHtcbiAgICAgICAgaWYgKCEoa2V5IGluIHVwZGF0ZSkpXG4gICAgICAgICAgICB1cGRhdGVba2V5XSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHVwZGF0ZTtcbn1cbmZ1bmN0aW9uIGdldF9zcHJlYWRfb2JqZWN0KHNwcmVhZF9wcm9wcykge1xuICAgIHJldHVybiB0eXBlb2Ygc3ByZWFkX3Byb3BzID09PSAnb2JqZWN0JyAmJiBzcHJlYWRfcHJvcHMgIT09IG51bGwgPyBzcHJlYWRfcHJvcHMgOiB7fTtcbn1cblxuY29uc3QgaW52YWxpZF9hdHRyaWJ1dGVfbmFtZV9jaGFyYWN0ZXIgPSAvW1xccydcIj4vPVxcdXtGREQwfS1cXHV7RkRFRn1cXHV7RkZGRX1cXHV7RkZGRn1cXHV7MUZGRkV9XFx1ezFGRkZGfVxcdXsyRkZGRX1cXHV7MkZGRkZ9XFx1ezNGRkZFfVxcdXszRkZGRn1cXHV7NEZGRkV9XFx1ezRGRkZGfVxcdXs1RkZGRX1cXHV7NUZGRkZ9XFx1ezZGRkZFfVxcdXs2RkZGRn1cXHV7N0ZGRkV9XFx1ezdGRkZGfVxcdXs4RkZGRX1cXHV7OEZGRkZ9XFx1ezlGRkZFfVxcdXs5RkZGRn1cXHV7QUZGRkV9XFx1e0FGRkZGfVxcdXtCRkZGRX1cXHV7QkZGRkZ9XFx1e0NGRkZFfVxcdXtDRkZGRn1cXHV7REZGRkV9XFx1e0RGRkZGfVxcdXtFRkZGRX1cXHV7RUZGRkZ9XFx1e0ZGRkZFfVxcdXtGRkZGRn1cXHV7MTBGRkZFfVxcdXsxMEZGRkZ9XS91O1xuLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjYXR0cmlidXRlcy0yXG4vLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jbm9uY2hhcmFjdGVyXG5mdW5jdGlvbiBzcHJlYWQoYXJncykge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBPYmplY3QuYXNzaWduKHt9LCAuLi5hcmdzKTtcbiAgICBsZXQgc3RyID0gJyc7XG4gICAgT2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaChuYW1lID0+IHtcbiAgICAgICAgaWYgKGludmFsaWRfYXR0cmlidXRlX25hbWVfY2hhcmFjdGVyLnRlc3QobmFtZSkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXR0cmlidXRlc1tuYW1lXTtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSlcbiAgICAgICAgICAgIHN0ciArPSBcIiBcIiArIG5hbWU7XG4gICAgICAgIGNvbnN0IGVzY2FwZWQgPSBTdHJpbmcodmFsdWUpXG4gICAgICAgICAgICAucmVwbGFjZSgvXCIvZywgJyYjMzQ7JylcbiAgICAgICAgICAgIC5yZXBsYWNlKC8nL2csICcmIzM5OycpO1xuICAgICAgICBzdHIgKz0gXCIgXCIgKyBuYW1lICsgXCI9XCIgKyBKU09OLnN0cmluZ2lmeShlc2NhcGVkKTtcbiAgICB9KTtcbiAgICByZXR1cm4gc3RyO1xufVxuY29uc3QgZXNjYXBlZCA9IHtcbiAgICAnXCInOiAnJnF1b3Q7JyxcbiAgICBcIidcIjogJyYjMzk7JyxcbiAgICAnJic6ICcmYW1wOycsXG4gICAgJzwnOiAnJmx0OycsXG4gICAgJz4nOiAnJmd0Oydcbn07XG5mdW5jdGlvbiBlc2NhcGUoaHRtbCkge1xuICAgIHJldHVybiBTdHJpbmcoaHRtbCkucmVwbGFjZSgvW1wiJyY8Pl0vZywgbWF0Y2ggPT4gZXNjYXBlZFttYXRjaF0pO1xufVxuZnVuY3Rpb24gZWFjaChpdGVtcywgZm4pIHtcbiAgICBsZXQgc3RyID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBzdHIgKz0gZm4oaXRlbXNbaV0sIGkpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufVxuY29uc3QgbWlzc2luZ19jb21wb25lbnQgPSB7XG4gICAgJCRyZW5kZXI6ICgpID0+ICcnXG59O1xuZnVuY3Rpb24gdmFsaWRhdGVfY29tcG9uZW50KGNvbXBvbmVudCwgbmFtZSkge1xuICAgIGlmICghY29tcG9uZW50IHx8ICFjb21wb25lbnQuJCRyZW5kZXIpIHtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdzdmVsdGU6Y29tcG9uZW50JylcbiAgICAgICAgICAgIG5hbWUgKz0gJyB0aGlzPXsuLi59JztcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGA8JHtuYW1lfT4gaXMgbm90IGEgdmFsaWQgU1NSIGNvbXBvbmVudC4gWW91IG1heSBuZWVkIHRvIHJldmlldyB5b3VyIGJ1aWxkIGNvbmZpZyB0byBlbnN1cmUgdGhhdCBkZXBlbmRlbmNpZXMgYXJlIGNvbXBpbGVkLCByYXRoZXIgdGhhbiBpbXBvcnRlZCBhcyBwcmUtY29tcGlsZWQgbW9kdWxlc2ApO1xuICAgIH1cbiAgICByZXR1cm4gY29tcG9uZW50O1xufVxuZnVuY3Rpb24gZGVidWcoZmlsZSwgbGluZSwgY29sdW1uLCB2YWx1ZXMpIHtcbiAgICBjb25zb2xlLmxvZyhge0BkZWJ1Z30gJHtmaWxlID8gZmlsZSArICcgJyA6ICcnfSgke2xpbmV9OiR7Y29sdW1ufSlgKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS5sb2codmFsdWVzKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgcmV0dXJuICcnO1xufVxubGV0IG9uX2Rlc3Ryb3k7XG5mdW5jdGlvbiBjcmVhdGVfc3NyX2NvbXBvbmVudChmbikge1xuICAgIGZ1bmN0aW9uICQkcmVuZGVyKHJlc3VsdCwgcHJvcHMsIGJpbmRpbmdzLCBzbG90cykge1xuICAgICAgICBjb25zdCBwYXJlbnRfY29tcG9uZW50ID0gY3VycmVudF9jb21wb25lbnQ7XG4gICAgICAgIGNvbnN0ICQkID0ge1xuICAgICAgICAgICAgb25fZGVzdHJveSxcbiAgICAgICAgICAgIGNvbnRleHQ6IG5ldyBNYXAocGFyZW50X2NvbXBvbmVudCA/IHBhcmVudF9jb21wb25lbnQuJCQuY29udGV4dCA6IFtdKSxcbiAgICAgICAgICAgIC8vIHRoZXNlIHdpbGwgYmUgaW1tZWRpYXRlbHkgZGlzY2FyZGVkXG4gICAgICAgICAgICBvbl9tb3VudDogW10sXG4gICAgICAgICAgICBiZWZvcmVfdXBkYXRlOiBbXSxcbiAgICAgICAgICAgIGFmdGVyX3VwZGF0ZTogW10sXG4gICAgICAgICAgICBjYWxsYmFja3M6IGJsYW5rX29iamVjdCgpXG4gICAgICAgIH07XG4gICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudCh7ICQkIH0pO1xuICAgICAgICBjb25zdCBodG1sID0gZm4ocmVzdWx0LCBwcm9wcywgYmluZGluZ3MsIHNsb3RzKTtcbiAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KHBhcmVudF9jb21wb25lbnQpO1xuICAgICAgICByZXR1cm4gaHRtbDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVuZGVyOiAocHJvcHMgPSB7fSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgICAgICAgICBvbl9kZXN0cm95ID0gW107XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IGhlYWQ6ICcnLCBjc3M6IG5ldyBTZXQoKSB9O1xuICAgICAgICAgICAgY29uc3QgaHRtbCA9ICQkcmVuZGVyKHJlc3VsdCwgcHJvcHMsIHt9LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJ1bl9hbGwob25fZGVzdHJveSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGh0bWwsXG4gICAgICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IEFycmF5LmZyb20ocmVzdWx0LmNzcykubWFwKGNzcyA9PiBjc3MuY29kZSkuam9pbignXFxuJyksXG4gICAgICAgICAgICAgICAgICAgIG1hcDogbnVsbCAvLyBUT0RPXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBoZWFkOiByZXN1bHQuaGVhZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgJCRyZW5kZXJcbiAgICB9O1xufVxuZnVuY3Rpb24gYWRkX2F0dHJpYnV0ZShuYW1lLCB2YWx1ZSwgYm9vbGVhbikge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IChib29sZWFuICYmICF2YWx1ZSkpXG4gICAgICAgIHJldHVybiAnJztcbiAgICByZXR1cm4gYCAke25hbWV9JHt2YWx1ZSA9PT0gdHJ1ZSA/ICcnIDogYD0ke3R5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBKU09OLnN0cmluZ2lmeShlc2NhcGUodmFsdWUpKSA6IGBcIiR7dmFsdWV9XCJgfWB9YDtcbn1cbmZ1bmN0aW9uIGFkZF9jbGFzc2VzKGNsYXNzZXMpIHtcbiAgICByZXR1cm4gY2xhc3NlcyA/IGAgY2xhc3M9XCIke2NsYXNzZXN9XCJgIDogYGA7XG59XG5cbmZ1bmN0aW9uIGJpbmQoY29tcG9uZW50LCBuYW1lLCBjYWxsYmFjaykge1xuICAgIGlmIChjb21wb25lbnQuJCQucHJvcHMuaW5kZXhPZihuYW1lKSA9PT0gLTEpXG4gICAgICAgIHJldHVybjtcbiAgICBjb21wb25lbnQuJCQuYm91bmRbbmFtZV0gPSBjYWxsYmFjaztcbiAgICBjYWxsYmFjayhjb21wb25lbnQuJCQuY3R4W25hbWVdKTtcbn1cbmZ1bmN0aW9uIG1vdW50X2NvbXBvbmVudChjb21wb25lbnQsIHRhcmdldCwgYW5jaG9yKSB7XG4gICAgY29uc3QgeyBmcmFnbWVudCwgb25fbW91bnQsIG9uX2Rlc3Ryb3ksIGFmdGVyX3VwZGF0ZSB9ID0gY29tcG9uZW50LiQkO1xuICAgIGZyYWdtZW50Lm0odGFyZ2V0LCBhbmNob3IpO1xuICAgIC8vIG9uTW91bnQgaGFwcGVucyBiZWZvcmUgdGhlIGluaXRpYWwgYWZ0ZXJVcGRhdGVcbiAgICBhZGRfcmVuZGVyX2NhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgY29uc3QgbmV3X29uX2Rlc3Ryb3kgPSBvbl9tb3VudC5tYXAocnVuKS5maWx0ZXIoaXNfZnVuY3Rpb24pO1xuICAgICAgICBpZiAob25fZGVzdHJveSkge1xuICAgICAgICAgICAgb25fZGVzdHJveS5wdXNoKC4uLm5ld19vbl9kZXN0cm95KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIEVkZ2UgY2FzZSAtIGNvbXBvbmVudCB3YXMgZGVzdHJveWVkIGltbWVkaWF0ZWx5LFxuICAgICAgICAgICAgLy8gbW9zdCBsaWtlbHkgYXMgYSByZXN1bHQgb2YgYSBiaW5kaW5nIGluaXRpYWxpc2luZ1xuICAgICAgICAgICAgcnVuX2FsbChuZXdfb25fZGVzdHJveSk7XG4gICAgICAgIH1cbiAgICAgICAgY29tcG9uZW50LiQkLm9uX21vdW50ID0gW107XG4gICAgfSk7XG4gICAgYWZ0ZXJfdXBkYXRlLmZvckVhY2goYWRkX3JlbmRlcl9jYWxsYmFjayk7XG59XG5mdW5jdGlvbiBkZXN0cm95X2NvbXBvbmVudChjb21wb25lbnQsIGRldGFjaGluZykge1xuICAgIGlmIChjb21wb25lbnQuJCQuZnJhZ21lbnQpIHtcbiAgICAgICAgcnVuX2FsbChjb21wb25lbnQuJCQub25fZGVzdHJveSk7XG4gICAgICAgIGNvbXBvbmVudC4kJC5mcmFnbWVudC5kKGRldGFjaGluZyk7XG4gICAgICAgIC8vIFRPRE8gbnVsbCBvdXQgb3RoZXIgcmVmcywgaW5jbHVkaW5nIGNvbXBvbmVudC4kJCAoYnV0IG5lZWQgdG9cbiAgICAgICAgLy8gcHJlc2VydmUgZmluYWwgc3RhdGU/KVxuICAgICAgICBjb21wb25lbnQuJCQub25fZGVzdHJveSA9IGNvbXBvbmVudC4kJC5mcmFnbWVudCA9IG51bGw7XG4gICAgICAgIGNvbXBvbmVudC4kJC5jdHggPSB7fTtcbiAgICB9XG59XG5mdW5jdGlvbiBtYWtlX2RpcnR5KGNvbXBvbmVudCwga2V5KSB7XG4gICAgaWYgKCFjb21wb25lbnQuJCQuZGlydHkpIHtcbiAgICAgICAgZGlydHlfY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG4gICAgICAgIHNjaGVkdWxlX3VwZGF0ZSgpO1xuICAgICAgICBjb21wb25lbnQuJCQuZGlydHkgPSBibGFua19vYmplY3QoKTtcbiAgICB9XG4gICAgY29tcG9uZW50LiQkLmRpcnR5W2tleV0gPSB0cnVlO1xufVxuZnVuY3Rpb24gaW5pdChjb21wb25lbnQsIG9wdGlvbnMsIGluc3RhbmNlLCBjcmVhdGVfZnJhZ21lbnQsIG5vdF9lcXVhbCwgcHJvcF9uYW1lcykge1xuICAgIGNvbnN0IHBhcmVudF9jb21wb25lbnQgPSBjdXJyZW50X2NvbXBvbmVudDtcbiAgICBzZXRfY3VycmVudF9jb21wb25lbnQoY29tcG9uZW50KTtcbiAgICBjb25zdCBwcm9wcyA9IG9wdGlvbnMucHJvcHMgfHwge307XG4gICAgY29uc3QgJCQgPSBjb21wb25lbnQuJCQgPSB7XG4gICAgICAgIGZyYWdtZW50OiBudWxsLFxuICAgICAgICBjdHg6IG51bGwsXG4gICAgICAgIC8vIHN0YXRlXG4gICAgICAgIHByb3BzOiBwcm9wX25hbWVzLFxuICAgICAgICB1cGRhdGU6IG5vb3AsXG4gICAgICAgIG5vdF9lcXVhbCxcbiAgICAgICAgYm91bmQ6IGJsYW5rX29iamVjdCgpLFxuICAgICAgICAvLyBsaWZlY3ljbGVcbiAgICAgICAgb25fbW91bnQ6IFtdLFxuICAgICAgICBvbl9kZXN0cm95OiBbXSxcbiAgICAgICAgYmVmb3JlX3VwZGF0ZTogW10sXG4gICAgICAgIGFmdGVyX3VwZGF0ZTogW10sXG4gICAgICAgIGNvbnRleHQ6IG5ldyBNYXAocGFyZW50X2NvbXBvbmVudCA/IHBhcmVudF9jb21wb25lbnQuJCQuY29udGV4dCA6IFtdKSxcbiAgICAgICAgLy8gZXZlcnl0aGluZyBlbHNlXG4gICAgICAgIGNhbGxiYWNrczogYmxhbmtfb2JqZWN0KCksXG4gICAgICAgIGRpcnR5OiBudWxsXG4gICAgfTtcbiAgICBsZXQgcmVhZHkgPSBmYWxzZTtcbiAgICAkJC5jdHggPSBpbnN0YW5jZVxuICAgICAgICA/IGluc3RhbmNlKGNvbXBvbmVudCwgcHJvcHMsIChrZXksIHJldCwgdmFsdWUgPSByZXQpID0+IHtcbiAgICAgICAgICAgIGlmICgkJC5jdHggJiYgbm90X2VxdWFsKCQkLmN0eFtrZXldLCAkJC5jdHhba2V5XSA9IHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlmICgkJC5ib3VuZFtrZXldKVxuICAgICAgICAgICAgICAgICAgICAkJC5ib3VuZFtrZXldKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAocmVhZHkpXG4gICAgICAgICAgICAgICAgICAgIG1ha2VfZGlydHkoY29tcG9uZW50LCBrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfSlcbiAgICAgICAgOiBwcm9wcztcbiAgICAkJC51cGRhdGUoKTtcbiAgICByZWFkeSA9IHRydWU7XG4gICAgcnVuX2FsbCgkJC5iZWZvcmVfdXBkYXRlKTtcbiAgICAkJC5mcmFnbWVudCA9IGNyZWF0ZV9mcmFnbWVudCgkJC5jdHgpO1xuICAgIGlmIChvcHRpb25zLnRhcmdldCkge1xuICAgICAgICBpZiAob3B0aW9ucy5oeWRyYXRlKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICAgICAgJCQuZnJhZ21lbnQubChjaGlsZHJlbihvcHRpb25zLnRhcmdldCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgICAgICQkLmZyYWdtZW50LmMoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5pbnRybylcbiAgICAgICAgICAgIHRyYW5zaXRpb25faW4oY29tcG9uZW50LiQkLmZyYWdtZW50KTtcbiAgICAgICAgbW91bnRfY29tcG9uZW50KGNvbXBvbmVudCwgb3B0aW9ucy50YXJnZXQsIG9wdGlvbnMuYW5jaG9yKTtcbiAgICAgICAgZmx1c2goKTtcbiAgICB9XG4gICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KHBhcmVudF9jb21wb25lbnQpO1xufVxubGV0IFN2ZWx0ZUVsZW1lbnQ7XG5pZiAodHlwZW9mIEhUTUxFbGVtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgIFN2ZWx0ZUVsZW1lbnQgPSBjbGFzcyBleHRlbmRzIEhUTUxFbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICBzdXBlcigpO1xuICAgICAgICAgICAgdGhpcy5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlIHRvZG86IGltcHJvdmUgdHlwaW5nc1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy4kJC5zbG90dGVkKSB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB0b2RvOiBpbXByb3ZlIHR5cGluZ3NcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMuJCQuc2xvdHRlZFtrZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soYXR0ciwgX29sZFZhbHVlLCBuZXdWYWx1ZSkge1xuICAgICAgICAgICAgdGhpc1thdHRyXSA9IG5ld1ZhbHVlO1xuICAgICAgICB9XG4gICAgICAgICRkZXN0cm95KCkge1xuICAgICAgICAgICAgZGVzdHJveV9jb21wb25lbnQodGhpcywgMSk7XG4gICAgICAgICAgICB0aGlzLiRkZXN0cm95ID0gbm9vcDtcbiAgICAgICAgfVxuICAgICAgICAkb24odHlwZSwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIC8vIFRPRE8gc2hvdWxkIHRoaXMgZGVsZWdhdGUgdG8gYWRkRXZlbnRMaXN0ZW5lcj9cbiAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9ICh0aGlzLiQkLmNhbGxiYWNrc1t0eXBlXSB8fCAodGhpcy4kJC5jYWxsYmFja3NbdHlwZV0gPSBbXSkpO1xuICAgICAgICAgICAgY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGNhbGxiYWNrcy5pbmRleE9mKGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKVxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3Muc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgJHNldCgpIHtcbiAgICAgICAgICAgIC8vIG92ZXJyaWRkZW4gYnkgaW5zdGFuY2UsIGlmIGl0IGhhcyBwcm9wc1xuICAgICAgICB9XG4gICAgfTtcbn1cbmNsYXNzIFN2ZWx0ZUNvbXBvbmVudCB7XG4gICAgJGRlc3Ryb3koKSB7XG4gICAgICAgIGRlc3Ryb3lfY29tcG9uZW50KHRoaXMsIDEpO1xuICAgICAgICB0aGlzLiRkZXN0cm95ID0gbm9vcDtcbiAgICB9XG4gICAgJG9uKHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9ICh0aGlzLiQkLmNhbGxiYWNrc1t0eXBlXSB8fCAodGhpcy4kJC5jYWxsYmFja3NbdHlwZV0gPSBbXSkpO1xuICAgICAgICBjYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGNhbGxiYWNrcy5pbmRleE9mKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpXG4gICAgICAgICAgICAgICAgY2FsbGJhY2tzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgICRzZXQoKSB7XG4gICAgICAgIC8vIG92ZXJyaWRkZW4gYnkgaW5zdGFuY2UsIGlmIGl0IGhhcyBwcm9wc1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hfZGV2KHR5cGUsIGRldGFpbCkge1xuICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tX2V2ZW50KHR5cGUsIGRldGFpbCkpO1xufVxuZnVuY3Rpb24gYXBwZW5kX2Rldih0YXJnZXQsIG5vZGUpIHtcbiAgICBkaXNwYXRjaF9kZXYoXCJTdmVsdGVET01JbnNlcnRcIiwgeyB0YXJnZXQsIG5vZGUgfSk7XG4gICAgYXBwZW5kKHRhcmdldCwgbm9kZSk7XG59XG5mdW5jdGlvbiBpbnNlcnRfZGV2KHRhcmdldCwgbm9kZSwgYW5jaG9yKSB7XG4gICAgZGlzcGF0Y2hfZGV2KFwiU3ZlbHRlRE9NSW5zZXJ0XCIsIHsgdGFyZ2V0LCBub2RlLCBhbmNob3IgfSk7XG4gICAgaW5zZXJ0KHRhcmdldCwgbm9kZSwgYW5jaG9yKTtcbn1cbmZ1bmN0aW9uIGRldGFjaF9kZXYobm9kZSkge1xuICAgIGRpc3BhdGNoX2RldihcIlN2ZWx0ZURPTVJlbW92ZVwiLCB7IG5vZGUgfSk7XG4gICAgZGV0YWNoKG5vZGUpO1xufVxuZnVuY3Rpb24gZGV0YWNoX2JldHdlZW5fZGV2KGJlZm9yZSwgYWZ0ZXIpIHtcbiAgICB3aGlsZSAoYmVmb3JlLm5leHRTaWJsaW5nICYmIGJlZm9yZS5uZXh0U2libGluZyAhPT0gYWZ0ZXIpIHtcbiAgICAgICAgZGV0YWNoX2RldihiZWZvcmUubmV4dFNpYmxpbmcpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRldGFjaF9iZWZvcmVfZGV2KGFmdGVyKSB7XG4gICAgd2hpbGUgKGFmdGVyLnByZXZpb3VzU2libGluZykge1xuICAgICAgICBkZXRhY2hfZGV2KGFmdGVyLnByZXZpb3VzU2libGluZyk7XG4gICAgfVxufVxuZnVuY3Rpb24gZGV0YWNoX2FmdGVyX2RldihiZWZvcmUpIHtcbiAgICB3aGlsZSAoYmVmb3JlLm5leHRTaWJsaW5nKSB7XG4gICAgICAgIGRldGFjaF9kZXYoYmVmb3JlLm5leHRTaWJsaW5nKTtcbiAgICB9XG59XG5mdW5jdGlvbiBsaXN0ZW5fZGV2KG5vZGUsIGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zLCBoYXNfcHJldmVudF9kZWZhdWx0LCBoYXNfc3RvcF9wcm9wYWdhdGlvbikge1xuICAgIGNvbnN0IG1vZGlmaWVycyA9IG9wdGlvbnMgPT09IHRydWUgPyBbXCJjYXB0dXJlXCJdIDogb3B0aW9ucyA/IEFycmF5LmZyb20oT2JqZWN0LmtleXMob3B0aW9ucykpIDogW107XG4gICAgaWYgKGhhc19wcmV2ZW50X2RlZmF1bHQpXG4gICAgICAgIG1vZGlmaWVycy5wdXNoKCdwcmV2ZW50RGVmYXVsdCcpO1xuICAgIGlmIChoYXNfc3RvcF9wcm9wYWdhdGlvbilcbiAgICAgICAgbW9kaWZpZXJzLnB1c2goJ3N0b3BQcm9wYWdhdGlvbicpO1xuICAgIGRpc3BhdGNoX2RldihcIlN2ZWx0ZURPTUFkZEV2ZW50TGlzdGVuZXJcIiwgeyBub2RlLCBldmVudCwgaGFuZGxlciwgbW9kaWZpZXJzIH0pO1xuICAgIGNvbnN0IGRpc3Bvc2UgPSBsaXN0ZW4obm9kZSwgZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGRpc3BhdGNoX2RldihcIlN2ZWx0ZURPTVJlbW92ZUV2ZW50TGlzdGVuZXJcIiwgeyBub2RlLCBldmVudCwgaGFuZGxlciwgbW9kaWZpZXJzIH0pO1xuICAgICAgICBkaXNwb3NlKCk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGF0dHJfZGV2KG5vZGUsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcbiAgICBhdHRyKG5vZGUsIGF0dHJpYnV0ZSwgdmFsdWUpO1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKVxuICAgICAgICBkaXNwYXRjaF9kZXYoXCJTdmVsdGVET01SZW1vdmVBdHRyaWJ1dGVcIiwgeyBub2RlLCBhdHRyaWJ1dGUgfSk7XG4gICAgZWxzZVxuICAgICAgICBkaXNwYXRjaF9kZXYoXCJTdmVsdGVET01TZXRBdHRyaWJ1dGVcIiwgeyBub2RlLCBhdHRyaWJ1dGUsIHZhbHVlIH0pO1xufVxuZnVuY3Rpb24gcHJvcF9kZXYobm9kZSwgcHJvcGVydHksIHZhbHVlKSB7XG4gICAgbm9kZVtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICBkaXNwYXRjaF9kZXYoXCJTdmVsdGVET01TZXRQcm9wZXJ0eVwiLCB7IG5vZGUsIHByb3BlcnR5LCB2YWx1ZSB9KTtcbn1cbmZ1bmN0aW9uIGRhdGFzZXRfZGV2KG5vZGUsIHByb3BlcnR5LCB2YWx1ZSkge1xuICAgIG5vZGUuZGF0YXNldFtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICBkaXNwYXRjaF9kZXYoXCJTdmVsdGVET01TZXREYXRhc2V0XCIsIHsgbm9kZSwgcHJvcGVydHksIHZhbHVlIH0pO1xufVxuZnVuY3Rpb24gc2V0X2RhdGFfZGV2KHRleHQsIGRhdGEpIHtcbiAgICBkYXRhID0gJycgKyBkYXRhO1xuICAgIGlmICh0ZXh0LmRhdGEgPT09IGRhdGEpXG4gICAgICAgIHJldHVybjtcbiAgICBkaXNwYXRjaF9kZXYoXCJTdmVsdGVET01TZXREYXRhXCIsIHsgbm9kZTogdGV4dCwgZGF0YSB9KTtcbiAgICB0ZXh0LmRhdGEgPSBkYXRhO1xufVxuY2xhc3MgU3ZlbHRlQ29tcG9uZW50RGV2IGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIGlmICghb3B0aW9ucyB8fCAoIW9wdGlvbnMudGFyZ2V0ICYmICFvcHRpb25zLiQkaW5saW5lKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAndGFyZ2V0JyBpcyBhIHJlcXVpcmVkIG9wdGlvbmApO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuICAgICRkZXN0cm95KCkge1xuICAgICAgICBzdXBlci4kZGVzdHJveSgpO1xuICAgICAgICB0aGlzLiRkZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBDb21wb25lbnQgd2FzIGFscmVhZHkgZGVzdHJveWVkYCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IHsgSHRtbFRhZywgU3ZlbHRlQ29tcG9uZW50LCBTdmVsdGVDb21wb25lbnREZXYsIFN2ZWx0ZUVsZW1lbnQsIGFkZF9hdHRyaWJ1dGUsIGFkZF9jbGFzc2VzLCBhZGRfZmx1c2hfY2FsbGJhY2ssIGFkZF9sb2NhdGlvbiwgYWRkX3JlbmRlcl9jYWxsYmFjaywgYWRkX3Jlc2l6ZV9saXN0ZW5lciwgYWRkX3RyYW5zZm9ybSwgYWZ0ZXJVcGRhdGUsIGFwcGVuZCwgYXBwZW5kX2RldiwgYXNzaWduLCBhdHRyLCBhdHRyX2RldiwgYmVmb3JlVXBkYXRlLCBiaW5kLCBiaW5kaW5nX2NhbGxiYWNrcywgYmxhbmtfb2JqZWN0LCBidWJibGUsIGNoZWNrX291dHJvcywgY2hpbGRyZW4sIGNsYWltX2VsZW1lbnQsIGNsYWltX3NwYWNlLCBjbGFpbV90ZXh0LCBjbGVhcl9sb29wcywgY29tcG9uZW50X3N1YnNjcmliZSwgY3JlYXRlRXZlbnREaXNwYXRjaGVyLCBjcmVhdGVfYW5pbWF0aW9uLCBjcmVhdGVfYmlkaXJlY3Rpb25hbF90cmFuc2l0aW9uLCBjcmVhdGVfaW5fdHJhbnNpdGlvbiwgY3JlYXRlX291dF90cmFuc2l0aW9uLCBjcmVhdGVfc2xvdCwgY3JlYXRlX3Nzcl9jb21wb25lbnQsIGN1cnJlbnRfY29tcG9uZW50LCBjdXN0b21fZXZlbnQsIGRhdGFzZXRfZGV2LCBkZWJ1ZywgZGVzdHJveV9ibG9jaywgZGVzdHJveV9jb21wb25lbnQsIGRlc3Ryb3lfZWFjaCwgZGV0YWNoLCBkZXRhY2hfYWZ0ZXJfZGV2LCBkZXRhY2hfYmVmb3JlX2RldiwgZGV0YWNoX2JldHdlZW5fZGV2LCBkZXRhY2hfZGV2LCBkaXJ0eV9jb21wb25lbnRzLCBkaXNwYXRjaF9kZXYsIGVhY2gsIGVsZW1lbnQsIGVsZW1lbnRfaXMsIGVtcHR5LCBlc2NhcGUsIGVzY2FwZWQsIGV4Y2x1ZGVfaW50ZXJuYWxfcHJvcHMsIGZpeF9hbmRfZGVzdHJveV9ibG9jaywgZml4X2FuZF9vdXRyb19hbmRfZGVzdHJveV9ibG9jaywgZml4X3Bvc2l0aW9uLCBmbHVzaCwgZ2V0Q29udGV4dCwgZ2V0X2JpbmRpbmdfZ3JvdXBfdmFsdWUsIGdldF9jdXJyZW50X2NvbXBvbmVudCwgZ2V0X3Nsb3RfY2hhbmdlcywgZ2V0X3Nsb3RfY29udGV4dCwgZ2V0X3NwcmVhZF9vYmplY3QsIGdldF9zcHJlYWRfdXBkYXRlLCBnZXRfc3RvcmVfdmFsdWUsIGdsb2JhbHMsIGdyb3VwX291dHJvcywgaGFuZGxlX3Byb21pc2UsIGlkZW50aXR5LCBpbml0LCBpbnNlcnQsIGluc2VydF9kZXYsIGludHJvcywgaW52YWxpZF9hdHRyaWJ1dGVfbmFtZV9jaGFyYWN0ZXIsIGlzX2NsaWVudCwgaXNfZnVuY3Rpb24sIGlzX3Byb21pc2UsIGxpc3RlbiwgbGlzdGVuX2RldiwgbG9vcCwgbWVhc3VyZSwgbWlzc2luZ19jb21wb25lbnQsIG1vdW50X2NvbXBvbmVudCwgbm9vcCwgbm90X2VxdWFsLCBub3csIG51bGxfdG9fZW1wdHksIG9iamVjdF93aXRob3V0X3Byb3BlcnRpZXMsIG9uRGVzdHJveSwgb25Nb3VudCwgb25jZSwgb3V0cm9fYW5kX2Rlc3Ryb3lfYmxvY2ssIHByZXZlbnRfZGVmYXVsdCwgcHJvcF9kZXYsIHJhZiwgcnVuLCBydW5fYWxsLCBzYWZlX25vdF9lcXVhbCwgc2NoZWR1bGVfdXBkYXRlLCBzZWxlY3RfbXVsdGlwbGVfdmFsdWUsIHNlbGVjdF9vcHRpb24sIHNlbGVjdF9vcHRpb25zLCBzZWxlY3RfdmFsdWUsIHNlbGYsIHNldENvbnRleHQsIHNldF9hdHRyaWJ1dGVzLCBzZXRfY3VycmVudF9jb21wb25lbnQsIHNldF9jdXN0b21fZWxlbWVudF9kYXRhLCBzZXRfZGF0YSwgc2V0X2RhdGFfZGV2LCBzZXRfaW5wdXRfdHlwZSwgc2V0X2lucHV0X3ZhbHVlLCBzZXRfbm93LCBzZXRfcmFmLCBzZXRfc3RvcmVfdmFsdWUsIHNldF9zdHlsZSwgc2V0X3N2Z19hdHRyaWJ1dGVzLCBzcGFjZSwgc3ByZWFkLCBzdG9wX3Byb3BhZ2F0aW9uLCBzdWJzY3JpYmUsIHN2Z19lbGVtZW50LCB0ZXh0LCB0aWNrLCB0aW1lX3Jhbmdlc190b19hcnJheSwgdG9fbnVtYmVyLCB0b2dnbGVfY2xhc3MsIHRyYW5zaXRpb25faW4sIHRyYW5zaXRpb25fb3V0LCB1cGRhdGVfa2V5ZWRfZWFjaCwgdmFsaWRhdGVfY29tcG9uZW50LCB2YWxpZGF0ZV9zdG9yZSwgeGxpbmtfYXR0ciB9O1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL2thaXNlcm1hbm4vc3ZlbHRlLWNzcy12YXJzXHJcblxyXG5leHBvcnQgY29uc3QgY3NzVmFycyA9IChub2RlLCBwcm9wcykgPT4ge1xyXG4gIE9iamVjdC5lbnRyaWVzKHByb3BzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcclxuICAgIG5vZGUuc3R5bGUuc2V0UHJvcGVydHkoYC0tJHtrZXl9YCwgdmFsdWUpXHJcbiAgfSlcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIHVwZGF0ZShuZXdfcHJvcHMpIHtcclxuICAgICAgT2JqZWN0LmVudHJpZXMobmV3X3Byb3BzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcclxuICAgICAgICBub2RlLnN0eWxlLnNldFByb3BlcnR5KGAtLSR7a2V5fWAsIHZhbHVlKVxyXG4gICAgICAgIGRlbGV0ZSBwcm9wc1trZXldXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICBPYmplY3Qua2V5cyhwcm9wcykuZm9yRWFjaChuYW1lID0+IG5vZGUuc3R5bGUucmVtb3ZlUHJvcGVydHkoYC0tJHtuYW1lfWApKVxyXG4gICAgICBwcm9wcyA9IG5ld19wcm9wc1xyXG4gICAgfSxcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBjcmVhdGVDbGFzc2VzID0gY2xhc3NlcyA9PiB7XHJcbiAgbGV0IGFsbCA9IFwiXCJcclxuICBmb3IgKGxldCBjbHMgaW4gY2xhc3Nlcykge1xyXG4gICAgaWYgKGNsYXNzZXNbY2xzXSkge1xyXG4gICAgICBhbGwgPSBhbGwgKyBcIiBcIiArIGNsc1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gYWxsXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNzc1ZhcnNcclxuIiwiPHNjcmlwdD5cclxuICBpbXBvcnQgeyBjc3NWYXJzLCBjcmVhdGVDbGFzc2VzIH0gZnJvbSBcIi4vY3NzVmFyc1wiXHJcblxyXG4gIGV4cG9ydCBsZXQgY2xhc3NOYW1lID0gXCJcIlxyXG4gIGV4cG9ydCBsZXQgb25Mb2FkXHJcbiAgZXhwb3J0IGxldCB0eXBlXHJcbiAgZXhwb3J0IGxldCBiYWNrZ3JvdW5kQ29sb3JcclxuICBleHBvcnQgbGV0IGNvbG9yXHJcbiAgZXhwb3J0IGxldCBib3JkZXJXaWR0aFxyXG4gIGV4cG9ydCBsZXQgYm9yZGVyQ29sb3JcclxuICBleHBvcnQgbGV0IGJvcmRlclN0eWxlXHJcbiAgZXhwb3J0IGxldCBfYmJcclxuXHJcbiAgbGV0IGNvbnRhaW5lckVsZW1lbnRcclxuICBsZXQgaGFzTG9hZGVkXHJcbiAgbGV0IGN1cnJlbnRDaGlsZHJlblxyXG5cclxuICAkOiBjc3NWYXJpYWJsZXMgPSB7XHJcbiAgICBiYWNrZ3JvdW5kQ29sb3IsXHJcbiAgICBjb2xvcixcclxuICAgIGJvcmRlcldpZHRoLFxyXG4gICAgYm9yZGVyQ29sb3IsXHJcbiAgICBib3JkZXJTdHlsZSxcclxuICB9XHJcbiAgJDogY2xhc3NlcyA9IGAke2NyZWF0ZUNsYXNzZXMoY3NzVmFyaWFibGVzKX0gJHtjbGFzc05hbWV9YFxyXG5cclxuICAkOiB7XHJcbiAgICBpZiAoY29udGFpbmVyRWxlbWVudCkge1xyXG4gICAgICBfYmIuYXR0YWNoQ2hpbGRyZW4oY29udGFpbmVyRWxlbWVudClcclxuICAgICAgaWYgKCFoYXNMb2FkZWQpIHtcclxuICAgICAgICBfYmIuY2FsbChvbkxvYWQpXHJcbiAgICAgICAgaGFzTG9hZGVkID0gdHJ1ZVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG48L3NjcmlwdD5cclxuXHJcbnsjaWYgdHlwZSA9PT0gJ2Rpdid9XHJcbiAgPGRpdlxyXG4gICAgY2xhc3M9e2NsYXNzZXN9XHJcbiAgICBiaW5kOnRoaXM9e2NvbnRhaW5lckVsZW1lbnR9XHJcbiAgICB1c2U6Y3NzVmFycz17Y3NzVmFyaWFibGVzfSAvPlxyXG57OmVsc2UgaWYgdHlwZSA9PT0gJ2hlYWRlcid9XHJcbiAgPGhlYWRlclxyXG4gICAgY2xhc3M9e2NsYXNzZXN9XHJcbiAgICBiaW5kOnRoaXM9e2NvbnRhaW5lckVsZW1lbnR9XHJcbiAgICB1c2U6Y3NzVmFycz17Y3NzVmFyaWFibGVzfSAvPlxyXG57OmVsc2UgaWYgdHlwZSA9PT0gJ21haW4nfVxyXG4gIDxtYWluXHJcbiAgICBjbGFzcz17Y2xhc3Nlc31cclxuICAgIGJpbmQ6dGhpcz17Y29udGFpbmVyRWxlbWVudH1cclxuICAgIHVzZTpjc3NWYXJzPXtjc3NWYXJpYWJsZXN9IC8+XHJcbns6ZWxzZSBpZiB0eXBlID09PSAnZm9vdGVyJ31cclxuICA8Zm9vdGVyXHJcbiAgICBjbGFzcz17Y2xhc3Nlc31cclxuICAgIGJpbmQ6dGhpcz17Y29udGFpbmVyRWxlbWVudH1cclxuICAgIHVzZTpjc3NWYXJzPXtjc3NWYXJpYWJsZXN9IC8+XHJcbns6ZWxzZSBpZiB0eXBlID09PSAnYXNpZGUnfVxyXG4gIDxhc2lkZVxyXG4gICAgY2xhc3M9e2NsYXNzZXN9XHJcbiAgICBiaW5kOnRoaXM9e2NvbnRhaW5lckVsZW1lbnR9XHJcbiAgICB1c2U6Y3NzVmFycz17Y3NzVmFyaWFibGVzfSAvPlxyXG57OmVsc2UgaWYgdHlwZSA9PT0gJ3N1bW1hcnknfVxyXG4gIDxzdW1tYXJ5XHJcbiAgICBjbGFzcz17Y2xhc3Nlc31cclxuICAgIGJpbmQ6dGhpcz17Y29udGFpbmVyRWxlbWVudH1cclxuICAgIHVzZTpjc3NWYXJzPXtjc3NWYXJpYWJsZXN9IC8+XHJcbns6ZWxzZSBpZiB0eXBlID09PSAnZGV0YWlscyd9XHJcbiAgPGRldGFpbHNcclxuICAgIGNsYXNzPXtjbGFzc2VzfVxyXG4gICAgYmluZDp0aGlzPXtjb250YWluZXJFbGVtZW50fVxyXG4gICAgdXNlOmNzc1ZhcnM9e2Nzc1ZhcmlhYmxlc30gLz5cclxuezplbHNlIGlmIHR5cGUgPT09ICdhcnRpY2xlJ31cclxuICA8YXJ0aWNsZVxyXG4gICAgY2xhc3M9e2NsYXNzZXN9XHJcbiAgICBiaW5kOnRoaXM9e2NvbnRhaW5lckVsZW1lbnR9XHJcbiAgICB1c2U6Y3NzVmFycz17Y3NzVmFyaWFibGVzfSAvPlxyXG57OmVsc2UgaWYgdHlwZSA9PT0gJ25hdid9XHJcbiAgPG5hdlxyXG4gICAgY2xhc3M9e2NsYXNzZXN9XHJcbiAgICBiaW5kOnRoaXM9e2NvbnRhaW5lckVsZW1lbnR9XHJcbiAgICB1c2U6Y3NzVmFycz17Y3NzVmFyaWFibGVzfSAvPlxyXG57OmVsc2UgaWYgdHlwZSA9PT0gJ21hcmsnfVxyXG4gIDxtYXJrXHJcbiAgICBjbGFzcz17Y2xhc3Nlc31cclxuICAgIGJpbmQ6dGhpcz17Y29udGFpbmVyRWxlbWVudH1cclxuICAgIHVzZTpjc3NWYXJzPXtjc3NWYXJpYWJsZXN9IC8+XHJcbns6ZWxzZSBpZiB0eXBlID09PSAnZmlndXJlJ31cclxuICA8ZmlndXJlXHJcbiAgICBjbGFzcz17Y2xhc3Nlc31cclxuICAgIGJpbmQ6dGhpcz17Y29udGFpbmVyRWxlbWVudH1cclxuICAgIHVzZTpjc3NWYXJzPXtjc3NWYXJpYWJsZXN9IC8+XHJcbns6ZWxzZSBpZiB0eXBlID09PSAnZmlnY2FwdGlvbid9XHJcbiAgPGZpZ2NhcHRpb25cclxuICAgIGNsYXNzPXtjbGFzc2VzfVxyXG4gICAgYmluZDp0aGlzPXtjb250YWluZXJFbGVtZW50fVxyXG4gICAgdXNlOmNzc1ZhcnM9e2Nzc1ZhcmlhYmxlc30gLz5cclxuezplbHNlIGlmIHR5cGUgPT09ICdwYXJhZ3JhcGgnfVxyXG4gIDxwIGNsYXNzPXtjbGFzc2VzfSBiaW5kOnRoaXM9e2NvbnRhaW5lckVsZW1lbnR9IHVzZTpjc3NWYXJzPXtjc3NWYXJpYWJsZXN9IC8+XHJcbnsvaWZ9XHJcblxyXG48c3R5bGU+XHJcbiAgLmJhY2tncm91bmRDb2xvciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iYWNrZ3JvdW5kQ29sb3IpO1xyXG4gIH1cclxuXHJcbiAgLmNvbG9yIHtcclxuICAgIGNvbG9yOiB2YXIoLS1jb2xvcik7XHJcbiAgfVxyXG5cclxuICAuYm9yZGVyQ29sb3Ige1xyXG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1ib3JkZXJDb2xvcik7XHJcbiAgfVxyXG5cclxuICAuYm9yZGVyV2lkdGgge1xyXG4gICAgYm9yZGVyLXdpZHRoOiB2YXIoLS1ib3JkZXJXaWR0aCk7XHJcbiAgfVxyXG5cclxuICAuYm9yZGVyU3R5bGUge1xyXG4gICAgYm9yZGVyLXN0eWxlOiB2YXIoLS1ib3JkZXJTdHlsZSk7XHJcbiAgfVxyXG48L3N0eWxlPlxyXG4iLCJleHBvcnQgY29uc3QgYnVpbGRTdHlsZSA9IHN0eWxlcyA9PiB7XHJcbiAgbGV0IHN0ciA9IFwiXCJcclxuICBmb3IgKGxldCBzIGluIHN0eWxlcykge1xyXG4gICAgaWYgKHN0eWxlc1tzXSkge1xyXG4gICAgICBzdHIgKz0gYCR7c306ICR7c3R5bGVzW3NdfTsgYFxyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gc3RyXHJcbn1cclxuIiwiPHNjcmlwdD5cclxuICBpbXBvcnQgeyBidWlsZFN0eWxlIH0gZnJvbSBcIi4vYnVpbGRTdHlsZVwiXHJcblxyXG4gIGV4cG9ydCBsZXQgdGV4dCA9IFwiXCJcclxuICBleHBvcnQgbGV0IGNsYXNzTmFtZSA9IFwiXCJcclxuXHJcbiAgZXhwb3J0IGxldCBmb3JtYXR0aW5nVGFnID0gXCJcIlxyXG5cclxuICBleHBvcnQgbGV0IGZvbnQgPSBcIlwiXHJcbiAgZXhwb3J0IGxldCB0ZXh0QWxpZ24gPSBcIlwiXHJcbiAgZXhwb3J0IGxldCB2ZXJ0aWNhbEFsaWduID0gXCJcIlxyXG4gIGV4cG9ydCBsZXQgY29sb3IgPSBcIlwiXHJcblxyXG4gIGV4cG9ydCBsZXQgX2JiXHJcblxyXG4gIGxldCBzdHlsZSA9IFwiXCJcclxuXHJcbiAgY29uc3QgaXNUYWcgPSB0YWcgPT4gKGZvcm1hdHRpbmdUYWcgfHwgXCJcIikuaW5kZXhPZih0YWcpID4gLTFcclxuXHJcbiAgJDoge1xyXG4gICAgc3R5bGUgPSBidWlsZFN0eWxlKHtcclxuICAgICAgZm9udCxcclxuICAgICAgdmVydGljYWxBbGlnbixcclxuICAgICAgY29sb3IsXHJcbiAgICAgIFwidGV4dC1hbGlnblwiOiB0ZXh0QWxpZ24sXHJcbiAgICAgIFwidmVydGljYWwtYWxpZ25cIjogdmVydGljYWxBbGlnbixcclxuICAgIH0pXHJcbiAgfVxyXG48L3NjcmlwdD5cclxuXHJcbnsjaWYgaXNUYWcoJ25vbmUnKX1cclxuICA8c3Bhbj57dGV4dH08L3NwYW4+XHJcbns6ZWxzZSBpZiBpc1RhZygnPGI+Jyl9XHJcbiAgPGIgY2xhc3M9e2NsYXNzTmFtZX0ge3N0eWxlfT57dGV4dH08L2I+XHJcbns6ZWxzZSBpZiBpc1RhZygnPHN0cm9uZz4nKX1cclxuICA8c3Ryb25nIGNsYXNzPXtjbGFzc05hbWV9IHtzdHlsZX0+e3RleHR9PC9zdHJvbmc+XHJcbns6ZWxzZSBpZiBpc1RhZygnPGk+Jyl9XHJcbiAgPGkgY2xhc3M9e2NsYXNzTmFtZX0ge3N0eWxlfT57dGV4dH08L2k+XHJcbns6ZWxzZSBpZiBpc1RhZygnPGVtPicpfVxyXG4gIDxlbSBjbGFzcz17Y2xhc3NOYW1lfSB7c3R5bGV9Pnt0ZXh0fTwvZW0+XHJcbns6ZWxzZSBpZiBpc1RhZygnPG1hcms+Jyl9XHJcbiAgPG1hcmsgY2xhc3M9e2NsYXNzTmFtZX0ge3N0eWxlfT57dGV4dH08L21hcms+XHJcbns6ZWxzZSBpZiBpc1RhZygnPHNtYWxsPicpfVxyXG4gIDxzbWFsbCBjbGFzcz17Y2xhc3NOYW1lfSB7c3R5bGV9Pnt0ZXh0fTwvc21hbGw+XHJcbns6ZWxzZSBpZiBpc1RhZygnPGRlbD4nKX1cclxuICA8ZGVsIGNsYXNzPXtjbGFzc05hbWV9IHtzdHlsZX0+e3RleHR9PC9kZWw+XHJcbns6ZWxzZSBpZiBpc1RhZygnPGlucz4nKX1cclxuICA8aW5zIGNsYXNzPXtjbGFzc05hbWV9IHtzdHlsZX0+e3RleHR9PC9pbnM+XHJcbns6ZWxzZSBpZiBpc1RhZygnPHN1Yj4nKX1cclxuICA8c3ViIGNsYXNzPXtjbGFzc05hbWV9IHtzdHlsZX0+e3RleHR9PC9zdWI+XHJcbns6ZWxzZSBpZiBpc1RhZygnPHN1cD4nKX1cclxuICA8c3VwIGNsYXNzPXtjbGFzc05hbWV9IHtzdHlsZX0+e3RleHR9PC9zdXA+XHJcbns6ZWxzZX17dGV4dH17L2lmfVxyXG4iLCI8c2NyaXB0PlxyXG4gIGV4cG9ydCBsZXQgY2xhc3NOYW1lID0gXCJcIlxyXG4gIGV4cG9ydCBsZXQgdHlwZVxyXG4gIGV4cG9ydCBsZXQgX2JiXHJcblxyXG4gIGxldCBjb250YWluZXJFbGVtZW50XHJcblxyXG4gICQ6IGNvbnRhaW5lckVsZW1lbnQgJiYgX2JiLmF0dGFjaENoaWxkcmVuKGNvbnRhaW5lckVsZW1lbnQpXHJcbjwvc2NyaXB0PlxyXG5cclxueyNpZiB0eXBlID09PSAnaDEnfVxyXG4gIDxoMSBjbGFzcz17Y2xhc3NOYW1lfSBiaW5kOnRoaXM9e2NvbnRhaW5lckVsZW1lbnR9IC8+XHJcbns6ZWxzZSBpZiB0eXBlID09PSAnaDInfVxyXG4gIDxoMiBjbGFzcz17Y2xhc3NOYW1lfSBiaW5kOnRoaXM9e2NvbnRhaW5lckVsZW1lbnR9IC8+XHJcbns6ZWxzZSBpZiB0eXBlID09PSAnaDMnfVxyXG4gIDxoMyBjbGFzcz17Y2xhc3NOYW1lfSBiaW5kOnRoaXM9e2NvbnRhaW5lckVsZW1lbnR9IC8+XHJcbns6ZWxzZSBpZiB0eXBlID09PSAnaDQnfVxyXG4gIDxoNCBjbGFzcz17Y2xhc3NOYW1lfSBiaW5kOnRoaXM9e2NvbnRhaW5lckVsZW1lbnR9IC8+XHJcbns6ZWxzZSBpZiB0eXBlID09PSAnaDUnfVxyXG4gIDxoNSBjbGFzcz17Y2xhc3NOYW1lfSBiaW5kOnRoaXM9e2NvbnRhaW5lckVsZW1lbnR9IC8+XHJcbns6ZWxzZSBpZiB0eXBlID09PSAnaDYnfVxyXG4gIDxoNiBjbGFzcz17Y2xhc3NOYW1lfSBiaW5kOnRoaXM9e2NvbnRhaW5lckVsZW1lbnR9IC8+XHJcbnsvaWZ9XHJcbiIsIjxzY3JpcHQ+XHJcbiAgZXhwb3J0IGxldCB2YWx1ZSA9IFwiXCJcclxuICBleHBvcnQgbGV0IGNsYXNzTmFtZSA9IFwiXCJcclxuICBleHBvcnQgbGV0IHR5cGUgPSBcInRleHRcIlxyXG5cclxuICBleHBvcnQgbGV0IF9iYlxyXG5cclxuICBsZXQgYWN0dWFsVmFsdWUgPSBcIlwiXHJcblxyXG4gIGNvbnN0IG9uY2hhbmdlID0gZXYgPT4ge1xyXG4gICAgaWYgKF9iYikge1xyXG4gICAgICBfYmIuc2V0U3RhdGVGcm9tQmluZGluZyhfYmIucHJvcHMudmFsdWUsIGV2LnRhcmdldC52YWx1ZSlcclxuICAgIH1cclxuICB9XHJcbjwvc2NyaXB0PlxyXG5cclxuPGlucHV0IGNsYXNzPXtjbGFzc05hbWV9IHt0eXBlfSB7dmFsdWV9IG9uOmNoYW5nZT17b25jaGFuZ2V9IC8+XHJcbiIsIjxzY3JpcHQ+XHJcbiAgZXhwb3J0IGxldCB2YWx1ZSA9IFwiXCJcclxuICBleHBvcnQgbGV0IGNsYXNzTmFtZSA9IFwiXCJcclxuXHJcbiAgZXhwb3J0IGxldCBfYmJcclxuXHJcbiAgbGV0IGFjdHVhbFZhbHVlID0gXCJcIlxyXG4gIGxldCBzZWxlY3RFbGVtZW50XHJcblxyXG4gICQ6IHNlbGVjdEVsZW1lbnQgJiYgX2JiLmF0dGFjaENoaWxkcmVuKHNlbGVjdEVsZW1lbnQpXHJcblxyXG4gIGNvbnN0IG9uY2hhbmdlID0gZXYgPT4ge1xyXG4gICAgaWYgKF9iYikge1xyXG4gICAgICBfYmIuc2V0U3RhdGVGcm9tQmluZGluZyhfYmIucHJvcHMudmFsdWUsIGV2LnRhcmdldC52YWx1ZSlcclxuICAgIH1cclxuICB9XHJcbjwvc2NyaXB0PlxyXG5cclxuPHNlbGVjdFxyXG4gIGNsYXNzPXtjbGFzc05hbWV9XHJcbiAge3ZhbHVlfVxyXG4gIG9uOmNoYW5nZT17b25jaGFuZ2V9XHJcbiAgYmluZDp0aGlzPXtzZWxlY3RFbGVtZW50fSAvPlxyXG4iLCI8c2NyaXB0PlxyXG4gIGV4cG9ydCBsZXQgdmFsdWUgPSBcIlwiXHJcbiAgZXhwb3J0IGxldCB0ZXh0ID0gXCJcIlxyXG4gIGV4cG9ydCBsZXQgX2JiXHJcblxyXG4gIGxldCBhY3R1YWxWYWx1ZVxyXG4gIGxldCBhY3R1YWxUZXh0XHJcblxyXG4gICQ6IGFjdHVhbFZhbHVlID0gdmFsdWUgfHwgdGV4dCB8fCBcIlwiXHJcbiAgJDogYWN0dWFsVGV4dCA9IHRleHQgfHwgdmFsdWUgfHwgXCJcIlxyXG48L3NjcmlwdD5cclxuXHJcbjxvcHRpb24gdmFsdWU9e2FjdHVhbFZhbHVlfT57YWN0dWFsVGV4dH08L29wdGlvbj5cclxuIiwiPHNjcmlwdD5cclxuICBpbXBvcnQgeyBjc3NWYXJzLCBjcmVhdGVDbGFzc2VzIH0gZnJvbSBcIi4vY3NzVmFyc1wiXHJcbiAgaW1wb3J0IHsgYnVpbGRTdHlsZSB9IGZyb20gXCIuL2J1aWxkU3R5bGVcIlxyXG4gIGV4cG9ydCBsZXQgY2xhc3NOYW1lID0gXCJkZWZhdWx0XCJcclxuICBleHBvcnQgbGV0IGRpc2FibGVkID0gZmFsc2VcclxuICBleHBvcnQgbGV0IGNvbnRlbnRUZXh0XHJcbiAgZXhwb3J0IGxldCBvbkNsaWNrXHJcbiAgZXhwb3J0IGxldCBiYWNrZ3JvdW5kXHJcbiAgZXhwb3J0IGxldCBjb2xvclxyXG4gIGV4cG9ydCBsZXQgYm9yZGVyXHJcbiAgZXhwb3J0IGxldCBwYWRkaW5nXHJcbiAgZXhwb3J0IGxldCBob3ZlckNvbG9yXHJcbiAgZXhwb3J0IGxldCBob3ZlckJhY2tncm91bmRcclxuICBleHBvcnQgbGV0IGhvdmVyQm9yZGVyXHJcblxyXG4gIGV4cG9ydCBsZXQgX2JiXHJcbiAgbGV0IHRoZUJ1dHRvblxyXG4gIGxldCBjc3NWYXJpYWJsZXNcclxuICBsZXQgYnV0dG9uU3R5bGVzXHJcblxyXG4gIGxldCBjdXN0b21Ib3ZlckNvbG9yQ2xhc3NcclxuICBsZXQgY3VzdG9tSG92ZXJCb3JkZXJDbGFzc1xyXG4gIGxldCBjdXN0b21Ib3ZlckJhY2tDbGFzc1xyXG5cclxuICBsZXQgY3VzdG9tQ2xhc3NlcyA9IFwiXCJcclxuXHJcbiAgJDogaWYgKF9iYi5wcm9wcy5fY2hpbGRyZW4gJiYgX2JiLnByb3BzLl9jaGlsZHJlbi5sZW5ndGggPiAwKVxyXG4gICAgdGhlQnV0dG9uICYmIF9iYi5hdHRhY2hDaGlsZHJlbih0aGVCdXR0b24pXHJcblxyXG4gICQ6IHtcclxuICAgIGNzc1ZhcmlhYmxlcyA9IHtcclxuICAgICAgaG92ZXJDb2xvcixcclxuICAgICAgaG92ZXJCb3JkZXIsXHJcbiAgICAgIGhvdmVyQmFja2dyb3VuZCxcclxuICAgICAgYmFja2dyb3VuZCxcclxuICAgICAgY29sb3IsXHJcbiAgICAgIGJvcmRlcixcclxuICAgIH1cclxuXHJcbiAgICBidXR0b25TdHlsZXMgPSBidWlsZFN0eWxlKHtcclxuICAgICAgcGFkZGluZyxcclxuICAgIH0pXHJcblxyXG4gICAgY3VzdG9tQ2xhc3NlcyA9IGNyZWF0ZUNsYXNzZXMoe1xyXG4gICAgICBob3ZlckNvbG9yLFxyXG4gICAgICBob3ZlckJvcmRlcixcclxuICAgICAgaG92ZXJCYWNrZ3JvdW5kLFxyXG4gICAgICBiYWNrZ3JvdW5kLFxyXG4gICAgICBib3JkZXIsXHJcbiAgICAgIGNvbG9yLFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGNvbnN0IGNsaWNrSGFuZGxlciA9ICgpID0+IHtcclxuICAgIF9iYi5jYWxsKG9uQ2xpY2spXHJcbiAgfVxyXG48L3NjcmlwdD5cclxuXHJcbjxidXR0b25cclxuICBiaW5kOnRoaXM9e3RoZUJ1dHRvbn1cclxuICB1c2U6Y3NzVmFycz17Y3NzVmFyaWFibGVzfVxyXG4gIGNsYXNzPVwie2NsYXNzTmFtZX1cclxuICB7Y3VzdG9tQ2xhc3Nlc31cIlxyXG4gIGRpc2FibGVkPXtkaXNhYmxlZCB8fCBmYWxzZX1cclxuICBvbjpjbGljaz17Y2xpY2tIYW5kbGVyfVxyXG4gIHN0eWxlPXtidXR0b25TdHlsZXN9PlxyXG4gIHsjaWYgIV9iYi5wcm9wcy5fY2hpbGRyZW4gfHwgX2JiLnByb3BzLl9jaGlsZHJlbi5sZW5ndGggPT09IDB9XHJcbiAgICB7Y29udGVudFRleHR9XHJcbiAgey9pZn1cclxuPC9idXR0b24+XHJcblxyXG48c3R5bGU+XHJcbiAgLmRlZmF1bHQge1xyXG4gICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XHJcbiAgICBmb250LXNpemU6IGluaGVyaXQ7XHJcbiAgICBwYWRkaW5nOiAwLjRlbTtcclxuICAgIG1hcmdpbjogMCAwIDAuNWVtIDA7XHJcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcclxuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcclxuICAgIGNvbG9yOiAjMzMzO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y0ZjRmNDtcclxuICAgIG91dGxpbmU6IG5vbmU7XHJcbiAgfVxyXG5cclxuICAuZGVmYXVsdDphY3RpdmUge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDtcclxuICB9XHJcblxyXG4gIC5kZWZhdWx0OmZvY3VzIHtcclxuICAgIGJvcmRlci1jb2xvcjogIzY2NjtcclxuICB9XHJcblxyXG4gIC5ib3JkZXIge1xyXG4gICAgYm9yZGVyOiB2YXIoLS1ib3JkZXIpO1xyXG4gIH1cclxuXHJcbiAgLmNvbG9yIHtcclxuICAgIGNvbG9yOiB2YXIoLS1jb2xvcik7XHJcbiAgfVxyXG5cclxuICAuYmFja2dyb3VuZCB7XHJcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iYWNrZ3JvdW5kKTtcclxuICB9XHJcblxyXG4gIC5ob3ZlckJvcmRlcjpob3ZlciB7XHJcbiAgICBib3JkZXI6IHZhcigtLWhvdmVyQm9yZGVyKTtcclxuICB9XHJcblxyXG4gIC5ob3ZlckNvbG9yOmhvdmVyIHtcclxuICAgIGNvbG9yOiB2YXIoLS1ob3ZlckNvbG9yKTtcclxuICB9XHJcblxyXG4gIC5ob3ZlckJhY2s6aG92ZXIge1xyXG4gICAgYmFja2dyb3VuZDogdmFyKC0taG92ZXJCYWNrZ3JvdW5kKTtcclxuICB9XHJcbjwvc3R5bGU+XHJcbiIsIjxzY3JpcHQ+XHJcbiAgaW1wb3J0IEJ1dHRvbiBmcm9tIFwiLi9CdXR0b24uc3ZlbHRlXCJcclxuXHJcbiAgZXhwb3J0IGxldCB1c2VybmFtZUxhYmVsID0gXCJVc2VybmFtZVwiXHJcbiAgZXhwb3J0IGxldCBwYXNzd29yZExhYmVsID0gXCJQYXNzd29yZFwiXHJcbiAgZXhwb3J0IGxldCBsb2dpbkJ1dHRvbkxhYmVsID0gXCJMb2dpblwiXHJcbiAgZXhwb3J0IGxldCBsb2dpblJlZGlyZWN0ID0gXCJcIlxyXG4gIGV4cG9ydCBsZXQgbG9nbyA9IFwiXCJcclxuICBleHBvcnQgbGV0IGJ1dHRvbkNsYXNzID0gXCJcIlxyXG4gIGV4cG9ydCBsZXQgaW5wdXRDbGFzcyA9IFwiXCJcclxuXHJcbiAgZXhwb3J0IGxldCBfYmJcclxuXHJcbiAgbGV0IHVzZXJuYW1lID0gXCJcIlxyXG4gIGxldCBwYXNzd29yZCA9IFwiXCJcclxuICBsZXQgYnVzeSA9IGZhbHNlXHJcbiAgbGV0IGluY29ycmVjdCA9IGZhbHNlXHJcbiAgbGV0IF9sb2dvID0gXCJcIlxyXG4gIGxldCBfYnV0dG9uQ2xhc3MgPSBcIlwiXHJcbiAgbGV0IF9pbnB1dENsYXNzID0gXCJcIlxyXG5cclxuICAkOiB7XHJcbiAgICBfbG9nbyA9IF9iYi5yZWxhdGl2ZVVybChsb2dvKVxyXG4gICAgX2J1dHRvbkNsYXNzID0gYnV0dG9uQ2xhc3MgfHwgXCJkZWZhdWx0LWJ1dHRvblwiXHJcbiAgICBfaW5wdXRDbGFzcyA9IGlucHV0Q2xhc3MgfHwgXCJkZWZhdWx0LWlucHV0XCJcclxuICB9XHJcblxyXG4gIGNvbnN0IGxvZ2luID0gKCkgPT4ge1xyXG4gICAgYnVzeSA9IHRydWVcclxuICAgIF9iYi5hcGlcclxuICAgICAgLnBvc3QoXCIvYXBpL2F1dGhlbnRpY2F0ZVwiLCB7IHVzZXJuYW1lLCBwYXNzd29yZCB9KVxyXG4gICAgICAudGhlbihyID0+IHtcclxuICAgICAgICBidXN5ID0gZmFsc2VcclxuICAgICAgICBpZiAoci5zdGF0dXMgPT09IDIwMCkge1xyXG4gICAgICAgICAgcmV0dXJuIHIuanNvbigpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGluY29ycmVjdCA9IHRydWVcclxuICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLnRoZW4odXNlciA9PiB7XHJcbiAgICAgICAgaWYgKHVzZXIpIHtcclxuICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiYnVkaWJhc2U6dXNlclwiLCBKU09OLnN0cmluZ2lmeSh1c2VyKSlcclxuICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gIH1cclxuPC9zY3JpcHQ+XHJcblxyXG48ZGl2IGNsYXNzPVwicm9vdFwiPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiY29udGVudFwiPlxyXG5cclxuICAgIHsjaWYgX2xvZ299XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJsb2dvLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxpbWcgc3JjPXtfbG9nb30gYWx0PVwibG9nb1wiIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgey9pZn1cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1yb290XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbFwiPnt1c2VybmFtZUxhYmVsfTwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxyXG4gICAgICAgIDxpbnB1dCBiaW5kOnZhbHVlPXt1c2VybmFtZX0gdHlwZT1cInRleHRcIiBjbGFzcz17X2lucHV0Q2xhc3N9IC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibGFiZWxcIj57cGFzc3dvcmRMYWJlbH08L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cclxuICAgICAgICA8aW5wdXQgYmluZDp2YWx1ZT17cGFzc3dvcmR9IHR5cGU9XCJwYXNzd29yZFwiIGNsYXNzPXtfaW5wdXRDbGFzc30gLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwibG9naW4tYnV0dG9uLWNvbnRhaW5lclwiPlxyXG4gICAgICA8YnV0dG9uIGRpc2FibGVkPXtidXN5fSBvbjpjbGljaz17bG9naW59IGNsYXNzPXtfYnV0dG9uQ2xhc3N9PlxyXG4gICAgICAgIHtsb2dpbkJ1dHRvbkxhYmVsfVxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIHsjaWYgaW5jb3JyZWN0fVxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaW5jb3JyZWN0LWRldGFpbHMtcGFuZWxcIj5JbmNvcnJlY3QgdXNlcm5hbWUgb3IgcGFzc3dvcmQ8L2Rpdj5cclxuICAgIHsvaWZ9XHJcblxyXG4gIDwvZGl2PlxyXG5cclxuPC9kaXY+XHJcblxyXG48c3R5bGU+XHJcbiAgLnJvb3Qge1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgZGlzcGxheTogZ3JpZDtcclxuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogW2xlZnRdIDFmciBbbWlkZGxlXSBhdXRvIFtyaWdodF0gMWZyO1xyXG4gICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiBbdG9wXSAxZnIgW2NlbnRlcl0gYXV0byBbYm90dG9tXSAxZnI7XHJcbiAgfVxyXG5cclxuICAuY29udGVudCB7XHJcbiAgICBncmlkLWNvbHVtbi1zdGFydDogbWlkZGxlO1xyXG4gICAgZ3JpZC1yb3ctc3RhcnQ6IGNlbnRlcjtcclxuICAgIHdpZHRoOiA0MDBweDtcclxuICB9XHJcblxyXG4gIC5sb2dvLWNvbnRhaW5lciB7XHJcbiAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xyXG4gIH1cclxuXHJcbiAgLmxvZ28tY29udGFpbmVyID4gaW1nIHtcclxuICAgIG1heC13aWR0aDogMTAwJTtcclxuICB9XHJcblxyXG4gIC5sb2dpbi1idXR0b24tY29udGFpbmVyIHtcclxuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xyXG4gICAgbWFyZ2luLXRvcDogMjBweDtcclxuICB9XHJcblxyXG4gIC5pbmNvcnJlY3QtZGV0YWlscy1wYW5lbCB7XHJcbiAgICBtYXJnaW4tdG9wOiAzMHB4O1xyXG4gICAgcGFkZGluZzogMTBweDtcclxuICAgIGJvcmRlci1zdHlsZTogc29saWQ7XHJcbiAgICBib3JkZXItd2lkdGg6IDFweDtcclxuICAgIGJvcmRlci1jb2xvcjogbWFyb29uO1xyXG4gICAgYm9yZGVyLXJhZGl1czogMXB4O1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgY29sb3I6IG1hcm9vbjtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IG1pc3R5cm9zZTtcclxuICB9XHJcblxyXG4gIC5mb3JtLXJvb3Qge1xyXG4gICAgZGlzcGxheTogZ3JpZDtcclxuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogW2xhYmVsXSBhdXRvIFtjb250cm9sXSAxZnI7IC8qIFtvdmVyZmxvd10gYXV0bzsqL1xyXG4gIH1cclxuXHJcbiAgLmxhYmVsIHtcclxuICAgIGdyaWQtY29sdW1uLXN0YXJ0OiBsYWJlbDtcclxuICAgIHBhZGRpbmc6IDVweCAxMHB4O1xyXG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcclxuICB9XHJcbiAgLmNvbnRyb2wge1xyXG4gICAgZ3JpZC1jb2x1bW4tc3RhcnQ6IGNvbnRyb2w7XHJcbiAgICBwYWRkaW5nOiA1cHggMTBweDtcclxuICB9XHJcblxyXG4gIC5kZWZhdWx0LWlucHV0IHtcclxuICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xyXG4gICAgZm9udC1zaXplOiBpbmhlcml0O1xyXG4gICAgcGFkZGluZzogMC40ZW07XHJcbiAgICBtYXJnaW46IDAgMCAwLjVlbSAwO1xyXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XHJcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICB9XHJcblxyXG4gIC5kZWZhdWx0LWJ1dHRvbiB7XHJcbiAgICBmb250LWZhbWlseTogaW5oZXJpdDtcclxuICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcclxuICAgIHBhZGRpbmc6IDAuNGVtO1xyXG4gICAgbWFyZ2luOiAwIDAgMC41ZW0gMDtcclxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xyXG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xyXG4gICAgY29sb3I6ICMzMzM7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjRmNGY0O1xyXG4gICAgb3V0bGluZTogbm9uZTtcclxuICB9XHJcblxyXG4gIC5kZWZhdWx0LWJ1dHRvbjphY3RpdmUge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDtcclxuICB9XHJcblxyXG4gIC5kZWZhdWx0LWJ1dHRvbjpmb2N1cyB7XHJcbiAgICBib3JkZXItY29sb3I6ICM2NjY7XHJcbiAgfVxyXG48L3N0eWxlPlxyXG4iLCJleHBvcnQgZGVmYXVsdCAoeyByZWNvcmRzIH0pID0+XHJcbiAgcmVjb3Jkcy5tYXAociA9PiAoe1xyXG4gICAgbmFtZTogYFNhdmUgJHtyLm5hbWV9IEJ1dHRvbmAsXHJcbiAgICBwcm9wczogYnV0dG9uUHJvcHMociksXHJcbiAgfSkpXHJcblxyXG5jb25zdCBidXR0b25Qcm9wcyA9IHJlY29yZCA9PiAoe1xyXG4gIF9jb21wb25lbnQ6IFwiQGJ1ZGliYXNlL3N0YW5kYXJkLWNvbXBvbmVudHMvYnV0dG9uXCIsXHJcbiAgX2NoaWxkcmVuOiBbXHJcbiAgICB7XHJcbiAgICAgIF9jb21wb25lbnQ6IFwiQGJ1ZGliYXNlL3N0YW5kYXJkLWNvbXBvbmVudHMvdGV4dFwiLFxyXG4gICAgICB0ZXh0OiBgU2F2ZSAke3JlY29yZC5uYW1lfWAsXHJcbiAgICB9LFxyXG4gIF0sXHJcbiAgb25DbGljazogW1xyXG4gICAge1xyXG4gICAgICBcIiMjZXZlbnRIYW5kbGVyVHlwZVwiOiBcIlNhdmUgUmVjb3JkXCIsXHJcbiAgICAgIHBhcmFtZXRlcnM6IHtcclxuICAgICAgICBzdGF0ZVBhdGg6IGAke3JlY29yZC5uYW1lfWAsXHJcbiAgICAgIH0sXHJcbiAgICB9LFxyXG4gIF0sXHJcbn0pXHJcbiIsIjxzY3JpcHQ+XHJcbiAgaW1wb3J0IHsgY3NzVmFycywgY3JlYXRlQ2xhc3NlcyB9IGZyb20gXCIuL2Nzc1ZhcnNcIlxyXG5cclxuICBleHBvcnQgbGV0IHVybCA9IFwiXCJcclxuICBleHBvcnQgbGV0IHRleHQgPSBcIlwiXHJcbiAgZXhwb3J0IGxldCBvcGVuSW5OZXdUYWIgPSBmYWxzZVxyXG4gIGV4cG9ydCBsZXQgY29sb3JcclxuICBleHBvcnQgbGV0IGhvdmVyQ29sb3JcclxuICBleHBvcnQgbGV0IHVuZGVybGluZSA9IGZhbHNlXHJcbiAgZXhwb3J0IGxldCBmb250U2l6ZVxyXG5cclxuICBleHBvcnQgbGV0IF9iYlxyXG5cclxuICBsZXQgYW5jaG9yRWxlbWVudFxyXG5cclxuICAkOiBhbmNob3JFbGVtZW50ICYmICF0ZXh0ICYmIF9iYi5hdHRhY2hDaGlsZHJlbihhbmNob3JFbGVtZW50KVxyXG4gICQ6IHRhcmdldCA9IG9wZW5Jbk5ld1RhYiA/IFwiX2JsYW5rXCIgOiBcIl9zZWxmXCJcclxuICAkOiBjc3NWYXJpYWJsZXMgPSB7XHJcbiAgICBob3ZlckNvbG9yLFxyXG4gICAgY29sb3IsXHJcbiAgICB0ZXh0RGVjb3JhdGlvbjogdW5kZXJsaW5lID8gXCJ1bmRlcmxpbmVcIiA6IFwibm9uZVwiLFxyXG4gICAgZm9udFNpemUsXHJcbiAgfVxyXG4gICQ6IGNsYXNzZXMgPSBjcmVhdGVDbGFzc2VzKGNzc1ZhcmlhYmxlcylcclxuPC9zY3JpcHQ+XHJcblxyXG48YVxyXG4gIGhyZWY9e3VybH1cclxuICBiaW5kOnRoaXM9e2FuY2hvckVsZW1lbnR9XHJcbiAgY2xhc3M9e2NsYXNzZXN9XHJcbiAge3RhcmdldH1cclxuICB1c2U6Y3NzVmFycz17Y3NzVmFyaWFibGVzfT5cclxuICB7dGV4dH1cclxuPC9hPlxyXG5cclxuPHN0eWxlPlxyXG4gIC5jb2xvciB7XHJcbiAgICBjb2xvcjogdmFyKC0tY29sb3IpO1xyXG4gIH1cclxuXHJcbiAgLmhvdmVyQ29sb3I6aG92ZXIge1xyXG4gICAgY29sb3I6IHZhcigtLWNvbG9yKTtcclxuICB9XHJcblxyXG4gIC50ZXh0RGVjb3JhdGlvbiB7XHJcbiAgICB0ZXh0LWRlY29yYXRpb246IHZhcigtLXRleHREZWNvcmF0aW9uKTtcclxuICB9XHJcblxyXG4gIC5mb250U2l6ZSB7XHJcbiAgICBmb250LXNpemU6IHZhcigtLWZvbnRTaXplKTtcclxuICB9XHJcbjwvc3R5bGU+XHJcbiIsIjxzY3JpcHQ+XHJcbiAgaW1wb3J0IHsgYnVpbGRTdHlsZSB9IGZyb20gXCIuL2J1aWxkU3R5bGVcIlxyXG5cclxuICBleHBvcnQgbGV0IGNsYXNzTmFtZSA9IFwiXCJcclxuICBleHBvcnQgbGV0IHVybCA9IFwiXCJcclxuICBleHBvcnQgbGV0IGRlc2NyaXB0aW9uID0gXCJcIlxyXG4gIGV4cG9ydCBsZXQgaGVpZ2h0XHJcbiAgZXhwb3J0IGxldCB3aWR0aFxyXG5cclxuICAkOiBzdHlsZSA9IGJ1aWxkU3R5bGUoeyBoZWlnaHQsIHdpZHRoIH0pXHJcbjwvc2NyaXB0PlxyXG5cclxuPGltZyBjbGFzcz17Y2xhc3NOYW1lfSB7c3R5bGV9IHNyYz17dXJsfSBhbHQ9e2Rlc2NyaXB0aW9ufSAvPlxyXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsU0FBUyxJQUFJLEdBQUcsR0FBRztBQUNuQixBQWVBLFNBQVMsR0FBRyxDQUFDLEVBQUUsRUFBRTtJQUNiLE9BQU8sRUFBRSxFQUFFLENBQUM7Q0FDZjtBQUNELFNBQVMsWUFBWSxHQUFHO0lBQ3BCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUM5QjtBQUNELFNBQVMsT0FBTyxDQUFDLEdBQUcsRUFBRTtJQUNsQixHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ3BCO0FBQ0QsU0FBUyxXQUFXLENBQUMsS0FBSyxFQUFFO0lBQ3hCLE9BQU8sT0FBTyxLQUFLLEtBQUssVUFBVSxDQUFDO0NBQ3RDO0FBQ0QsU0FBUyxjQUFjLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUMxQixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsS0FBSyxPQUFPLENBQUMsS0FBSyxVQUFVLENBQUMsQ0FBQztDQUNqRztBQUNELEFBb0RBLFNBQVMsYUFBYSxDQUFDLEtBQUssRUFBRTtJQUMxQixPQUFPLEtBQUssSUFB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