@beiguancyc/parse-server 9.9.0-ruixiang.1

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 (251) hide show
  1. package/LICENSE +176 -0
  2. package/NOTICE +10 -0
  3. package/README.md +1311 -0
  4. package/bin/parse-live-query-server +3 -0
  5. package/bin/parse-server +3 -0
  6. package/lib/AccountLockout.js +149 -0
  7. package/lib/Adapters/AdapterLoader.js +60 -0
  8. package/lib/Adapters/Analytics/AnalyticsAdapter.js +32 -0
  9. package/lib/Adapters/Auth/AuthAdapter.js +132 -0
  10. package/lib/Adapters/Auth/BaseCodeAuthAdapter.js +119 -0
  11. package/lib/Adapters/Auth/OAuth1Client.js +204 -0
  12. package/lib/Adapters/Auth/apple.js +125 -0
  13. package/lib/Adapters/Auth/facebook.js +187 -0
  14. package/lib/Adapters/Auth/gcenter.js +217 -0
  15. package/lib/Adapters/Auth/github.js +125 -0
  16. package/lib/Adapters/Auth/google.js +122 -0
  17. package/lib/Adapters/Auth/gpgames.js +125 -0
  18. package/lib/Adapters/Auth/httpsRequest.js +41 -0
  19. package/lib/Adapters/Auth/index.js +248 -0
  20. package/lib/Adapters/Auth/instagram.js +118 -0
  21. package/lib/Adapters/Auth/janraincapture.js +85 -0
  22. package/lib/Adapters/Auth/janrainengage.js +57 -0
  23. package/lib/Adapters/Auth/keycloak.js +168 -0
  24. package/lib/Adapters/Auth/ldap.js +193 -0
  25. package/lib/Adapters/Auth/line.js +125 -0
  26. package/lib/Adapters/Auth/linkedin.js +117 -0
  27. package/lib/Adapters/Auth/meetup.js +44 -0
  28. package/lib/Adapters/Auth/mfa.js +334 -0
  29. package/lib/Adapters/Auth/microsoft.js +111 -0
  30. package/lib/Adapters/Auth/oauth2.js +115 -0
  31. package/lib/Adapters/Auth/phantauth.js +53 -0
  32. package/lib/Adapters/Auth/qq.js +113 -0
  33. package/lib/Adapters/Auth/spotify.js +115 -0
  34. package/lib/Adapters/Auth/twitter.js +197 -0
  35. package/lib/Adapters/Auth/utils.js +28 -0
  36. package/lib/Adapters/Auth/vkontakte.js +55 -0
  37. package/lib/Adapters/Auth/wechat.js +110 -0
  38. package/lib/Adapters/Auth/weibo.js +141 -0
  39. package/lib/Adapters/Cache/CacheAdapter.js +40 -0
  40. package/lib/Adapters/Cache/InMemoryCache.js +61 -0
  41. package/lib/Adapters/Cache/InMemoryCacheAdapter.js +34 -0
  42. package/lib/Adapters/Cache/LRUCache.js +35 -0
  43. package/lib/Adapters/Cache/NullCacheAdapter.js +26 -0
  44. package/lib/Adapters/Cache/RedisCacheAdapter.js +109 -0
  45. package/lib/Adapters/Cache/SchemaCache.js +25 -0
  46. package/lib/Adapters/Email/MailAdapter.js +32 -0
  47. package/lib/Adapters/Files/FilesAdapter.js +129 -0
  48. package/lib/Adapters/Files/GridFSBucketAdapter.js +280 -0
  49. package/lib/Adapters/Files/GridStoreAdapter.js +5 -0
  50. package/lib/Adapters/Logger/LoggerAdapter.js +27 -0
  51. package/lib/Adapters/Logger/WinstonLogger.js +107 -0
  52. package/lib/Adapters/Logger/WinstonLoggerAdapter.js +63 -0
  53. package/lib/Adapters/MessageQueue/EventEmitterMQ.js +55 -0
  54. package/lib/Adapters/PubSub/EventEmitterPubSub.js +53 -0
  55. package/lib/Adapters/PubSub/PubSubAdapter.js +34 -0
  56. package/lib/Adapters/PubSub/RedisPubSub.js +49 -0
  57. package/lib/Adapters/Push/PushAdapter.js +40 -0
  58. package/lib/Adapters/Storage/Mongo/MongoCollection.js +212 -0
  59. package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +334 -0
  60. package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +1047 -0
  61. package/lib/Adapters/Storage/Mongo/MongoTransform.js +1397 -0
  62. package/lib/Adapters/Storage/Postgres/PostgresClient.js +38 -0
  63. package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +73 -0
  64. package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +2409 -0
  65. package/lib/Adapters/Storage/Postgres/sql/array/add-unique.sql +11 -0
  66. package/lib/Adapters/Storage/Postgres/sql/array/add.sql +11 -0
  67. package/lib/Adapters/Storage/Postgres/sql/array/contains-all-regex.sql +14 -0
  68. package/lib/Adapters/Storage/Postgres/sql/array/contains-all.sql +14 -0
  69. package/lib/Adapters/Storage/Postgres/sql/array/contains.sql +11 -0
  70. package/lib/Adapters/Storage/Postgres/sql/array/remove.sql +11 -0
  71. package/lib/Adapters/Storage/Postgres/sql/index.js +32 -0
  72. package/lib/Adapters/Storage/Postgres/sql/misc/json-object-set-keys.sql +19 -0
  73. package/lib/Adapters/Storage/StorageAdapter.js +2 -0
  74. package/lib/Adapters/WebSocketServer/WSAdapter.js +35 -0
  75. package/lib/Adapters/WebSocketServer/WSSAdapter.js +66 -0
  76. package/lib/Auth.js +687 -0
  77. package/lib/AuthDataLock.js +53 -0
  78. package/lib/ClientSDK.js +39 -0
  79. package/lib/Config.js +879 -0
  80. package/lib/Controllers/AdaptableController.js +72 -0
  81. package/lib/Controllers/AnalyticsController.js +43 -0
  82. package/lib/Controllers/CacheController.js +71 -0
  83. package/lib/Controllers/DatabaseController.js +1685 -0
  84. package/lib/Controllers/FilesController.js +122 -0
  85. package/lib/Controllers/HooksController.js +254 -0
  86. package/lib/Controllers/LiveQueryController.js +72 -0
  87. package/lib/Controllers/LoggerController.js +222 -0
  88. package/lib/Controllers/ParseGraphQLController.js +294 -0
  89. package/lib/Controllers/PushController.js +224 -0
  90. package/lib/Controllers/SchemaController.js +1563 -0
  91. package/lib/Controllers/UserController.js +364 -0
  92. package/lib/Controllers/index.js +251 -0
  93. package/lib/Controllers/types.js +2 -0
  94. package/lib/Deprecator/Deprecations.js +100 -0
  95. package/lib/Deprecator/Deprecator.js +140 -0
  96. package/lib/Error.js +50 -0
  97. package/lib/FileUrlValidator.js +69 -0
  98. package/lib/GraphQL/ParseGraphQLSchema.js +375 -0
  99. package/lib/GraphQL/ParseGraphQLServer.js +241 -0
  100. package/lib/GraphQL/helpers/objectsMutations.js +30 -0
  101. package/lib/GraphQL/helpers/objectsQueries.js +246 -0
  102. package/lib/GraphQL/helpers/queryComplexity.js +138 -0
  103. package/lib/GraphQL/loaders/configMutations.js +87 -0
  104. package/lib/GraphQL/loaders/configQueries.js +79 -0
  105. package/lib/GraphQL/loaders/defaultGraphQLMutations.js +21 -0
  106. package/lib/GraphQL/loaders/defaultGraphQLQueries.js +23 -0
  107. package/lib/GraphQL/loaders/defaultGraphQLTypes.js +1099 -0
  108. package/lib/GraphQL/loaders/defaultRelaySchema.js +53 -0
  109. package/lib/GraphQL/loaders/filesMutations.js +107 -0
  110. package/lib/GraphQL/loaders/functionsMutations.js +77 -0
  111. package/lib/GraphQL/loaders/parseClassMutations.js +267 -0
  112. package/lib/GraphQL/loaders/parseClassQueries.js +126 -0
  113. package/lib/GraphQL/loaders/parseClassTypes.js +493 -0
  114. package/lib/GraphQL/loaders/schemaDirectives.js +62 -0
  115. package/lib/GraphQL/loaders/schemaMutations.js +161 -0
  116. package/lib/GraphQL/loaders/schemaQueries.js +80 -0
  117. package/lib/GraphQL/loaders/schemaTypes.js +341 -0
  118. package/lib/GraphQL/loaders/usersMutations.js +433 -0
  119. package/lib/GraphQL/loaders/usersQueries.js +90 -0
  120. package/lib/GraphQL/parseGraphQLUtils.js +71 -0
  121. package/lib/GraphQL/transformers/className.js +14 -0
  122. package/lib/GraphQL/transformers/constraintType.js +53 -0
  123. package/lib/GraphQL/transformers/inputType.js +51 -0
  124. package/lib/GraphQL/transformers/mutation.js +280 -0
  125. package/lib/GraphQL/transformers/outputType.js +51 -0
  126. package/lib/GraphQL/transformers/query.js +237 -0
  127. package/lib/GraphQL/transformers/schemaFields.js +99 -0
  128. package/lib/InstallationDedup.js +178 -0
  129. package/lib/KeyPromiseQueue.js +48 -0
  130. package/lib/LiveQuery/Client.js +90 -0
  131. package/lib/LiveQuery/Id.js +20 -0
  132. package/lib/LiveQuery/ParseCloudCodePublisher.js +54 -0
  133. package/lib/LiveQuery/ParseLiveQueryServer.js +1071 -0
  134. package/lib/LiveQuery/ParsePubSub.js +37 -0
  135. package/lib/LiveQuery/ParseWebSocketServer.js +66 -0
  136. package/lib/LiveQuery/QueryTools.js +443 -0
  137. package/lib/LiveQuery/RequestSchema.js +161 -0
  138. package/lib/LiveQuery/SessionTokenCache.js +51 -0
  139. package/lib/LiveQuery/Subscription.js +47 -0
  140. package/lib/LiveQuery/equalObjects.js +50 -0
  141. package/lib/Options/Definitions.js +1599 -0
  142. package/lib/Options/docs.js +389 -0
  143. package/lib/Options/index.js +12 -0
  144. package/lib/Options/parsers.js +89 -0
  145. package/lib/Page.js +44 -0
  146. package/lib/ParseMessageQueue.js +24 -0
  147. package/lib/ParseServer.js +632 -0
  148. package/lib/ParseServerRESTController.js +173 -0
  149. package/lib/PromiseRouter.js +208 -0
  150. package/lib/Push/PushQueue.js +67 -0
  151. package/lib/Push/PushWorker.js +101 -0
  152. package/lib/Push/utils.js +129 -0
  153. package/lib/RestQuery.js +1208 -0
  154. package/lib/RestWrite.js +1671 -0
  155. package/lib/Routers/AggregateRouter.js +150 -0
  156. package/lib/Routers/AnalyticsRouter.js +26 -0
  157. package/lib/Routers/AudiencesRouter.js +54 -0
  158. package/lib/Routers/ClassesRouter.js +191 -0
  159. package/lib/Routers/CloudCodeRouter.js +87 -0
  160. package/lib/Routers/FeaturesRouter.js +72 -0
  161. package/lib/Routers/FilesRouter.js +772 -0
  162. package/lib/Routers/FunctionsRouter.js +341 -0
  163. package/lib/Routers/GlobalConfigRouter.js +123 -0
  164. package/lib/Routers/GraphQLRouter.js +41 -0
  165. package/lib/Routers/HooksRouter.js +121 -0
  166. package/lib/Routers/IAPValidationRouter.js +113 -0
  167. package/lib/Routers/InstallationsRouter.js +46 -0
  168. package/lib/Routers/LogsRouter.js +57 -0
  169. package/lib/Routers/PagesRouter.js +676 -0
  170. package/lib/Routers/PurgeRouter.js +45 -0
  171. package/lib/Routers/PushRouter.js +75 -0
  172. package/lib/Routers/RolesRouter.js +33 -0
  173. package/lib/Routers/SchemasRouter.js +118 -0
  174. package/lib/Routers/SecurityRouter.js +34 -0
  175. package/lib/Routers/SessionsRouter.js +126 -0
  176. package/lib/Routers/UsersRouter.js +733 -0
  177. package/lib/SchemaMigrations/DefinedSchemas.js +379 -0
  178. package/lib/SchemaMigrations/Migrations.js +30 -0
  179. package/lib/Security/Check.js +109 -0
  180. package/lib/Security/CheckGroup.js +44 -0
  181. package/lib/Security/CheckGroups/CheckGroupDatabase.js +44 -0
  182. package/lib/Security/CheckGroups/CheckGroupServerConfig.js +160 -0
  183. package/lib/Security/CheckGroups/CheckGroups.js +21 -0
  184. package/lib/Security/CheckRunner.js +213 -0
  185. package/lib/SharedRest.js +34 -0
  186. package/lib/StatusHandler.js +329 -0
  187. package/lib/TestUtils.js +87 -0
  188. package/lib/Utils.js +577 -0
  189. package/lib/batch.js +185 -0
  190. package/lib/cache.js +12 -0
  191. package/lib/cli/definitions/parse-live-query-server.js +9 -0
  192. package/lib/cli/definitions/parse-server.js +9 -0
  193. package/lib/cli/parse-live-query-server.js +14 -0
  194. package/lib/cli/parse-server.js +101 -0
  195. package/lib/cli/utils/commander.js +132 -0
  196. package/lib/cli/utils/runner.js +53 -0
  197. package/lib/cloud-code/Parse.Cloud.js +797 -0
  198. package/lib/cloud-code/Parse.Server.js +21 -0
  199. package/lib/cryptoUtils.js +54 -0
  200. package/lib/defaults.js +58 -0
  201. package/lib/deprecated.js +12 -0
  202. package/lib/index.js +89 -0
  203. package/lib/logger.js +40 -0
  204. package/lib/middlewares.js +810 -0
  205. package/lib/password.js +40 -0
  206. package/lib/request.js +175 -0
  207. package/lib/requiredParameter.js +11 -0
  208. package/lib/rest.js +264 -0
  209. package/lib/triggers.js +949 -0
  210. package/lib/vendor/README.md +8 -0
  211. package/lib/vendor/mongodbUrl.js +1012 -0
  212. package/package.json +172 -0
  213. package/postinstall.js +38 -0
  214. package/public/custom_json.html +17 -0
  215. package/public/custom_json.json +23 -0
  216. package/public/custom_page.html +15 -0
  217. package/public/de/email_verification_link_expired.html +24 -0
  218. package/public/de/email_verification_link_invalid.html +21 -0
  219. package/public/de/email_verification_send_fail.html +21 -0
  220. package/public/de/email_verification_send_success.html +19 -0
  221. package/public/de/email_verification_success.html +18 -0
  222. package/public/de/password_reset.html +65 -0
  223. package/public/de/password_reset_link_invalid.html +19 -0
  224. package/public/de/password_reset_success.html +18 -0
  225. package/public/de-AT/email_verification_link_expired.html +24 -0
  226. package/public/de-AT/email_verification_link_invalid.html +21 -0
  227. package/public/de-AT/email_verification_send_fail.html +21 -0
  228. package/public/de-AT/email_verification_send_success.html +19 -0
  229. package/public/de-AT/email_verification_success.html +18 -0
  230. package/public/de-AT/password_reset.html +65 -0
  231. package/public/de-AT/password_reset_link_invalid.html +19 -0
  232. package/public/de-AT/password_reset_success.html +18 -0
  233. package/public/email_verification_link_expired.html +24 -0
  234. package/public/email_verification_link_invalid.html +21 -0
  235. package/public/email_verification_send_fail.html +21 -0
  236. package/public/email_verification_send_success.html +19 -0
  237. package/public/email_verification_success.html +18 -0
  238. package/public/password_reset.html +65 -0
  239. package/public/password_reset_link_invalid.html +19 -0
  240. package/public/password_reset_success.html +18 -0
  241. package/types/@types/@parse/fs-files-adapter/index.d.ts +5 -0
  242. package/types/@types/deepcopy/index.d.ts +5 -0
  243. package/types/LiveQuery/ParseLiveQueryServer.d.ts +40 -0
  244. package/types/Options/index.d.ts +320 -0
  245. package/types/ParseServer.d.ts +65 -0
  246. package/types/eslint.config.mjs +30 -0
  247. package/types/index.d.ts +21 -0
  248. package/types/logger.d.ts +2 -0
  249. package/types/tests.ts +44 -0
  250. package/types/tsconfig.json +24 -0
  251. package/views/choose_password +215 -0
@@ -0,0 +1,1099 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.GLOBAL_OR_OBJECT_ID_ATT = exports.GEO_WITHIN_INPUT = exports.GEO_POINT_WHERE_INPUT = exports.GEO_POINT_INPUT = exports.GEO_POINT_FIELDS = exports.GEO_POINT = exports.GEO_INTERSECTS_INPUT = exports.FILE_WHERE_INPUT = exports.FILE_INPUT = exports.FILE_INFO = exports.FILE = exports.ELEMENT = exports.DATE_WHERE_INPUT = exports.DATE = exports.CREATE_RESULT_FIELDS = exports.CREATED_AT_ATT = exports.COUNT_ATT = exports.CLASS_NAME_ATT = exports.CENTER_SPHERE_INPUT = exports.BYTES_WHERE_INPUT = exports.BYTES = exports.BOX_INPUT = exports.BOOLEAN_WHERE_INPUT = exports.ARRAY_WHERE_INPUT = exports.ARRAY_RESULT = exports.ANY = exports.ACL_INPUT = exports.ACL = void 0;
7
+ Object.defineProperty(exports, "GraphQLUpload", {
8
+ enumerable: true,
9
+ get: function () {
10
+ return _GraphQLUpload.default;
11
+ }
12
+ });
13
+ exports.serializeDateIso = exports.parseValue = exports.parseStringValue = exports.parseObjectFields = exports.parseListValues = exports.parseIntValue = exports.parseFloatValue = exports.parseFileValue = exports.parseDateIsoValue = exports.parseBooleanValue = exports.options = exports.notInQueryKey = exports.notIn = exports.notEqualTo = exports.matchesRegex = exports.loadArrayResult = exports.load = exports.lessThanOrEqualTo = exports.lessThan = exports.inQueryKey = exports.inOp = exports.greaterThanOrEqualTo = exports.greaterThan = exports.exists = exports.equalTo = exports.WITHIN_INPUT = exports.WHERE_ATT = exports.USER_ACL_INPUT = exports.USER_ACL = exports.UPDATE_RESULT_FIELDS = exports.UPDATED_AT_ATT = exports.TypeValidationError = exports.TEXT_INPUT = exports.SUBQUERY_READ_PREFERENCE_ATT = exports.SUBQUERY_INPUT = exports.STRING_WHERE_INPUT = exports.SKIP_ATT = exports.SESSION_TOKEN_ATT = exports.SELECT_INPUT = exports.SEARCH_INPUT = exports.ROLE_ACL_INPUT = exports.ROLE_ACL = exports.READ_PREFERENCE_ATT = exports.READ_PREFERENCE = exports.READ_OPTIONS_INPUT = exports.READ_OPTIONS_ATT = exports.PUBLIC_ACL_INPUT = exports.PUBLIC_ACL = exports.POLYGON_WHERE_INPUT = exports.POLYGON_INPUT = exports.POLYGON = exports.PARSE_OBJECT_FIELDS = exports.PARSE_OBJECT = exports.OBJECT_WHERE_INPUT = exports.OBJECT_ID_ATT = exports.OBJECT_ID = exports.OBJECT = exports.NUMBER_WHERE_INPUT = exports.LIMIT_ATT = exports.KEY_VALUE_INPUT = exports.INPUT_FIELDS = exports.INCLUDE_READ_PREFERENCE_ATT = exports.ID_WHERE_INPUT = void 0;
14
+ var _graphql = require("graphql");
15
+ var _graphqlRelay = require("graphql-relay");
16
+ var _GraphQLUpload = _interopRequireDefault(require("graphql-upload/GraphQLUpload.js"));
17
+ var _Utils = _interopRequireDefault(require("../../Utils"));
18
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
19
+ class TypeValidationError extends Error {
20
+ constructor(value, type) {
21
+ super(`${value} is not a valid ${type}`);
22
+ }
23
+ }
24
+ exports.TypeValidationError = TypeValidationError;
25
+ const parseStringValue = value => {
26
+ if (typeof value === 'string') {
27
+ return value;
28
+ }
29
+ throw new TypeValidationError(value, 'String');
30
+ };
31
+ exports.parseStringValue = parseStringValue;
32
+ const parseIntValue = value => {
33
+ if (typeof value === 'string') {
34
+ const int = Number(value);
35
+ if (Number.isInteger(int)) {
36
+ return int;
37
+ }
38
+ }
39
+ throw new TypeValidationError(value, 'Int');
40
+ };
41
+ exports.parseIntValue = parseIntValue;
42
+ const parseFloatValue = value => {
43
+ if (typeof value === 'string') {
44
+ const float = Number(value);
45
+ if (!isNaN(float)) {
46
+ return float;
47
+ }
48
+ }
49
+ throw new TypeValidationError(value, 'Float');
50
+ };
51
+ exports.parseFloatValue = parseFloatValue;
52
+ const parseBooleanValue = value => {
53
+ if (typeof value === 'boolean') {
54
+ return value;
55
+ }
56
+ throw new TypeValidationError(value, 'Boolean');
57
+ };
58
+ exports.parseBooleanValue = parseBooleanValue;
59
+ const parseValue = value => {
60
+ switch (value.kind) {
61
+ case _graphql.Kind.STRING:
62
+ return parseStringValue(value.value);
63
+ case _graphql.Kind.INT:
64
+ return parseIntValue(value.value);
65
+ case _graphql.Kind.FLOAT:
66
+ return parseFloatValue(value.value);
67
+ case _graphql.Kind.BOOLEAN:
68
+ return parseBooleanValue(value.value);
69
+ case _graphql.Kind.LIST:
70
+ return parseListValues(value.values);
71
+ case _graphql.Kind.OBJECT:
72
+ return parseObjectFields(value.fields);
73
+ default:
74
+ return value.value;
75
+ }
76
+ };
77
+ exports.parseValue = parseValue;
78
+ const parseListValues = values => {
79
+ if (Array.isArray(values)) {
80
+ return values.map(value => parseValue(value));
81
+ }
82
+ throw new TypeValidationError(values, 'List');
83
+ };
84
+ exports.parseListValues = parseListValues;
85
+ const parseObjectFields = fields => {
86
+ if (Array.isArray(fields)) {
87
+ return fields.reduce((object, field) => ({
88
+ ...object,
89
+ [field.name.value]: parseValue(field.value)
90
+ }), {});
91
+ }
92
+ throw new TypeValidationError(fields, 'Object');
93
+ };
94
+ exports.parseObjectFields = parseObjectFields;
95
+ const ANY = exports.ANY = new _graphql.GraphQLScalarType({
96
+ name: 'Any',
97
+ description: 'The Any scalar type is used in operations and types that involve any type of value.',
98
+ parseValue: value => value,
99
+ serialize: value => value,
100
+ parseLiteral: ast => parseValue(ast)
101
+ });
102
+ const OBJECT = exports.OBJECT = new _graphql.GraphQLScalarType({
103
+ name: 'Object',
104
+ description: 'The Object scalar type is used in operations and types that involve objects.',
105
+ parseValue(value) {
106
+ if (typeof value === 'object') {
107
+ return value;
108
+ }
109
+ throw new TypeValidationError(value, 'Object');
110
+ },
111
+ serialize(value) {
112
+ if (typeof value === 'object') {
113
+ return value;
114
+ }
115
+ throw new TypeValidationError(value, 'Object');
116
+ },
117
+ parseLiteral(ast) {
118
+ if (ast.kind === _graphql.Kind.OBJECT) {
119
+ return parseObjectFields(ast.fields);
120
+ }
121
+ throw new TypeValidationError(ast.kind, 'Object');
122
+ }
123
+ });
124
+ const parseDateIsoValue = value => {
125
+ if (typeof value === 'string') {
126
+ const date = new Date(value);
127
+ if (!isNaN(date)) {
128
+ return date;
129
+ }
130
+ } else if (_Utils.default.isDate(value)) {
131
+ return value;
132
+ }
133
+ throw new TypeValidationError(value, 'Date');
134
+ };
135
+ exports.parseDateIsoValue = parseDateIsoValue;
136
+ const serializeDateIso = value => {
137
+ if (typeof value === 'string') {
138
+ return value;
139
+ }
140
+ if (_Utils.default.isDate(value)) {
141
+ return value.toISOString();
142
+ }
143
+ throw new TypeValidationError(value, 'Date');
144
+ };
145
+ exports.serializeDateIso = serializeDateIso;
146
+ const parseDateIsoLiteral = ast => {
147
+ if (ast.kind === _graphql.Kind.STRING) {
148
+ return parseDateIsoValue(ast.value);
149
+ }
150
+ throw new TypeValidationError(ast.kind, 'Date');
151
+ };
152
+ const DATE = exports.DATE = new _graphql.GraphQLScalarType({
153
+ name: 'Date',
154
+ description: 'The Date scalar type is used in operations and types that involve dates.',
155
+ parseValue(value) {
156
+ if (typeof value === 'string' || _Utils.default.isDate(value)) {
157
+ return {
158
+ __type: 'Date',
159
+ iso: parseDateIsoValue(value)
160
+ };
161
+ } else if (typeof value === 'object' && value.__type === 'Date' && value.iso) {
162
+ return {
163
+ __type: value.__type,
164
+ iso: parseDateIsoValue(value.iso)
165
+ };
166
+ }
167
+ throw new TypeValidationError(value, 'Date');
168
+ },
169
+ serialize(value) {
170
+ if (typeof value === 'string' || _Utils.default.isDate(value)) {
171
+ return serializeDateIso(value);
172
+ } else if (typeof value === 'object' && value.__type === 'Date' && value.iso) {
173
+ return serializeDateIso(value.iso);
174
+ }
175
+ throw new TypeValidationError(value, 'Date');
176
+ },
177
+ parseLiteral(ast) {
178
+ if (ast.kind === _graphql.Kind.STRING) {
179
+ return {
180
+ __type: 'Date',
181
+ iso: parseDateIsoLiteral(ast)
182
+ };
183
+ } else if (ast.kind === _graphql.Kind.OBJECT) {
184
+ const __type = ast.fields.find(field => field.name.value === '__type');
185
+ const iso = ast.fields.find(field => field.name.value === 'iso');
186
+ if (__type && __type.value && __type.value.value === 'Date' && iso) {
187
+ return {
188
+ __type: __type.value.value,
189
+ iso: parseDateIsoLiteral(iso.value)
190
+ };
191
+ }
192
+ }
193
+ throw new TypeValidationError(ast.kind, 'Date');
194
+ }
195
+ });
196
+ const BYTES = exports.BYTES = new _graphql.GraphQLScalarType({
197
+ name: 'Bytes',
198
+ description: 'The Bytes scalar type is used in operations and types that involve base 64 binary data.',
199
+ parseValue(value) {
200
+ if (typeof value === 'string') {
201
+ return {
202
+ __type: 'Bytes',
203
+ base64: value
204
+ };
205
+ } else if (typeof value === 'object' && value.__type === 'Bytes' && typeof value.base64 === 'string') {
206
+ return value;
207
+ }
208
+ throw new TypeValidationError(value, 'Bytes');
209
+ },
210
+ serialize(value) {
211
+ if (typeof value === 'string') {
212
+ return value;
213
+ } else if (typeof value === 'object' && value.__type === 'Bytes' && typeof value.base64 === 'string') {
214
+ return value.base64;
215
+ }
216
+ throw new TypeValidationError(value, 'Bytes');
217
+ },
218
+ parseLiteral(ast) {
219
+ if (ast.kind === _graphql.Kind.STRING) {
220
+ return {
221
+ __type: 'Bytes',
222
+ base64: ast.value
223
+ };
224
+ } else if (ast.kind === _graphql.Kind.OBJECT) {
225
+ const __type = ast.fields.find(field => field.name.value === '__type');
226
+ const base64 = ast.fields.find(field => field.name.value === 'base64');
227
+ if (__type && __type.value && __type.value.value === 'Bytes' && base64 && base64.value && typeof base64.value.value === 'string') {
228
+ return {
229
+ __type: __type.value.value,
230
+ base64: base64.value.value
231
+ };
232
+ }
233
+ }
234
+ throw new TypeValidationError(ast.kind, 'Bytes');
235
+ }
236
+ });
237
+ const parseFileValue = value => {
238
+ if (typeof value === 'string') {
239
+ return {
240
+ __type: 'File',
241
+ name: value
242
+ };
243
+ } else if (typeof value === 'object' && value.__type === 'File' && typeof value.name === 'string' && (value.url === undefined || typeof value.url === 'string')) {
244
+ return value;
245
+ }
246
+ throw new TypeValidationError(value, 'File');
247
+ };
248
+ exports.parseFileValue = parseFileValue;
249
+ const FILE = exports.FILE = new _graphql.GraphQLScalarType({
250
+ name: 'File',
251
+ description: 'The File scalar type is used in operations and types that involve files.',
252
+ parseValue: parseFileValue,
253
+ serialize: value => {
254
+ if (typeof value === 'string') {
255
+ return value;
256
+ } else if (typeof value === 'object' && value.__type === 'File' && typeof value.name === 'string' && (value.url === undefined || typeof value.url === 'string')) {
257
+ return value.name;
258
+ }
259
+ throw new TypeValidationError(value, 'File');
260
+ },
261
+ parseLiteral(ast) {
262
+ if (ast.kind === _graphql.Kind.STRING) {
263
+ return parseFileValue(ast.value);
264
+ } else if (ast.kind === _graphql.Kind.OBJECT) {
265
+ const __type = ast.fields.find(field => field.name.value === '__type');
266
+ const name = ast.fields.find(field => field.name.value === 'name');
267
+ const url = ast.fields.find(field => field.name.value === 'url');
268
+ if (__type && __type.value && name && name.value) {
269
+ return parseFileValue({
270
+ __type: __type.value.value,
271
+ name: name.value.value,
272
+ url: url && url.value ? url.value.value : undefined
273
+ });
274
+ }
275
+ }
276
+ throw new TypeValidationError(ast.kind, 'File');
277
+ }
278
+ });
279
+ const FILE_INFO = exports.FILE_INFO = new _graphql.GraphQLObjectType({
280
+ name: 'FileInfo',
281
+ description: 'The FileInfo object type is used to return the information about files.',
282
+ fields: {
283
+ name: {
284
+ description: 'This is the file name.',
285
+ type: new _graphql.GraphQLNonNull(_graphql.GraphQLString)
286
+ },
287
+ url: {
288
+ description: 'This is the url in which the file can be downloaded.',
289
+ type: new _graphql.GraphQLNonNull(_graphql.GraphQLString)
290
+ }
291
+ }
292
+ });
293
+ const FILE_INPUT = exports.FILE_INPUT = new _graphql.GraphQLInputObjectType({
294
+ name: 'FileInput',
295
+ description: 'If this field is set to null the file will be unlinked (the file will not be deleted on cloud storage).',
296
+ fields: {
297
+ file: {
298
+ description: 'A File Scalar can be an url or a FileInfo object.',
299
+ type: FILE
300
+ },
301
+ upload: {
302
+ description: 'Use this field if you want to create a new file.',
303
+ type: _GraphQLUpload.default
304
+ }
305
+ }
306
+ });
307
+ const GEO_POINT_FIELDS = exports.GEO_POINT_FIELDS = {
308
+ latitude: {
309
+ description: 'This is the latitude.',
310
+ type: new _graphql.GraphQLNonNull(_graphql.GraphQLFloat)
311
+ },
312
+ longitude: {
313
+ description: 'This is the longitude.',
314
+ type: new _graphql.GraphQLNonNull(_graphql.GraphQLFloat)
315
+ }
316
+ };
317
+ const GEO_POINT_INPUT = exports.GEO_POINT_INPUT = new _graphql.GraphQLInputObjectType({
318
+ name: 'GeoPointInput',
319
+ description: 'The GeoPointInput type is used in operations that involve inputting fields of type geo point.',
320
+ fields: GEO_POINT_FIELDS
321
+ });
322
+ const GEO_POINT = exports.GEO_POINT = new _graphql.GraphQLObjectType({
323
+ name: 'GeoPoint',
324
+ description: 'The GeoPoint object type is used to return the information about geo point fields.',
325
+ fields: GEO_POINT_FIELDS
326
+ });
327
+ const POLYGON_INPUT = exports.POLYGON_INPUT = new _graphql.GraphQLList(new _graphql.GraphQLNonNull(GEO_POINT_INPUT));
328
+ const POLYGON = exports.POLYGON = new _graphql.GraphQLList(new _graphql.GraphQLNonNull(GEO_POINT));
329
+ const USER_ACL_INPUT = exports.USER_ACL_INPUT = new _graphql.GraphQLInputObjectType({
330
+ name: 'UserACLInput',
331
+ description: 'Allow to manage users in ACL.',
332
+ fields: {
333
+ userId: {
334
+ description: 'ID of the targetted User.',
335
+ type: new _graphql.GraphQLNonNull(_graphql.GraphQLID)
336
+ },
337
+ read: {
338
+ description: 'Allow the user to read the current object.',
339
+ type: new _graphql.GraphQLNonNull(_graphql.GraphQLBoolean)
340
+ },
341
+ write: {
342
+ description: 'Allow the user to write on the current object.',
343
+ type: new _graphql.GraphQLNonNull(_graphql.GraphQLBoolean)
344
+ }
345
+ }
346
+ });
347
+ const ROLE_ACL_INPUT = exports.ROLE_ACL_INPUT = new _graphql.GraphQLInputObjectType({
348
+ name: 'RoleACLInput',
349
+ description: 'Allow to manage roles in ACL.',
350
+ fields: {
351
+ roleName: {
352
+ description: 'Name of the targetted Role.',
353
+ type: new _graphql.GraphQLNonNull(_graphql.GraphQLString)
354
+ },
355
+ read: {
356
+ description: 'Allow users who are members of the role to read the current object.',
357
+ type: new _graphql.GraphQLNonNull(_graphql.GraphQLBoolean)
358
+ },
359
+ write: {
360
+ description: 'Allow users who are members of the role to write on the current object.',
361
+ type: new _graphql.GraphQLNonNull(_graphql.GraphQLBoolean)
362
+ }
363
+ }
364
+ });
365
+ const PUBLIC_ACL_INPUT = exports.PUBLIC_ACL_INPUT = new _graphql.GraphQLInputObjectType({
366
+ name: 'PublicACLInput',
367
+ description: 'Allow to manage public rights.',
368
+ fields: {
369
+ read: {
370
+ description: 'Allow anyone to read the current object.',
371
+ type: new _graphql.GraphQLNonNull(_graphql.GraphQLBoolean)
372
+ },
373
+ write: {
374
+ description: 'Allow anyone to write on the current object.',
375
+ type: new _graphql.GraphQLNonNull(_graphql.GraphQLBoolean)
376
+ }
377
+ }
378
+ });
379
+ const ACL_INPUT = exports.ACL_INPUT = new _graphql.GraphQLInputObjectType({
380
+ name: 'ACLInput',
381
+ description: 'Allow to manage access rights. If not provided object will be publicly readable and writable',
382
+ fields: {
383
+ users: {
384
+ description: 'Access control list for users.',
385
+ type: new _graphql.GraphQLList(new _graphql.GraphQLNonNull(USER_ACL_INPUT))
386
+ },
387
+ roles: {
388
+ description: 'Access control list for roles.',
389
+ type: new _graphql.GraphQLList(new _graphql.GraphQLNonNull(ROLE_ACL_INPUT))
390
+ },
391
+ public: {
392
+ description: 'Public access control list.',
393
+ type: PUBLIC_ACL_INPUT
394
+ }
395
+ }
396
+ });
397
+ const USER_ACL = exports.USER_ACL = new _graphql.GraphQLObjectType({
398
+ name: 'UserACL',
399
+ description: 'Allow to manage users in ACL. If read and write are null the users have read and write rights.',
400
+ fields: {
401
+ userId: {
402
+ description: 'ID of the targetted User.',
403
+ type: new _graphql.GraphQLNonNull(_graphql.GraphQLID)
404
+ },
405
+ read: {
406
+ description: 'Allow the user to read the current object.',
407
+ type: new _graphql.GraphQLNonNull(_graphql.GraphQLBoolean)
408
+ },
409
+ write: {
410
+ description: 'Allow the user to write on the current object.',
411
+ type: new _graphql.GraphQLNonNull(_graphql.GraphQLBoolean)
412
+ }
413
+ }
414
+ });
415
+ const ROLE_ACL = exports.ROLE_ACL = new _graphql.GraphQLObjectType({
416
+ name: 'RoleACL',
417
+ description: 'Allow to manage roles in ACL. If read and write are null the role have read and write rights.',
418
+ fields: {
419
+ roleName: {
420
+ description: 'Name of the targetted Role.',
421
+ type: new _graphql.GraphQLNonNull(_graphql.GraphQLID)
422
+ },
423
+ read: {
424
+ description: 'Allow users who are members of the role to read the current object.',
425
+ type: new _graphql.GraphQLNonNull(_graphql.GraphQLBoolean)
426
+ },
427
+ write: {
428
+ description: 'Allow users who are members of the role to write on the current object.',
429
+ type: new _graphql.GraphQLNonNull(_graphql.GraphQLBoolean)
430
+ }
431
+ }
432
+ });
433
+ const PUBLIC_ACL = exports.PUBLIC_ACL = new _graphql.GraphQLObjectType({
434
+ name: 'PublicACL',
435
+ description: 'Allow to manage public rights.',
436
+ fields: {
437
+ read: {
438
+ description: 'Allow anyone to read the current object.',
439
+ type: _graphql.GraphQLBoolean
440
+ },
441
+ write: {
442
+ description: 'Allow anyone to write on the current object.',
443
+ type: _graphql.GraphQLBoolean
444
+ }
445
+ }
446
+ });
447
+ const ACL = exports.ACL = new _graphql.GraphQLObjectType({
448
+ name: 'ACL',
449
+ description: 'Current access control list of the current object.',
450
+ fields: {
451
+ users: {
452
+ description: 'Access control list for users.',
453
+ type: new _graphql.GraphQLList(new _graphql.GraphQLNonNull(USER_ACL)),
454
+ resolve(p) {
455
+ const users = [];
456
+ Object.keys(p).forEach(rule => {
457
+ if (rule !== '*' && rule.indexOf('role:') !== 0) {
458
+ users.push({
459
+ userId: (0, _graphqlRelay.toGlobalId)('_User', rule),
460
+ read: p[rule].read ? true : false,
461
+ write: p[rule].write ? true : false
462
+ });
463
+ }
464
+ });
465
+ return users.length ? users : null;
466
+ }
467
+ },
468
+ roles: {
469
+ description: 'Access control list for roles.',
470
+ type: new _graphql.GraphQLList(new _graphql.GraphQLNonNull(ROLE_ACL)),
471
+ resolve(p) {
472
+ const roles = [];
473
+ Object.keys(p).forEach(rule => {
474
+ if (rule.indexOf('role:') === 0) {
475
+ roles.push({
476
+ roleName: rule.replace('role:', ''),
477
+ read: p[rule].read ? true : false,
478
+ write: p[rule].write ? true : false
479
+ });
480
+ }
481
+ });
482
+ return roles.length ? roles : null;
483
+ }
484
+ },
485
+ public: {
486
+ description: 'Public access control list.',
487
+ type: PUBLIC_ACL,
488
+ resolve(p) {
489
+ /* eslint-disable */
490
+ return p['*'] ? {
491
+ read: p['*'].read ? true : false,
492
+ write: p['*'].write ? true : false
493
+ } : null;
494
+ }
495
+ }
496
+ }
497
+ });
498
+ const OBJECT_ID = exports.OBJECT_ID = new _graphql.GraphQLNonNull(_graphql.GraphQLID);
499
+ const CLASS_NAME_ATT = exports.CLASS_NAME_ATT = {
500
+ description: 'This is the class name of the object.',
501
+ type: new _graphql.GraphQLNonNull(_graphql.GraphQLString)
502
+ };
503
+ const GLOBAL_OR_OBJECT_ID_ATT = exports.GLOBAL_OR_OBJECT_ID_ATT = {
504
+ description: 'This is the object id. You can use either the global or the object id.',
505
+ type: OBJECT_ID
506
+ };
507
+ const OBJECT_ID_ATT = exports.OBJECT_ID_ATT = {
508
+ description: 'This is the object id.',
509
+ type: OBJECT_ID
510
+ };
511
+ const CREATED_AT_ATT = exports.CREATED_AT_ATT = {
512
+ description: 'This is the date in which the object was created.',
513
+ type: new _graphql.GraphQLNonNull(DATE)
514
+ };
515
+ const UPDATED_AT_ATT = exports.UPDATED_AT_ATT = {
516
+ description: 'This is the date in which the object was las updated.',
517
+ type: new _graphql.GraphQLNonNull(DATE)
518
+ };
519
+ const INPUT_FIELDS = exports.INPUT_FIELDS = {
520
+ ACL: {
521
+ type: ACL
522
+ }
523
+ };
524
+ const CREATE_RESULT_FIELDS = exports.CREATE_RESULT_FIELDS = {
525
+ objectId: OBJECT_ID_ATT,
526
+ createdAt: CREATED_AT_ATT
527
+ };
528
+ const UPDATE_RESULT_FIELDS = exports.UPDATE_RESULT_FIELDS = {
529
+ updatedAt: UPDATED_AT_ATT
530
+ };
531
+ const PARSE_OBJECT_FIELDS = exports.PARSE_OBJECT_FIELDS = {
532
+ ...CREATE_RESULT_FIELDS,
533
+ ...UPDATE_RESULT_FIELDS,
534
+ ...INPUT_FIELDS,
535
+ ACL: {
536
+ type: new _graphql.GraphQLNonNull(ACL),
537
+ resolve: ({
538
+ ACL
539
+ }) => ACL ? ACL : {
540
+ '*': {
541
+ read: true,
542
+ write: true
543
+ }
544
+ }
545
+ }
546
+ };
547
+ const PARSE_OBJECT = exports.PARSE_OBJECT = new _graphql.GraphQLInterfaceType({
548
+ name: 'ParseObject',
549
+ description: 'The ParseObject interface type is used as a base type for the auto generated object types.',
550
+ fields: PARSE_OBJECT_FIELDS
551
+ });
552
+ const SESSION_TOKEN_ATT = exports.SESSION_TOKEN_ATT = {
553
+ description: 'The current user session token.',
554
+ type: new _graphql.GraphQLNonNull(_graphql.GraphQLString)
555
+ };
556
+ const READ_PREFERENCE = exports.READ_PREFERENCE = new _graphql.GraphQLEnumType({
557
+ name: 'ReadPreference',
558
+ description: 'The ReadPreference enum type is used in queries in order to select in which database replica the operation must run.',
559
+ values: {
560
+ PRIMARY: {
561
+ value: 'PRIMARY'
562
+ },
563
+ PRIMARY_PREFERRED: {
564
+ value: 'PRIMARY_PREFERRED'
565
+ },
566
+ SECONDARY: {
567
+ value: 'SECONDARY'
568
+ },
569
+ SECONDARY_PREFERRED: {
570
+ value: 'SECONDARY_PREFERRED'
571
+ },
572
+ NEAREST: {
573
+ value: 'NEAREST'
574
+ }
575
+ }
576
+ });
577
+ const READ_PREFERENCE_ATT = exports.READ_PREFERENCE_ATT = {
578
+ description: 'The read preference for the main query to be executed.',
579
+ type: READ_PREFERENCE
580
+ };
581
+ const INCLUDE_READ_PREFERENCE_ATT = exports.INCLUDE_READ_PREFERENCE_ATT = {
582
+ description: 'The read preference for the queries to be executed to include fields.',
583
+ type: READ_PREFERENCE
584
+ };
585
+ const SUBQUERY_READ_PREFERENCE_ATT = exports.SUBQUERY_READ_PREFERENCE_ATT = {
586
+ description: 'The read preference for the subqueries that may be required.',
587
+ type: READ_PREFERENCE
588
+ };
589
+ const READ_OPTIONS_INPUT = exports.READ_OPTIONS_INPUT = new _graphql.GraphQLInputObjectType({
590
+ name: 'ReadOptionsInput',
591
+ description: 'The ReadOptionsInputt type is used in queries in order to set the read preferences.',
592
+ fields: {
593
+ readPreference: READ_PREFERENCE_ATT,
594
+ includeReadPreference: INCLUDE_READ_PREFERENCE_ATT,
595
+ subqueryReadPreference: SUBQUERY_READ_PREFERENCE_ATT
596
+ }
597
+ });
598
+ const READ_OPTIONS_ATT = exports.READ_OPTIONS_ATT = {
599
+ description: 'The read options for the query to be executed.',
600
+ type: READ_OPTIONS_INPUT
601
+ };
602
+ const WHERE_ATT = exports.WHERE_ATT = {
603
+ description: 'These are the conditions that the objects need to match in order to be found',
604
+ type: OBJECT
605
+ };
606
+ const SKIP_ATT = exports.SKIP_ATT = {
607
+ description: 'This is the number of objects that must be skipped to return.',
608
+ type: _graphql.GraphQLInt
609
+ };
610
+ const LIMIT_ATT = exports.LIMIT_ATT = {
611
+ description: 'This is the limit number of objects that must be returned.',
612
+ type: _graphql.GraphQLInt
613
+ };
614
+ const COUNT_ATT = exports.COUNT_ATT = {
615
+ description: 'This is the total matched objecs count that is returned when the count flag is set.',
616
+ type: new _graphql.GraphQLNonNull(_graphql.GraphQLInt)
617
+ };
618
+ const SEARCH_INPUT = exports.SEARCH_INPUT = new _graphql.GraphQLInputObjectType({
619
+ name: 'SearchInput',
620
+ description: 'The SearchInput type is used to specifiy a search operation on a full text search.',
621
+ fields: {
622
+ term: {
623
+ description: 'This is the term to be searched.',
624
+ type: new _graphql.GraphQLNonNull(_graphql.GraphQLString)
625
+ },
626
+ language: {
627
+ description: 'This is the language to tetermine the list of stop words and the rules for tokenizer.',
628
+ type: _graphql.GraphQLString
629
+ },
630
+ caseSensitive: {
631
+ description: 'This is the flag to enable or disable case sensitive search.',
632
+ type: _graphql.GraphQLBoolean
633
+ },
634
+ diacriticSensitive: {
635
+ description: 'This is the flag to enable or disable diacritic sensitive search.',
636
+ type: _graphql.GraphQLBoolean
637
+ }
638
+ }
639
+ });
640
+ const TEXT_INPUT = exports.TEXT_INPUT = new _graphql.GraphQLInputObjectType({
641
+ name: 'TextInput',
642
+ description: 'The TextInput type is used to specify a text operation on a constraint.',
643
+ fields: {
644
+ search: {
645
+ description: 'This is the search to be executed.',
646
+ type: new _graphql.GraphQLNonNull(SEARCH_INPUT)
647
+ }
648
+ }
649
+ });
650
+ const BOX_INPUT = exports.BOX_INPUT = new _graphql.GraphQLInputObjectType({
651
+ name: 'BoxInput',
652
+ description: 'The BoxInput type is used to specifiy a box operation on a within geo query.',
653
+ fields: {
654
+ bottomLeft: {
655
+ description: 'This is the bottom left coordinates of the box.',
656
+ type: new _graphql.GraphQLNonNull(GEO_POINT_INPUT)
657
+ },
658
+ upperRight: {
659
+ description: 'This is the upper right coordinates of the box.',
660
+ type: new _graphql.GraphQLNonNull(GEO_POINT_INPUT)
661
+ }
662
+ }
663
+ });
664
+ const WITHIN_INPUT = exports.WITHIN_INPUT = new _graphql.GraphQLInputObjectType({
665
+ name: 'WithinInput',
666
+ description: 'The WithinInput type is used to specify a within operation on a constraint.',
667
+ fields: {
668
+ box: {
669
+ description: 'This is the box to be specified.',
670
+ type: new _graphql.GraphQLNonNull(BOX_INPUT)
671
+ }
672
+ }
673
+ });
674
+ const CENTER_SPHERE_INPUT = exports.CENTER_SPHERE_INPUT = new _graphql.GraphQLInputObjectType({
675
+ name: 'CenterSphereInput',
676
+ description: 'The CenterSphereInput type is used to specifiy a centerSphere operation on a geoWithin query.',
677
+ fields: {
678
+ center: {
679
+ description: 'This is the center of the sphere.',
680
+ type: new _graphql.GraphQLNonNull(GEO_POINT_INPUT)
681
+ },
682
+ distance: {
683
+ description: 'This is the radius of the sphere.',
684
+ type: new _graphql.GraphQLNonNull(_graphql.GraphQLFloat)
685
+ }
686
+ }
687
+ });
688
+ const GEO_WITHIN_INPUT = exports.GEO_WITHIN_INPUT = new _graphql.GraphQLInputObjectType({
689
+ name: 'GeoWithinInput',
690
+ description: 'The GeoWithinInput type is used to specify a geoWithin operation on a constraint.',
691
+ fields: {
692
+ polygon: {
693
+ description: 'This is the polygon to be specified.',
694
+ type: POLYGON_INPUT
695
+ },
696
+ centerSphere: {
697
+ description: 'This is the sphere to be specified.',
698
+ type: CENTER_SPHERE_INPUT
699
+ }
700
+ }
701
+ });
702
+ const GEO_INTERSECTS_INPUT = exports.GEO_INTERSECTS_INPUT = new _graphql.GraphQLInputObjectType({
703
+ name: 'GeoIntersectsInput',
704
+ description: 'The GeoIntersectsInput type is used to specify a geoIntersects operation on a constraint.',
705
+ fields: {
706
+ point: {
707
+ description: 'This is the point to be specified.',
708
+ type: GEO_POINT_INPUT
709
+ }
710
+ }
711
+ });
712
+ const equalTo = type => ({
713
+ description: 'This is the equalTo operator to specify a constraint to select the objects where the value of a field equals to a specified value.',
714
+ type
715
+ });
716
+ exports.equalTo = equalTo;
717
+ const notEqualTo = type => ({
718
+ description: 'This is the notEqualTo operator to specify a constraint to select the objects where the value of a field do not equal to a specified value.',
719
+ type
720
+ });
721
+ exports.notEqualTo = notEqualTo;
722
+ const lessThan = type => ({
723
+ description: 'This is the lessThan operator to specify a constraint to select the objects where the value of a field is less than a specified value.',
724
+ type
725
+ });
726
+ exports.lessThan = lessThan;
727
+ const lessThanOrEqualTo = type => ({
728
+ description: 'This is the lessThanOrEqualTo operator to specify a constraint to select the objects where the value of a field is less than or equal to a specified value.',
729
+ type
730
+ });
731
+ exports.lessThanOrEqualTo = lessThanOrEqualTo;
732
+ const greaterThan = type => ({
733
+ description: 'This is the greaterThan operator to specify a constraint to select the objects where the value of a field is greater than a specified value.',
734
+ type
735
+ });
736
+ exports.greaterThan = greaterThan;
737
+ const greaterThanOrEqualTo = type => ({
738
+ description: 'This is the greaterThanOrEqualTo operator to specify a constraint to select the objects where the value of a field is greater than or equal to a specified value.',
739
+ type
740
+ });
741
+ exports.greaterThanOrEqualTo = greaterThanOrEqualTo;
742
+ const inOp = type => ({
743
+ description: 'This is the in operator to specify a constraint to select the objects where the value of a field equals any value in the specified array.',
744
+ type: new _graphql.GraphQLList(type)
745
+ });
746
+ exports.inOp = inOp;
747
+ const notIn = type => ({
748
+ description: 'This is the notIn operator to specify a constraint to select the objects where the value of a field do not equal any value in the specified array.',
749
+ type: new _graphql.GraphQLList(type)
750
+ });
751
+ exports.notIn = notIn;
752
+ const exists = exports.exists = {
753
+ description: 'This is the exists operator to specify a constraint to select the objects where a field exists (or do not exist).',
754
+ type: _graphql.GraphQLBoolean
755
+ };
756
+ const matchesRegex = exports.matchesRegex = {
757
+ description: 'This is the matchesRegex operator to specify a constraint to select the objects where the value of a field matches a specified regular expression.',
758
+ type: _graphql.GraphQLString
759
+ };
760
+ const options = exports.options = {
761
+ description: 'This is the options operator to specify optional flags (such as "i" and "m") to be added to a matchesRegex operation in the same set of constraints.',
762
+ type: _graphql.GraphQLString
763
+ };
764
+ const SUBQUERY_INPUT = exports.SUBQUERY_INPUT = new _graphql.GraphQLInputObjectType({
765
+ name: 'SubqueryInput',
766
+ description: 'The SubqueryInput type is used to specify a sub query to another class.',
767
+ fields: {
768
+ className: CLASS_NAME_ATT,
769
+ where: Object.assign({}, WHERE_ATT, {
770
+ type: new _graphql.GraphQLNonNull(WHERE_ATT.type)
771
+ })
772
+ }
773
+ });
774
+ const SELECT_INPUT = exports.SELECT_INPUT = new _graphql.GraphQLInputObjectType({
775
+ name: 'SelectInput',
776
+ description: 'The SelectInput type is used to specify an inQueryKey or a notInQueryKey operation on a constraint.',
777
+ fields: {
778
+ query: {
779
+ description: 'This is the subquery to be executed.',
780
+ type: new _graphql.GraphQLNonNull(SUBQUERY_INPUT)
781
+ },
782
+ key: {
783
+ description: 'This is the key in the result of the subquery that must match (not match) the field.',
784
+ type: new _graphql.GraphQLNonNull(_graphql.GraphQLString)
785
+ }
786
+ }
787
+ });
788
+ const inQueryKey = exports.inQueryKey = {
789
+ description: 'This is the inQueryKey operator to specify a constraint to select the objects where a field equals to a key in the result of a different query.',
790
+ type: SELECT_INPUT
791
+ };
792
+ const notInQueryKey = exports.notInQueryKey = {
793
+ description: 'This is the notInQueryKey operator to specify a constraint to select the objects where a field do not equal to a key in the result of a different query.',
794
+ type: SELECT_INPUT
795
+ };
796
+ const ID_WHERE_INPUT = exports.ID_WHERE_INPUT = new _graphql.GraphQLInputObjectType({
797
+ name: 'IdWhereInput',
798
+ description: 'The IdWhereInput input type is used in operations that involve filtering objects by an id.',
799
+ fields: {
800
+ equalTo: equalTo(_graphql.GraphQLID),
801
+ notEqualTo: notEqualTo(_graphql.GraphQLID),
802
+ lessThan: lessThan(_graphql.GraphQLID),
803
+ lessThanOrEqualTo: lessThanOrEqualTo(_graphql.GraphQLID),
804
+ greaterThan: greaterThan(_graphql.GraphQLID),
805
+ greaterThanOrEqualTo: greaterThanOrEqualTo(_graphql.GraphQLID),
806
+ in: inOp(_graphql.GraphQLID),
807
+ notIn: notIn(_graphql.GraphQLID),
808
+ exists,
809
+ inQueryKey,
810
+ notInQueryKey
811
+ }
812
+ });
813
+ const STRING_WHERE_INPUT = exports.STRING_WHERE_INPUT = new _graphql.GraphQLInputObjectType({
814
+ name: 'StringWhereInput',
815
+ description: 'The StringWhereInput input type is used in operations that involve filtering objects by a field of type String.',
816
+ fields: {
817
+ equalTo: equalTo(_graphql.GraphQLString),
818
+ notEqualTo: notEqualTo(_graphql.GraphQLString),
819
+ lessThan: lessThan(_graphql.GraphQLString),
820
+ lessThanOrEqualTo: lessThanOrEqualTo(_graphql.GraphQLString),
821
+ greaterThan: greaterThan(_graphql.GraphQLString),
822
+ greaterThanOrEqualTo: greaterThanOrEqualTo(_graphql.GraphQLString),
823
+ in: inOp(_graphql.GraphQLString),
824
+ notIn: notIn(_graphql.GraphQLString),
825
+ exists,
826
+ matchesRegex,
827
+ options,
828
+ text: {
829
+ description: 'This is the $text operator to specify a full text search constraint.',
830
+ type: TEXT_INPUT
831
+ },
832
+ inQueryKey,
833
+ notInQueryKey
834
+ }
835
+ });
836
+ const NUMBER_WHERE_INPUT = exports.NUMBER_WHERE_INPUT = new _graphql.GraphQLInputObjectType({
837
+ name: 'NumberWhereInput',
838
+ description: 'The NumberWhereInput input type is used in operations that involve filtering objects by a field of type Number.',
839
+ fields: {
840
+ equalTo: equalTo(_graphql.GraphQLFloat),
841
+ notEqualTo: notEqualTo(_graphql.GraphQLFloat),
842
+ lessThan: lessThan(_graphql.GraphQLFloat),
843
+ lessThanOrEqualTo: lessThanOrEqualTo(_graphql.GraphQLFloat),
844
+ greaterThan: greaterThan(_graphql.GraphQLFloat),
845
+ greaterThanOrEqualTo: greaterThanOrEqualTo(_graphql.GraphQLFloat),
846
+ in: inOp(_graphql.GraphQLFloat),
847
+ notIn: notIn(_graphql.GraphQLFloat),
848
+ exists,
849
+ inQueryKey,
850
+ notInQueryKey
851
+ }
852
+ });
853
+ const BOOLEAN_WHERE_INPUT = exports.BOOLEAN_WHERE_INPUT = new _graphql.GraphQLInputObjectType({
854
+ name: 'BooleanWhereInput',
855
+ description: 'The BooleanWhereInput input type is used in operations that involve filtering objects by a field of type Boolean.',
856
+ fields: {
857
+ equalTo: equalTo(_graphql.GraphQLBoolean),
858
+ notEqualTo: notEqualTo(_graphql.GraphQLBoolean),
859
+ exists,
860
+ inQueryKey,
861
+ notInQueryKey
862
+ }
863
+ });
864
+ const ARRAY_WHERE_INPUT = exports.ARRAY_WHERE_INPUT = new _graphql.GraphQLInputObjectType({
865
+ name: 'ArrayWhereInput',
866
+ description: 'The ArrayWhereInput input type is used in operations that involve filtering objects by a field of type Array.',
867
+ fields: {
868
+ equalTo: equalTo(ANY),
869
+ notEqualTo: notEqualTo(ANY),
870
+ lessThan: lessThan(ANY),
871
+ lessThanOrEqualTo: lessThanOrEqualTo(ANY),
872
+ greaterThan: greaterThan(ANY),
873
+ greaterThanOrEqualTo: greaterThanOrEqualTo(ANY),
874
+ in: inOp(ANY),
875
+ notIn: notIn(ANY),
876
+ exists,
877
+ containedBy: {
878
+ description: 'This is the containedBy operator to specify a constraint to select the objects where the values of an array field is contained by another specified array.',
879
+ type: new _graphql.GraphQLList(ANY)
880
+ },
881
+ contains: {
882
+ description: 'This is the contains operator to specify a constraint to select the objects where the values of an array field contain all elements of another specified array.',
883
+ type: new _graphql.GraphQLList(ANY)
884
+ },
885
+ inQueryKey,
886
+ notInQueryKey
887
+ }
888
+ });
889
+ const KEY_VALUE_INPUT = exports.KEY_VALUE_INPUT = new _graphql.GraphQLInputObjectType({
890
+ name: 'KeyValueInput',
891
+ description: 'An entry from an object, i.e., a pair of key and value.',
892
+ fields: {
893
+ key: {
894
+ description: 'The key used to retrieve the value of this entry.',
895
+ type: new _graphql.GraphQLNonNull(_graphql.GraphQLString)
896
+ },
897
+ value: {
898
+ description: 'The value of the entry. Could be any type of scalar data.',
899
+ type: new _graphql.GraphQLNonNull(ANY)
900
+ }
901
+ }
902
+ });
903
+ const OBJECT_WHERE_INPUT = exports.OBJECT_WHERE_INPUT = new _graphql.GraphQLInputObjectType({
904
+ name: 'ObjectWhereInput',
905
+ description: 'The ObjectWhereInput input type is used in operations that involve filtering result by a field of type Object.',
906
+ fields: {
907
+ equalTo: equalTo(KEY_VALUE_INPUT),
908
+ notEqualTo: notEqualTo(KEY_VALUE_INPUT),
909
+ in: inOp(KEY_VALUE_INPUT),
910
+ notIn: notIn(KEY_VALUE_INPUT),
911
+ lessThan: lessThan(KEY_VALUE_INPUT),
912
+ lessThanOrEqualTo: lessThanOrEqualTo(KEY_VALUE_INPUT),
913
+ greaterThan: greaterThan(KEY_VALUE_INPUT),
914
+ greaterThanOrEqualTo: greaterThanOrEqualTo(KEY_VALUE_INPUT),
915
+ exists,
916
+ inQueryKey,
917
+ notInQueryKey
918
+ }
919
+ });
920
+ const DATE_WHERE_INPUT = exports.DATE_WHERE_INPUT = new _graphql.GraphQLInputObjectType({
921
+ name: 'DateWhereInput',
922
+ description: 'The DateWhereInput input type is used in operations that involve filtering objects by a field of type Date.',
923
+ fields: {
924
+ equalTo: equalTo(DATE),
925
+ notEqualTo: notEqualTo(DATE),
926
+ lessThan: lessThan(DATE),
927
+ lessThanOrEqualTo: lessThanOrEqualTo(DATE),
928
+ greaterThan: greaterThan(DATE),
929
+ greaterThanOrEqualTo: greaterThanOrEqualTo(DATE),
930
+ in: inOp(DATE),
931
+ notIn: notIn(DATE),
932
+ exists,
933
+ inQueryKey,
934
+ notInQueryKey
935
+ }
936
+ });
937
+ const BYTES_WHERE_INPUT = exports.BYTES_WHERE_INPUT = new _graphql.GraphQLInputObjectType({
938
+ name: 'BytesWhereInput',
939
+ description: 'The BytesWhereInput input type is used in operations that involve filtering objects by a field of type Bytes.',
940
+ fields: {
941
+ equalTo: equalTo(BYTES),
942
+ notEqualTo: notEqualTo(BYTES),
943
+ lessThan: lessThan(BYTES),
944
+ lessThanOrEqualTo: lessThanOrEqualTo(BYTES),
945
+ greaterThan: greaterThan(BYTES),
946
+ greaterThanOrEqualTo: greaterThanOrEqualTo(BYTES),
947
+ in: inOp(BYTES),
948
+ notIn: notIn(BYTES),
949
+ exists,
950
+ inQueryKey,
951
+ notInQueryKey
952
+ }
953
+ });
954
+ const FILE_WHERE_INPUT = exports.FILE_WHERE_INPUT = new _graphql.GraphQLInputObjectType({
955
+ name: 'FileWhereInput',
956
+ description: 'The FileWhereInput input type is used in operations that involve filtering objects by a field of type File.',
957
+ fields: {
958
+ equalTo: equalTo(FILE),
959
+ notEqualTo: notEqualTo(FILE),
960
+ lessThan: lessThan(FILE),
961
+ lessThanOrEqualTo: lessThanOrEqualTo(FILE),
962
+ greaterThan: greaterThan(FILE),
963
+ greaterThanOrEqualTo: greaterThanOrEqualTo(FILE),
964
+ in: inOp(FILE),
965
+ notIn: notIn(FILE),
966
+ exists,
967
+ matchesRegex,
968
+ options,
969
+ inQueryKey,
970
+ notInQueryKey
971
+ }
972
+ });
973
+ const GEO_POINT_WHERE_INPUT = exports.GEO_POINT_WHERE_INPUT = new _graphql.GraphQLInputObjectType({
974
+ name: 'GeoPointWhereInput',
975
+ description: 'The GeoPointWhereInput input type is used in operations that involve filtering objects by a field of type GeoPoint.',
976
+ fields: {
977
+ exists,
978
+ nearSphere: {
979
+ description: 'This is the nearSphere operator to specify a constraint to select the objects where the values of a geo point field is near to another geo point.',
980
+ type: GEO_POINT_INPUT
981
+ },
982
+ maxDistance: {
983
+ description: 'This is the maxDistance operator to specify a constraint to select the objects where the values of a geo point field is at a max distance (in radians) from the geo point specified in the $nearSphere operator.',
984
+ type: _graphql.GraphQLFloat
985
+ },
986
+ maxDistanceInRadians: {
987
+ description: 'This is the maxDistanceInRadians operator to specify a constraint to select the objects where the values of a geo point field is at a max distance (in radians) from the geo point specified in the $nearSphere operator.',
988
+ type: _graphql.GraphQLFloat
989
+ },
990
+ maxDistanceInMiles: {
991
+ description: 'This is the maxDistanceInMiles operator to specify a constraint to select the objects where the values of a geo point field is at a max distance (in miles) from the geo point specified in the $nearSphere operator.',
992
+ type: _graphql.GraphQLFloat
993
+ },
994
+ maxDistanceInKilometers: {
995
+ description: 'This is the maxDistanceInKilometers operator to specify a constraint to select the objects where the values of a geo point field is at a max distance (in kilometers) from the geo point specified in the $nearSphere operator.',
996
+ type: _graphql.GraphQLFloat
997
+ },
998
+ within: {
999
+ description: 'This is the within operator to specify a constraint to select the objects where the values of a geo point field is within a specified box.',
1000
+ type: WITHIN_INPUT
1001
+ },
1002
+ geoWithin: {
1003
+ description: 'This is the geoWithin operator to specify a constraint to select the objects where the values of a geo point field is within a specified polygon or sphere.',
1004
+ type: GEO_WITHIN_INPUT
1005
+ }
1006
+ }
1007
+ });
1008
+ const POLYGON_WHERE_INPUT = exports.POLYGON_WHERE_INPUT = new _graphql.GraphQLInputObjectType({
1009
+ name: 'PolygonWhereInput',
1010
+ description: 'The PolygonWhereInput input type is used in operations that involve filtering objects by a field of type Polygon.',
1011
+ fields: {
1012
+ exists,
1013
+ geoIntersects: {
1014
+ description: 'This is the geoIntersects operator to specify a constraint to select the objects where the values of a polygon field intersect a specified point.',
1015
+ type: GEO_INTERSECTS_INPUT
1016
+ }
1017
+ }
1018
+ });
1019
+ const ELEMENT = exports.ELEMENT = new _graphql.GraphQLObjectType({
1020
+ name: 'Element',
1021
+ description: "The Element object type is used to return array items' value.",
1022
+ fields: {
1023
+ value: {
1024
+ description: 'Return the value of the element in the array',
1025
+ type: new _graphql.GraphQLNonNull(ANY)
1026
+ }
1027
+ }
1028
+ });
1029
+
1030
+ // Default static union type, we update types and resolveType function later
1031
+ let ARRAY_RESULT = exports.ARRAY_RESULT = void 0;
1032
+ const loadArrayResult = (parseGraphQLSchema, parseClassesArray) => {
1033
+ const classTypes = parseClassesArray.filter(parseClass => parseGraphQLSchema.parseClassTypes[parseClass.className].classGraphQLOutputType ? true : false).map(parseClass => parseGraphQLSchema.parseClassTypes[parseClass.className].classGraphQLOutputType);
1034
+ exports.ARRAY_RESULT = ARRAY_RESULT = new _graphql.GraphQLUnionType({
1035
+ name: 'ArrayResult',
1036
+ description: 'Use Inline Fragment on Array to get results: https://graphql.org/learn/queries/#inline-fragments',
1037
+ types: () => [ELEMENT, ...classTypes],
1038
+ resolveType: value => {
1039
+ if (value.__type === 'Object' && value.className && value.objectId) {
1040
+ if (parseGraphQLSchema.parseClassTypes[value.className]) {
1041
+ return parseGraphQLSchema.parseClassTypes[value.className].classGraphQLOutputType.name;
1042
+ } else {
1043
+ return ELEMENT.name;
1044
+ }
1045
+ } else {
1046
+ return ELEMENT.name;
1047
+ }
1048
+ }
1049
+ });
1050
+ parseGraphQLSchema.graphQLTypes.push(ARRAY_RESULT);
1051
+ };
1052
+ exports.loadArrayResult = loadArrayResult;
1053
+ const load = parseGraphQLSchema => {
1054
+ parseGraphQLSchema.addGraphQLType(_GraphQLUpload.default, true);
1055
+ parseGraphQLSchema.addGraphQLType(ANY, true);
1056
+ parseGraphQLSchema.addGraphQLType(OBJECT, true);
1057
+ parseGraphQLSchema.addGraphQLType(DATE, true);
1058
+ parseGraphQLSchema.addGraphQLType(BYTES, true);
1059
+ parseGraphQLSchema.addGraphQLType(FILE, true);
1060
+ parseGraphQLSchema.addGraphQLType(FILE_INFO, true);
1061
+ parseGraphQLSchema.addGraphQLType(FILE_INPUT, true);
1062
+ parseGraphQLSchema.addGraphQLType(GEO_POINT_INPUT, true);
1063
+ parseGraphQLSchema.addGraphQLType(GEO_POINT, true);
1064
+ parseGraphQLSchema.addGraphQLType(PARSE_OBJECT, true);
1065
+ parseGraphQLSchema.addGraphQLType(READ_PREFERENCE, true);
1066
+ parseGraphQLSchema.addGraphQLType(READ_OPTIONS_INPUT, true);
1067
+ parseGraphQLSchema.addGraphQLType(SEARCH_INPUT, true);
1068
+ parseGraphQLSchema.addGraphQLType(TEXT_INPUT, true);
1069
+ parseGraphQLSchema.addGraphQLType(BOX_INPUT, true);
1070
+ parseGraphQLSchema.addGraphQLType(WITHIN_INPUT, true);
1071
+ parseGraphQLSchema.addGraphQLType(CENTER_SPHERE_INPUT, true);
1072
+ parseGraphQLSchema.addGraphQLType(GEO_WITHIN_INPUT, true);
1073
+ parseGraphQLSchema.addGraphQLType(GEO_INTERSECTS_INPUT, true);
1074
+ parseGraphQLSchema.addGraphQLType(ID_WHERE_INPUT, true);
1075
+ parseGraphQLSchema.addGraphQLType(STRING_WHERE_INPUT, true);
1076
+ parseGraphQLSchema.addGraphQLType(NUMBER_WHERE_INPUT, true);
1077
+ parseGraphQLSchema.addGraphQLType(BOOLEAN_WHERE_INPUT, true);
1078
+ parseGraphQLSchema.addGraphQLType(ARRAY_WHERE_INPUT, true);
1079
+ parseGraphQLSchema.addGraphQLType(KEY_VALUE_INPUT, true);
1080
+ parseGraphQLSchema.addGraphQLType(OBJECT_WHERE_INPUT, true);
1081
+ parseGraphQLSchema.addGraphQLType(DATE_WHERE_INPUT, true);
1082
+ parseGraphQLSchema.addGraphQLType(BYTES_WHERE_INPUT, true);
1083
+ parseGraphQLSchema.addGraphQLType(FILE_WHERE_INPUT, true);
1084
+ parseGraphQLSchema.addGraphQLType(GEO_POINT_WHERE_INPUT, true);
1085
+ parseGraphQLSchema.addGraphQLType(POLYGON_WHERE_INPUT, true);
1086
+ parseGraphQLSchema.addGraphQLType(ELEMENT, true);
1087
+ parseGraphQLSchema.addGraphQLType(ACL_INPUT, true);
1088
+ parseGraphQLSchema.addGraphQLType(USER_ACL_INPUT, true);
1089
+ parseGraphQLSchema.addGraphQLType(ROLE_ACL_INPUT, true);
1090
+ parseGraphQLSchema.addGraphQLType(PUBLIC_ACL_INPUT, true);
1091
+ parseGraphQLSchema.addGraphQLType(ACL, true);
1092
+ parseGraphQLSchema.addGraphQLType(USER_ACL, true);
1093
+ parseGraphQLSchema.addGraphQLType(ROLE_ACL, true);
1094
+ parseGraphQLSchema.addGraphQLType(PUBLIC_ACL, true);
1095
+ parseGraphQLSchema.addGraphQLType(SUBQUERY_INPUT, true);
1096
+ parseGraphQLSchema.addGraphQLType(SELECT_INPUT, true);
1097
+ };
1098
+ exports.load = load;
1099
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZ3JhcGhxbCIsInJlcXVpcmUiLCJfZ3JhcGhxbFJlbGF5IiwiX0dyYXBoUUxVcGxvYWQiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX1V0aWxzIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiVHlwZVZhbGlkYXRpb25FcnJvciIsIkVycm9yIiwiY29uc3RydWN0b3IiLCJ2YWx1ZSIsInR5cGUiLCJleHBvcnRzIiwicGFyc2VTdHJpbmdWYWx1ZSIsInBhcnNlSW50VmFsdWUiLCJpbnQiLCJOdW1iZXIiLCJpc0ludGVnZXIiLCJwYXJzZUZsb2F0VmFsdWUiLCJmbG9hdCIsImlzTmFOIiwicGFyc2VCb29sZWFuVmFsdWUiLCJwYXJzZVZhbHVlIiwia2luZCIsIktpbmQiLCJTVFJJTkciLCJJTlQiLCJGTE9BVCIsIkJPT0xFQU4iLCJMSVNUIiwicGFyc2VMaXN0VmFsdWVzIiwidmFsdWVzIiwiT0JKRUNUIiwicGFyc2VPYmplY3RGaWVsZHMiLCJmaWVsZHMiLCJBcnJheSIsImlzQXJyYXkiLCJtYXAiLCJyZWR1Y2UiLCJvYmplY3QiLCJmaWVsZCIsIm5hbWUiLCJBTlkiLCJHcmFwaFFMU2NhbGFyVHlwZSIsImRlc2NyaXB0aW9uIiwic2VyaWFsaXplIiwicGFyc2VMaXRlcmFsIiwiYXN0IiwicGFyc2VEYXRlSXNvVmFsdWUiLCJkYXRlIiwiRGF0ZSIsIlV0aWxzIiwiaXNEYXRlIiwic2VyaWFsaXplRGF0ZUlzbyIsInRvSVNPU3RyaW5nIiwicGFyc2VEYXRlSXNvTGl0ZXJhbCIsIkRBVEUiLCJfX3R5cGUiLCJpc28iLCJmaW5kIiwiQllURVMiLCJiYXNlNjQiLCJwYXJzZUZpbGVWYWx1ZSIsInVybCIsInVuZGVmaW5lZCIsIkZJTEUiLCJGSUxFX0lORk8iLCJHcmFwaFFMT2JqZWN0VHlwZSIsIkdyYXBoUUxOb25OdWxsIiwiR3JhcGhRTFN0cmluZyIsIkZJTEVfSU5QVVQiLCJHcmFwaFFMSW5wdXRPYmplY3RUeXBlIiwiZmlsZSIsInVwbG9hZCIsIkdyYXBoUUxVcGxvYWQiLCJHRU9fUE9JTlRfRklFTERTIiwibGF0aXR1ZGUiLCJHcmFwaFFMRmxvYXQiLCJsb25naXR1ZGUiLCJHRU9fUE9JTlRfSU5QVVQiLCJHRU9fUE9JTlQiLCJQT0xZR09OX0lOUFVUIiwiR3JhcGhRTExpc3QiLCJQT0xZR09OIiwiVVNFUl9BQ0xfSU5QVVQiLCJ1c2VySWQiLCJHcmFwaFFMSUQiLCJyZWFkIiwiR3JhcGhRTEJvb2xlYW4iLCJ3cml0ZSIsIlJPTEVfQUNMX0lOUFVUIiwicm9sZU5hbWUiLCJQVUJMSUNfQUNMX0lOUFVUIiwiQUNMX0lOUFVUIiwidXNlcnMiLCJyb2xlcyIsInB1YmxpYyIsIlVTRVJfQUNMIiwiUk9MRV9BQ0wiLCJQVUJMSUNfQUNMIiwiQUNMIiwicmVzb2x2ZSIsInAiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsInJ1bGUiLCJpbmRleE9mIiwicHVzaCIsInRvR2xvYmFsSWQiLCJsZW5ndGgiLCJyZXBsYWNlIiwiT0JKRUNUX0lEIiwiQ0xBU1NfTkFNRV9BVFQiLCJHTE9CQUxfT1JfT0JKRUNUX0lEX0FUVCIsIk9CSkVDVF9JRF9BVFQiLCJDUkVBVEVEX0FUX0FUVCIsIlVQREFURURfQVRfQVRUIiwiSU5QVVRfRklFTERTIiwiQ1JFQVRFX1JFU1VMVF9GSUVMRFMiLCJvYmplY3RJZCIsImNyZWF0ZWRBdCIsIlVQREFURV9SRVNVTFRfRklFTERTIiwidXBkYXRlZEF0IiwiUEFSU0VfT0JKRUNUX0ZJRUxEUyIsIlBBUlNFX09CSkVDVCIsIkdyYXBoUUxJbnRlcmZhY2VUeXBlIiwiU0VTU0lPTl9UT0tFTl9BVFQiLCJSRUFEX1BSRUZFUkVOQ0UiLCJHcmFwaFFMRW51bVR5cGUiLCJQUklNQVJZIiwiUFJJTUFSWV9QUkVGRVJSRUQiLCJTRUNPTkRBUlkiLCJTRUNPTkRBUllfUFJFRkVSUkVEIiwiTkVBUkVTVCIsIlJFQURfUFJFRkVSRU5DRV9BVFQiLCJJTkNMVURFX1JFQURfUFJFRkVSRU5DRV9BVFQiLCJTVUJRVUVSWV9SRUFEX1BSRUZFUkVOQ0VfQVRUIiwiUkVBRF9PUFRJT05TX0lOUFVUIiwicmVhZFByZWZlcmVuY2UiLCJpbmNsdWRlUmVhZFByZWZlcmVuY2UiLCJzdWJxdWVyeVJlYWRQcmVmZXJlbmNlIiwiUkVBRF9PUFRJT05TX0FUVCIsIldIRVJFX0FUVCIsIlNLSVBfQVRUIiwiR3JhcGhRTEludCIsIkxJTUlUX0FUVCIsIkNPVU5UX0FUVCIsIlNFQVJDSF9JTlBVVCIsInRlcm0iLCJsYW5ndWFnZSIsImNhc2VTZW5zaXRpdmUiLCJkaWFjcml0aWNTZW5zaXRpdmUiLCJURVhUX0lOUFVUIiwic2VhcmNoIiwiQk9YX0lOUFVUIiwiYm90dG9tTGVmdCIsInVwcGVyUmlnaHQiLCJXSVRISU5fSU5QVVQiLCJib3giLCJDRU5URVJfU1BIRVJFX0lOUFVUIiwiY2VudGVyIiwiZGlzdGFuY2UiLCJHRU9fV0lUSElOX0lOUFVUIiwicG9seWdvbiIsImNlbnRlclNwaGVyZSIsIkdFT19JTlRFUlNFQ1RTX0lOUFVUIiwicG9pbnQiLCJlcXVhbFRvIiwibm90RXF1YWxUbyIsImxlc3NUaGFuIiwibGVzc1RoYW5PckVxdWFsVG8iLCJncmVhdGVyVGhhbiIsImdyZWF0ZXJUaGFuT3JFcXVhbFRvIiwiaW5PcCIsIm5vdEluIiwiZXhpc3RzIiwibWF0Y2hlc1JlZ2V4Iiwib3B0aW9ucyIsIlNVQlFVRVJZX0lOUFVUIiwiY2xhc3NOYW1lIiwid2hlcmUiLCJhc3NpZ24iLCJTRUxFQ1RfSU5QVVQiLCJxdWVyeSIsImtleSIsImluUXVlcnlLZXkiLCJub3RJblF1ZXJ5S2V5IiwiSURfV0hFUkVfSU5QVVQiLCJpbiIsIlNUUklOR19XSEVSRV9JTlBVVCIsInRleHQiLCJOVU1CRVJfV0hFUkVfSU5QVVQiLCJCT09MRUFOX1dIRVJFX0lOUFVUIiwiQVJSQVlfV0hFUkVfSU5QVVQiLCJjb250YWluZWRCeSIsImNvbnRhaW5zIiwiS0VZX1ZBTFVFX0lOUFVUIiwiT0JKRUNUX1dIRVJFX0lOUFVUIiwiREFURV9XSEVSRV9JTlBVVCIsIkJZVEVTX1dIRVJFX0lOUFVUIiwiRklMRV9XSEVSRV9JTlBVVCIsIkdFT19QT0lOVF9XSEVSRV9JTlBVVCIsIm5lYXJTcGhlcmUiLCJtYXhEaXN0YW5jZSIsIm1heERpc3RhbmNlSW5SYWRpYW5zIiwibWF4RGlzdGFuY2VJbk1pbGVzIiwibWF4RGlzdGFuY2VJbktpbG9tZXRlcnMiLCJ3aXRoaW4iLCJnZW9XaXRoaW4iLCJQT0xZR09OX1dIRVJFX0lOUFVUIiwiZ2VvSW50ZXJzZWN0cyIsIkVMRU1FTlQiLCJBUlJBWV9SRVNVTFQiLCJsb2FkQXJyYXlSZXN1bHQiLCJwYXJzZUdyYXBoUUxTY2hlbWEiLCJwYXJzZUNsYXNzZXNBcnJheSIsImNsYXNzVHlwZXMiLCJmaWx0ZXIiLCJwYXJzZUNsYXNzIiwicGFyc2VDbGFzc1R5cGVzIiwiY2xhc3NHcmFwaFFMT3V0cHV0VHlwZSIsIkdyYXBoUUxVbmlvblR5cGUiLCJ0eXBlcyIsInJlc29sdmVUeXBlIiwiZ3JhcGhRTFR5cGVzIiwibG9hZCIsImFkZEdyYXBoUUxUeXBlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL0dyYXBoUUwvbG9hZGVycy9kZWZhdWx0R3JhcGhRTFR5cGVzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEtpbmQsXG4gIEdyYXBoUUxOb25OdWxsLFxuICBHcmFwaFFMU2NhbGFyVHlwZSxcbiAgR3JhcGhRTElELFxuICBHcmFwaFFMU3RyaW5nLFxuICBHcmFwaFFMT2JqZWN0VHlwZSxcbiAgR3JhcGhRTEludGVyZmFjZVR5cGUsXG4gIEdyYXBoUUxFbnVtVHlwZSxcbiAgR3JhcGhRTEludCxcbiAgR3JhcGhRTEZsb2F0LFxuICBHcmFwaFFMTGlzdCxcbiAgR3JhcGhRTElucHV0T2JqZWN0VHlwZSxcbiAgR3JhcGhRTEJvb2xlYW4sXG4gIEdyYXBoUUxVbmlvblR5cGUsXG59IGZyb20gJ2dyYXBocWwnO1xuaW1wb3J0IHsgdG9HbG9iYWxJZCB9IGZyb20gJ2dyYXBocWwtcmVsYXknO1xuaW1wb3J0IEdyYXBoUUxVcGxvYWQgZnJvbSAnZ3JhcGhxbC11cGxvYWQvR3JhcGhRTFVwbG9hZC5qcyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi4vLi4vVXRpbHMnO1xuXG5jbGFzcyBUeXBlVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih2YWx1ZSwgdHlwZSkge1xuICAgIHN1cGVyKGAke3ZhbHVlfSBpcyBub3QgYSB2YWxpZCAke3R5cGV9YCk7XG4gIH1cbn1cblxuY29uc3QgcGFyc2VTdHJpbmdWYWx1ZSA9IHZhbHVlID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZVZhbGlkYXRpb25FcnJvcih2YWx1ZSwgJ1N0cmluZycpO1xufTtcblxuY29uc3QgcGFyc2VJbnRWYWx1ZSA9IHZhbHVlID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBpbnQgPSBOdW1iZXIodmFsdWUpO1xuICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGludCkpIHtcbiAgICAgIHJldHVybiBpbnQ7XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVWYWxpZGF0aW9uRXJyb3IodmFsdWUsICdJbnQnKTtcbn07XG5cbmNvbnN0IHBhcnNlRmxvYXRWYWx1ZSA9IHZhbHVlID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBmbG9hdCA9IE51bWJlcih2YWx1ZSk7XG4gICAgaWYgKCFpc05hTihmbG9hdCkpIHtcbiAgICAgIHJldHVybiBmbG9hdDtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZVZhbGlkYXRpb25FcnJvcih2YWx1ZSwgJ0Zsb2F0Jyk7XG59O1xuXG5jb25zdCBwYXJzZUJvb2xlYW5WYWx1ZSA9IHZhbHVlID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVWYWxpZGF0aW9uRXJyb3IodmFsdWUsICdCb29sZWFuJyk7XG59O1xuXG5jb25zdCBwYXJzZVZhbHVlID0gdmFsdWUgPT4ge1xuICBzd2l0Y2ggKHZhbHVlLmtpbmQpIHtcbiAgICBjYXNlIEtpbmQuU1RSSU5HOlxuICAgICAgcmV0dXJuIHBhcnNlU3RyaW5nVmFsdWUodmFsdWUudmFsdWUpO1xuXG4gICAgY2FzZSBLaW5kLklOVDpcbiAgICAgIHJldHVybiBwYXJzZUludFZhbHVlKHZhbHVlLnZhbHVlKTtcblxuICAgIGNhc2UgS2luZC5GTE9BVDpcbiAgICAgIHJldHVybiBwYXJzZUZsb2F0VmFsdWUodmFsdWUudmFsdWUpO1xuXG4gICAgY2FzZSBLaW5kLkJPT0xFQU46XG4gICAgICByZXR1cm4gcGFyc2VCb29sZWFuVmFsdWUodmFsdWUudmFsdWUpO1xuXG4gICAgY2FzZSBLaW5kLkxJU1Q6XG4gICAgICByZXR1cm4gcGFyc2VMaXN0VmFsdWVzKHZhbHVlLnZhbHVlcyk7XG5cbiAgICBjYXNlIEtpbmQuT0JKRUNUOlxuICAgICAgcmV0dXJuIHBhcnNlT2JqZWN0RmllbGRzKHZhbHVlLmZpZWxkcyk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHZhbHVlLnZhbHVlO1xuICB9XG59O1xuXG5jb25zdCBwYXJzZUxpc3RWYWx1ZXMgPSB2YWx1ZXMgPT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgcmV0dXJuIHZhbHVlcy5tYXAodmFsdWUgPT4gcGFyc2VWYWx1ZSh2YWx1ZSkpO1xuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVWYWxpZGF0aW9uRXJyb3IodmFsdWVzLCAnTGlzdCcpO1xufTtcblxuY29uc3QgcGFyc2VPYmplY3RGaWVsZHMgPSBmaWVsZHMgPT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZHMpKSB7XG4gICAgcmV0dXJuIGZpZWxkcy5yZWR1Y2UoXG4gICAgICAob2JqZWN0LCBmaWVsZCkgPT4gKHtcbiAgICAgICAgLi4ub2JqZWN0LFxuICAgICAgICBbZmllbGQubmFtZS52YWx1ZV06IHBhcnNlVmFsdWUoZmllbGQudmFsdWUpLFxuICAgICAgfSksXG4gICAgICB7fVxuICAgICk7XG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZVZhbGlkYXRpb25FcnJvcihmaWVsZHMsICdPYmplY3QnKTtcbn07XG5cbmNvbnN0IEFOWSA9IG5ldyBHcmFwaFFMU2NhbGFyVHlwZSh7XG4gIG5hbWU6ICdBbnknLFxuICBkZXNjcmlwdGlvbjpcbiAgICAnVGhlIEFueSBzY2FsYXIgdHlwZSBpcyB1c2VkIGluIG9wZXJhdGlvbnMgYW5kIHR5cGVzIHRoYXQgaW52b2x2ZSBhbnkgdHlwZSBvZiB2YWx1ZS4nLFxuICBwYXJzZVZhbHVlOiB2YWx1ZSA9PiB2YWx1ZSxcbiAgc2VyaWFsaXplOiB2YWx1ZSA9PiB2YWx1ZSxcbiAgcGFyc2VMaXRlcmFsOiBhc3QgPT4gcGFyc2VWYWx1ZShhc3QpLFxufSk7XG5cbmNvbnN0IE9CSkVDVCA9IG5ldyBHcmFwaFFMU2NhbGFyVHlwZSh7XG4gIG5hbWU6ICdPYmplY3QnLFxuICBkZXNjcmlwdGlvbjogJ1RoZSBPYmplY3Qgc2NhbGFyIHR5cGUgaXMgdXNlZCBpbiBvcGVyYXRpb25zIGFuZCB0eXBlcyB0aGF0IGludm9sdmUgb2JqZWN0cy4nLFxuICBwYXJzZVZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVHlwZVZhbGlkYXRpb25FcnJvcih2YWx1ZSwgJ09iamVjdCcpO1xuICB9LFxuICBzZXJpYWxpemUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBUeXBlVmFsaWRhdGlvbkVycm9yKHZhbHVlLCAnT2JqZWN0Jyk7XG4gIH0sXG4gIHBhcnNlTGl0ZXJhbChhc3QpIHtcbiAgICBpZiAoYXN0LmtpbmQgPT09IEtpbmQuT0JKRUNUKSB7XG4gICAgICByZXR1cm4gcGFyc2VPYmplY3RGaWVsZHMoYXN0LmZpZWxkcyk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFR5cGVWYWxpZGF0aW9uRXJyb3IoYXN0LmtpbmQsICdPYmplY3QnKTtcbiAgfSxcbn0pO1xuXG5jb25zdCBwYXJzZURhdGVJc29WYWx1ZSA9IHZhbHVlID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodmFsdWUpO1xuICAgIGlmICghaXNOYU4oZGF0ZSkpIHtcbiAgICAgIHJldHVybiBkYXRlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChVdGlscy5pc0RhdGUodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVWYWxpZGF0aW9uRXJyb3IodmFsdWUsICdEYXRlJyk7XG59O1xuXG5jb25zdCBzZXJpYWxpemVEYXRlSXNvID0gdmFsdWUgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoVXRpbHMuaXNEYXRlKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS50b0lTT1N0cmluZygpO1xuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVWYWxpZGF0aW9uRXJyb3IodmFsdWUsICdEYXRlJyk7XG59O1xuXG5jb25zdCBwYXJzZURhdGVJc29MaXRlcmFsID0gYXN0ID0+IHtcbiAgaWYgKGFzdC5raW5kID09PSBLaW5kLlNUUklORykge1xuICAgIHJldHVybiBwYXJzZURhdGVJc29WYWx1ZShhc3QudmFsdWUpO1xuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVWYWxpZGF0aW9uRXJyb3IoYXN0LmtpbmQsICdEYXRlJyk7XG59O1xuXG5jb25zdCBEQVRFID0gbmV3IEdyYXBoUUxTY2FsYXJUeXBlKHtcbiAgbmFtZTogJ0RhdGUnLFxuICBkZXNjcmlwdGlvbjogJ1RoZSBEYXRlIHNjYWxhciB0eXBlIGlzIHVzZWQgaW4gb3BlcmF0aW9ucyBhbmQgdHlwZXMgdGhhdCBpbnZvbHZlIGRhdGVzLicsXG4gIHBhcnNlVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCBVdGlscy5pc0RhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfX3R5cGU6ICdEYXRlJyxcbiAgICAgICAgaXNvOiBwYXJzZURhdGVJc29WYWx1ZSh2YWx1ZSksXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZS5fX3R5cGUgPT09ICdEYXRlJyAmJiB2YWx1ZS5pc28pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9fdHlwZTogdmFsdWUuX190eXBlLFxuICAgICAgICBpc286IHBhcnNlRGF0ZUlzb1ZhbHVlKHZhbHVlLmlzbyksXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRocm93IG5ldyBUeXBlVmFsaWRhdGlvbkVycm9yKHZhbHVlLCAnRGF0ZScpO1xuICB9LFxuICBzZXJpYWxpemUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCBVdGlscy5pc0RhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gc2VyaWFsaXplRGF0ZUlzbyh2YWx1ZSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlLl9fdHlwZSA9PT0gJ0RhdGUnICYmIHZhbHVlLmlzbykge1xuICAgICAgcmV0dXJuIHNlcmlhbGl6ZURhdGVJc28odmFsdWUuaXNvKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVHlwZVZhbGlkYXRpb25FcnJvcih2YWx1ZSwgJ0RhdGUnKTtcbiAgfSxcbiAgcGFyc2VMaXRlcmFsKGFzdCkge1xuICAgIGlmIChhc3Qua2luZCA9PT0gS2luZC5TVFJJTkcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9fdHlwZTogJ0RhdGUnLFxuICAgICAgICBpc286IHBhcnNlRGF0ZUlzb0xpdGVyYWwoYXN0KSxcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChhc3Qua2luZCA9PT0gS2luZC5PQkpFQ1QpIHtcbiAgICAgIGNvbnN0IF9fdHlwZSA9IGFzdC5maWVsZHMuZmluZChmaWVsZCA9PiBmaWVsZC5uYW1lLnZhbHVlID09PSAnX190eXBlJyk7XG4gICAgICBjb25zdCBpc28gPSBhc3QuZmllbGRzLmZpbmQoZmllbGQgPT4gZmllbGQubmFtZS52YWx1ZSA9PT0gJ2lzbycpO1xuICAgICAgaWYgKF9fdHlwZSAmJiBfX3R5cGUudmFsdWUgJiYgX190eXBlLnZhbHVlLnZhbHVlID09PSAnRGF0ZScgJiYgaXNvKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX190eXBlOiBfX3R5cGUudmFsdWUudmFsdWUsXG4gICAgICAgICAgaXNvOiBwYXJzZURhdGVJc29MaXRlcmFsKGlzby52YWx1ZSksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFR5cGVWYWxpZGF0aW9uRXJyb3IoYXN0LmtpbmQsICdEYXRlJyk7XG4gIH0sXG59KTtcblxuY29uc3QgQllURVMgPSBuZXcgR3JhcGhRTFNjYWxhclR5cGUoe1xuICBuYW1lOiAnQnl0ZXMnLFxuICBkZXNjcmlwdGlvbjpcbiAgICAnVGhlIEJ5dGVzIHNjYWxhciB0eXBlIGlzIHVzZWQgaW4gb3BlcmF0aW9ucyBhbmQgdHlwZXMgdGhhdCBpbnZvbHZlIGJhc2UgNjQgYmluYXJ5IGRhdGEuJyxcbiAgcGFyc2VWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfX3R5cGU6ICdCeXRlcycsXG4gICAgICAgIGJhc2U2NDogdmFsdWUsXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICB2YWx1ZS5fX3R5cGUgPT09ICdCeXRlcycgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZS5iYXNlNjQgPT09ICdzdHJpbmcnXG4gICAgKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFR5cGVWYWxpZGF0aW9uRXJyb3IodmFsdWUsICdCeXRlcycpO1xuICB9LFxuICBzZXJpYWxpemUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICB2YWx1ZS5fX3R5cGUgPT09ICdCeXRlcycgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZS5iYXNlNjQgPT09ICdzdHJpbmcnXG4gICAgKSB7XG4gICAgICByZXR1cm4gdmFsdWUuYmFzZTY0O1xuICAgIH1cblxuICAgIHRocm93IG5ldyBUeXBlVmFsaWRhdGlvbkVycm9yKHZhbHVlLCAnQnl0ZXMnKTtcbiAgfSxcbiAgcGFyc2VMaXRlcmFsKGFzdCkge1xuICAgIGlmIChhc3Qua2luZCA9PT0gS2luZC5TVFJJTkcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9fdHlwZTogJ0J5dGVzJyxcbiAgICAgICAgYmFzZTY0OiBhc3QudmFsdWUsXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoYXN0LmtpbmQgPT09IEtpbmQuT0JKRUNUKSB7XG4gICAgICBjb25zdCBfX3R5cGUgPSBhc3QuZmllbGRzLmZpbmQoZmllbGQgPT4gZmllbGQubmFtZS52YWx1ZSA9PT0gJ19fdHlwZScpO1xuICAgICAgY29uc3QgYmFzZTY0ID0gYXN0LmZpZWxkcy5maW5kKGZpZWxkID0+IGZpZWxkLm5hbWUudmFsdWUgPT09ICdiYXNlNjQnKTtcbiAgICAgIGlmIChcbiAgICAgICAgX190eXBlICYmXG4gICAgICAgIF9fdHlwZS52YWx1ZSAmJlxuICAgICAgICBfX3R5cGUudmFsdWUudmFsdWUgPT09ICdCeXRlcycgJiZcbiAgICAgICAgYmFzZTY0ICYmXG4gICAgICAgIGJhc2U2NC52YWx1ZSAmJlxuICAgICAgICB0eXBlb2YgYmFzZTY0LnZhbHVlLnZhbHVlID09PSAnc3RyaW5nJ1xuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX190eXBlOiBfX3R5cGUudmFsdWUudmFsdWUsXG4gICAgICAgICAgYmFzZTY0OiBiYXNlNjQudmFsdWUudmFsdWUsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFR5cGVWYWxpZGF0aW9uRXJyb3IoYXN0LmtpbmQsICdCeXRlcycpO1xuICB9LFxufSk7XG5cbmNvbnN0IHBhcnNlRmlsZVZhbHVlID0gdmFsdWUgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGU6ICdGaWxlJyxcbiAgICAgIG5hbWU6IHZhbHVlLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgIHZhbHVlLl9fdHlwZSA9PT0gJ0ZpbGUnICYmXG4gICAgdHlwZW9mIHZhbHVlLm5hbWUgPT09ICdzdHJpbmcnICYmXG4gICAgKHZhbHVlLnVybCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB2YWx1ZS51cmwgPT09ICdzdHJpbmcnKVxuICApIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZVZhbGlkYXRpb25FcnJvcih2YWx1ZSwgJ0ZpbGUnKTtcbn07XG5cbmNvbnN0IEZJTEUgPSBuZXcgR3JhcGhRTFNjYWxhclR5cGUoe1xuICBuYW1lOiAnRmlsZScsXG4gIGRlc2NyaXB0aW9uOiAnVGhlIEZpbGUgc2NhbGFyIHR5cGUgaXMgdXNlZCBpbiBvcGVyYXRpb25zIGFuZCB0eXBlcyB0aGF0IGludm9sdmUgZmlsZXMuJyxcbiAgcGFyc2VWYWx1ZTogcGFyc2VGaWxlVmFsdWUsXG4gIHNlcmlhbGl6ZTogdmFsdWUgPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgIHZhbHVlLl9fdHlwZSA9PT0gJ0ZpbGUnICYmXG4gICAgICB0eXBlb2YgdmFsdWUubmFtZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICh2YWx1ZS51cmwgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdmFsdWUudXJsID09PSAnc3RyaW5nJylcbiAgICApIHtcbiAgICAgIHJldHVybiB2YWx1ZS5uYW1lO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBUeXBlVmFsaWRhdGlvbkVycm9yKHZhbHVlLCAnRmlsZScpO1xuICB9LFxuICBwYXJzZUxpdGVyYWwoYXN0KSB7XG4gICAgaWYgKGFzdC5raW5kID09PSBLaW5kLlNUUklORykge1xuICAgICAgcmV0dXJuIHBhcnNlRmlsZVZhbHVlKGFzdC52YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChhc3Qua2luZCA9PT0gS2luZC5PQkpFQ1QpIHtcbiAgICAgIGNvbnN0IF9fdHlwZSA9IGFzdC5maWVsZHMuZmluZChmaWVsZCA9PiBmaWVsZC5uYW1lLnZhbHVlID09PSAnX190eXBlJyk7XG4gICAgICBjb25zdCBuYW1lID0gYXN0LmZpZWxkcy5maW5kKGZpZWxkID0+IGZpZWxkLm5hbWUudmFsdWUgPT09ICduYW1lJyk7XG4gICAgICBjb25zdCB1cmwgPSBhc3QuZmllbGRzLmZpbmQoZmllbGQgPT4gZmllbGQubmFtZS52YWx1ZSA9PT0gJ3VybCcpO1xuICAgICAgaWYgKF9fdHlwZSAmJiBfX3R5cGUudmFsdWUgJiYgbmFtZSAmJiBuYW1lLnZhbHVlKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUZpbGVWYWx1ZSh7XG4gICAgICAgICAgX190eXBlOiBfX3R5cGUudmFsdWUudmFsdWUsXG4gICAgICAgICAgbmFtZTogbmFtZS52YWx1ZS52YWx1ZSxcbiAgICAgICAgICB1cmw6IHVybCAmJiB1cmwudmFsdWUgPyB1cmwudmFsdWUudmFsdWUgOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBUeXBlVmFsaWRhdGlvbkVycm9yKGFzdC5raW5kLCAnRmlsZScpO1xuICB9LFxufSk7XG5cbmNvbnN0IEZJTEVfSU5GTyA9IG5ldyBHcmFwaFFMT2JqZWN0VHlwZSh7XG4gIG5hbWU6ICdGaWxlSW5mbycsXG4gIGRlc2NyaXB0aW9uOiAnVGhlIEZpbGVJbmZvIG9iamVjdCB0eXBlIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBmaWxlcy4nLFxuICBmaWVsZHM6IHtcbiAgICBuYW1lOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1RoaXMgaXMgdGhlIGZpbGUgbmFtZS4nLFxuICAgICAgdHlwZTogbmV3IEdyYXBoUUxOb25OdWxsKEdyYXBoUUxTdHJpbmcpLFxuICAgIH0sXG4gICAgdXJsOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1RoaXMgaXMgdGhlIHVybCBpbiB3aGljaCB0aGUgZmlsZSBjYW4gYmUgZG93bmxvYWRlZC4nLFxuICAgICAgdHlwZTogbmV3IEdyYXBoUUxOb25OdWxsKEdyYXBoUUxTdHJpbmcpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuY29uc3QgRklMRV9JTlBVVCA9IG5ldyBHcmFwaFFMSW5wdXRPYmplY3RUeXBlKHtcbiAgbmFtZTogJ0ZpbGVJbnB1dCcsXG4gIGRlc2NyaXB0aW9uOlxuICAgICdJZiB0aGlzIGZpZWxkIGlzIHNldCB0byBudWxsIHRoZSBmaWxlIHdpbGwgYmUgdW5saW5rZWQgKHRoZSBmaWxlIHdpbGwgbm90IGJlIGRlbGV0ZWQgb24gY2xvdWQgc3RvcmFnZSkuJyxcbiAgZmllbGRzOiB7XG4gICAgZmlsZToge1xuICAgICAgZGVzY3JpcHRpb246ICdBIEZpbGUgU2NhbGFyIGNhbiBiZSBhbiB1cmwgb3IgYSBGaWxlSW5mbyBvYmplY3QuJyxcbiAgICAgIHR5cGU6IEZJTEUsXG4gICAgfSxcbiAgICB1cGxvYWQ6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnVXNlIHRoaXMgZmllbGQgaWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IGZpbGUuJyxcbiAgICAgIHR5cGU6IEdyYXBoUUxVcGxvYWQsXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5jb25zdCBHRU9fUE9JTlRfRklFTERTID0ge1xuICBsYXRpdHVkZToge1xuICAgIGRlc2NyaXB0aW9uOiAnVGhpcyBpcyB0aGUgbGF0aXR1ZGUuJyxcbiAgICB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoR3JhcGhRTEZsb2F0KSxcbiAgfSxcbiAgbG9uZ2l0dWRlOiB7XG4gICAgZGVzY3JpcHRpb246ICdUaGlzIGlzIHRoZSBsb25naXR1ZGUuJyxcbiAgICB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoR3JhcGhRTEZsb2F0KSxcbiAgfSxcbn07XG5cbmNvbnN0IEdFT19QT0lOVF9JTlBVVCA9IG5ldyBHcmFwaFFMSW5wdXRPYmplY3RUeXBlKHtcbiAgbmFtZTogJ0dlb1BvaW50SW5wdXQnLFxuICBkZXNjcmlwdGlvbjpcbiAgICAnVGhlIEdlb1BvaW50SW5wdXQgdHlwZSBpcyB1c2VkIGluIG9wZXJhdGlvbnMgdGhhdCBpbnZvbHZlIGlucHV0dGluZyBmaWVsZHMgb2YgdHlwZSBnZW8gcG9pbnQuJyxcbiAgZmllbGRzOiBHRU9fUE9JTlRfRklFTERTLFxufSk7XG5cbmNvbnN0IEdFT19QT0lOVCA9IG5ldyBHcmFwaFFMT2JqZWN0VHlwZSh7XG4gIG5hbWU6ICdHZW9Qb2ludCcsXG4gIGRlc2NyaXB0aW9uOiAnVGhlIEdlb1BvaW50IG9iamVjdCB0eXBlIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBnZW8gcG9pbnQgZmllbGRzLicsXG4gIGZpZWxkczogR0VPX1BPSU5UX0ZJRUxEUyxcbn0pO1xuXG5jb25zdCBQT0xZR09OX0lOUFVUID0gbmV3IEdyYXBoUUxMaXN0KG5ldyBHcmFwaFFMTm9uTnVsbChHRU9fUE9JTlRfSU5QVVQpKTtcblxuY29uc3QgUE9MWUdPTiA9IG5ldyBHcmFwaFFMTGlzdChuZXcgR3JhcGhRTE5vbk51bGwoR0VPX1BPSU5UKSk7XG5cbmNvbnN0IFVTRVJfQUNMX0lOUFVUID0gbmV3IEdyYXBoUUxJbnB1dE9iamVjdFR5cGUoe1xuICBuYW1lOiAnVXNlckFDTElucHV0JyxcbiAgZGVzY3JpcHRpb246ICdBbGxvdyB0byBtYW5hZ2UgdXNlcnMgaW4gQUNMLicsXG4gIGZpZWxkczoge1xuICAgIHVzZXJJZDoge1xuICAgICAgZGVzY3JpcHRpb246ICdJRCBvZiB0aGUgdGFyZ2V0dGVkIFVzZXIuJyxcbiAgICAgIHR5cGU6IG5ldyBHcmFwaFFMTm9uTnVsbChHcmFwaFFMSUQpLFxuICAgIH0sXG4gICAgcmVhZDoge1xuICAgICAgZGVzY3JpcHRpb246ICdBbGxvdyB0aGUgdXNlciB0byByZWFkIHRoZSBjdXJyZW50IG9iamVjdC4nLFxuICAgICAgdHlwZTogbmV3IEdyYXBoUUxOb25OdWxsKEdyYXBoUUxCb29sZWFuKSxcbiAgICB9LFxuICAgIHdyaXRlOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0FsbG93IHRoZSB1c2VyIHRvIHdyaXRlIG9uIHRoZSBjdXJyZW50IG9iamVjdC4nLFxuICAgICAgdHlwZTogbmV3IEdyYXBoUUxOb25OdWxsKEdyYXBoUUxCb29sZWFuKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmNvbnN0IFJPTEVfQUNMX0lOUFVUID0gbmV3IEdyYXBoUUxJbnB1dE9iamVjdFR5cGUoe1xuICBuYW1lOiAnUm9sZUFDTElucHV0JyxcbiAgZGVzY3JpcHRpb246ICdBbGxvdyB0byBtYW5hZ2Ugcm9sZXMgaW4gQUNMLicsXG4gIGZpZWxkczoge1xuICAgIHJvbGVOYW1lOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ05hbWUgb2YgdGhlIHRhcmdldHRlZCBSb2xlLicsXG4gICAgICB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoR3JhcGhRTFN0cmluZyksXG4gICAgfSxcbiAgICByZWFkOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0FsbG93IHVzZXJzIHdobyBhcmUgbWVtYmVycyBvZiB0aGUgcm9sZSB0byByZWFkIHRoZSBjdXJyZW50IG9iamVjdC4nLFxuICAgICAgdHlwZTogbmV3IEdyYXBoUUxOb25OdWxsKEdyYXBoUUxCb29sZWFuKSxcbiAgICB9LFxuICAgIHdyaXRlOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0FsbG93IHVzZXJzIHdobyBhcmUgbWVtYmVycyBvZiB0aGUgcm9sZSB0byB3cml0ZSBvbiB0aGUgY3VycmVudCBvYmplY3QuJyxcbiAgICAgIHR5cGU6IG5ldyBHcmFwaFFMTm9uTnVsbChHcmFwaFFMQm9vbGVhbiksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5jb25zdCBQVUJMSUNfQUNMX0lOUFVUID0gbmV3IEdyYXBoUUxJbnB1dE9iamVjdFR5cGUoe1xuICBuYW1lOiAnUHVibGljQUNMSW5wdXQnLFxuICBkZXNjcmlwdGlvbjogJ0FsbG93IHRvIG1hbmFnZSBwdWJsaWMgcmlnaHRzLicsXG4gIGZpZWxkczoge1xuICAgIHJlYWQ6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnQWxsb3cgYW55b25lIHRvIHJlYWQgdGhlIGN1cnJlbnQgb2JqZWN0LicsXG4gICAgICB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoR3JhcGhRTEJvb2xlYW4pLFxuICAgIH0sXG4gICAgd3JpdGU6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnQWxsb3cgYW55b25lIHRvIHdyaXRlIG9uIHRoZSBjdXJyZW50IG9iamVjdC4nLFxuICAgICAgdHlwZTogbmV3IEdyYXBoUUxOb25OdWxsKEdyYXBoUUxCb29sZWFuKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmNvbnN0IEFDTF9JTlBVVCA9IG5ldyBHcmFwaFFMSW5wdXRPYmplY3RUeXBlKHtcbiAgbmFtZTogJ0FDTElucHV0JyxcbiAgZGVzY3JpcHRpb246XG4gICAgJ0FsbG93IHRvIG1hbmFnZSBhY2Nlc3MgcmlnaHRzLiBJZiBub3QgcHJvdmlkZWQgb2JqZWN0IHdpbGwgYmUgcHVibGljbHkgcmVhZGFibGUgYW5kIHdyaXRhYmxlJyxcbiAgZmllbGRzOiB7XG4gICAgdXNlcnM6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnQWNjZXNzIGNvbnRyb2wgbGlzdCBmb3IgdXNlcnMuJyxcbiAgICAgIHR5cGU6IG5ldyBHcmFwaFFMTGlzdChuZXcgR3JhcGhRTE5vbk51bGwoVVNFUl9BQ0xfSU5QVVQpKSxcbiAgICB9LFxuICAgIHJvbGVzOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0FjY2VzcyBjb250cm9sIGxpc3QgZm9yIHJvbGVzLicsXG4gICAgICB0eXBlOiBuZXcgR3JhcGhRTExpc3QobmV3IEdyYXBoUUxOb25OdWxsKFJPTEVfQUNMX0lOUFVUKSksXG4gICAgfSxcbiAgICBwdWJsaWM6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnUHVibGljIGFjY2VzcyBjb250cm9sIGxpc3QuJyxcbiAgICAgIHR5cGU6IFBVQkxJQ19BQ0xfSU5QVVQsXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5jb25zdCBVU0VSX0FDTCA9IG5ldyBHcmFwaFFMT2JqZWN0VHlwZSh7XG4gIG5hbWU6ICdVc2VyQUNMJyxcbiAgZGVzY3JpcHRpb246XG4gICAgJ0FsbG93IHRvIG1hbmFnZSB1c2VycyBpbiBBQ0wuIElmIHJlYWQgYW5kIHdyaXRlIGFyZSBudWxsIHRoZSB1c2VycyBoYXZlIHJlYWQgYW5kIHdyaXRlIHJpZ2h0cy4nLFxuICBmaWVsZHM6IHtcbiAgICB1c2VySWQ6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnSUQgb2YgdGhlIHRhcmdldHRlZCBVc2VyLicsXG4gICAgICB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoR3JhcGhRTElEKSxcbiAgICB9LFxuICAgIHJlYWQ6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnQWxsb3cgdGhlIHVzZXIgdG8gcmVhZCB0aGUgY3VycmVudCBvYmplY3QuJyxcbiAgICAgIHR5cGU6IG5ldyBHcmFwaFFMTm9uTnVsbChHcmFwaFFMQm9vbGVhbiksXG4gICAgfSxcbiAgICB3cml0ZToge1xuICAgICAgZGVzY3JpcHRpb246ICdBbGxvdyB0aGUgdXNlciB0byB3cml0ZSBvbiB0aGUgY3VycmVudCBvYmplY3QuJyxcbiAgICAgIHR5cGU6IG5ldyBHcmFwaFFMTm9uTnVsbChHcmFwaFFMQm9vbGVhbiksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5jb25zdCBST0xFX0FDTCA9IG5ldyBHcmFwaFFMT2JqZWN0VHlwZSh7XG4gIG5hbWU6ICdSb2xlQUNMJyxcbiAgZGVzY3JpcHRpb246XG4gICAgJ0FsbG93IHRvIG1hbmFnZSByb2xlcyBpbiBBQ0wuIElmIHJlYWQgYW5kIHdyaXRlIGFyZSBudWxsIHRoZSByb2xlIGhhdmUgcmVhZCBhbmQgd3JpdGUgcmlnaHRzLicsXG4gIGZpZWxkczoge1xuICAgIHJvbGVOYW1lOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ05hbWUgb2YgdGhlIHRhcmdldHRlZCBSb2xlLicsXG4gICAgICB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoR3JhcGhRTElEKSxcbiAgICB9LFxuICAgIHJlYWQ6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnQWxsb3cgdXNlcnMgd2hvIGFyZSBtZW1iZXJzIG9mIHRoZSByb2xlIHRvIHJlYWQgdGhlIGN1cnJlbnQgb2JqZWN0LicsXG4gICAgICB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoR3JhcGhRTEJvb2xlYW4pLFxuICAgIH0sXG4gICAgd3JpdGU6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnQWxsb3cgdXNlcnMgd2hvIGFyZSBtZW1iZXJzIG9mIHRoZSByb2xlIHRvIHdyaXRlIG9uIHRoZSBjdXJyZW50IG9iamVjdC4nLFxuICAgICAgdHlwZTogbmV3IEdyYXBoUUxOb25OdWxsKEdyYXBoUUxCb29sZWFuKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmNvbnN0IFBVQkxJQ19BQ0wgPSBuZXcgR3JhcGhRTE9iamVjdFR5cGUoe1xuICBuYW1lOiAnUHVibGljQUNMJyxcbiAgZGVzY3JpcHRpb246ICdBbGxvdyB0byBtYW5hZ2UgcHVibGljIHJpZ2h0cy4nLFxuICBmaWVsZHM6IHtcbiAgICByZWFkOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0FsbG93IGFueW9uZSB0byByZWFkIHRoZSBjdXJyZW50IG9iamVjdC4nLFxuICAgICAgdHlwZTogR3JhcGhRTEJvb2xlYW4sXG4gICAgfSxcbiAgICB3cml0ZToge1xuICAgICAgZGVzY3JpcHRpb246ICdBbGxvdyBhbnlvbmUgdG8gd3JpdGUgb24gdGhlIGN1cnJlbnQgb2JqZWN0LicsXG4gICAgICB0eXBlOiBHcmFwaFFMQm9vbGVhbixcbiAgICB9LFxuICB9LFxufSk7XG5cbmNvbnN0IEFDTCA9IG5ldyBHcmFwaFFMT2JqZWN0VHlwZSh7XG4gIG5hbWU6ICdBQ0wnLFxuICBkZXNjcmlwdGlvbjogJ0N1cnJlbnQgYWNjZXNzIGNvbnRyb2wgbGlzdCBvZiB0aGUgY3VycmVudCBvYmplY3QuJyxcbiAgZmllbGRzOiB7XG4gICAgdXNlcnM6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnQWNjZXNzIGNvbnRyb2wgbGlzdCBmb3IgdXNlcnMuJyxcbiAgICAgIHR5cGU6IG5ldyBHcmFwaFFMTGlzdChuZXcgR3JhcGhRTE5vbk51bGwoVVNFUl9BQ0wpKSxcbiAgICAgIHJlc29sdmUocCkge1xuICAgICAgICBjb25zdCB1c2VycyA9IFtdO1xuICAgICAgICBPYmplY3Qua2V5cyhwKS5mb3JFYWNoKHJ1bGUgPT4ge1xuICAgICAgICAgIGlmIChydWxlICE9PSAnKicgJiYgcnVsZS5pbmRleE9mKCdyb2xlOicpICE9PSAwKSB7XG4gICAgICAgICAgICB1c2Vycy5wdXNoKHtcbiAgICAgICAgICAgICAgdXNlcklkOiB0b0dsb2JhbElkKCdfVXNlcicsIHJ1bGUpLFxuICAgICAgICAgICAgICByZWFkOiBwW3J1bGVdLnJlYWQgPyB0cnVlIDogZmFsc2UsXG4gICAgICAgICAgICAgIHdyaXRlOiBwW3J1bGVdLndyaXRlID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHVzZXJzLmxlbmd0aCA/IHVzZXJzIDogbnVsbDtcbiAgICAgIH0sXG4gICAgfSxcbiAgICByb2xlczoge1xuICAgICAgZGVzY3JpcHRpb246ICdBY2Nlc3MgY29udHJvbCBsaXN0IGZvciByb2xlcy4nLFxuICAgICAgdHlwZTogbmV3IEdyYXBoUUxMaXN0KG5ldyBHcmFwaFFMTm9uTnVsbChST0xFX0FDTCkpLFxuICAgICAgcmVzb2x2ZShwKSB7XG4gICAgICAgIGNvbnN0IHJvbGVzID0gW107XG4gICAgICAgIE9iamVjdC5rZXlzKHApLmZvckVhY2gocnVsZSA9PiB7XG4gICAgICAgICAgaWYgKHJ1bGUuaW5kZXhPZigncm9sZTonKSA9PT0gMCkge1xuICAgICAgICAgICAgcm9sZXMucHVzaCh7XG4gICAgICAgICAgICAgIHJvbGVOYW1lOiBydWxlLnJlcGxhY2UoJ3JvbGU6JywgJycpLFxuICAgICAgICAgICAgICByZWFkOiBwW3J1bGVdLnJlYWQgPyB0cnVlIDogZmFsc2UsXG4gICAgICAgICAgICAgIHdyaXRlOiBwW3J1bGVdLndyaXRlID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJvbGVzLmxlbmd0aCA/IHJvbGVzIDogbnVsbDtcbiAgICAgIH0sXG4gICAgfSxcbiAgICBwdWJsaWM6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnUHVibGljIGFjY2VzcyBjb250cm9sIGxpc3QuJyxcbiAgICAgIHR5cGU6IFBVQkxJQ19BQ0wsXG4gICAgICByZXNvbHZlKHApIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgKi9cbiAgICAgICAgcmV0dXJuIHBbJyonXVxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICByZWFkOiBwWycqJ10ucmVhZCA/IHRydWUgOiBmYWxzZSxcbiAgICAgICAgICAgICAgd3JpdGU6IHBbJyonXS53cml0ZSA/IHRydWUgOiBmYWxzZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IG51bGw7XG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59KTtcblxuY29uc3QgT0JKRUNUX0lEID0gbmV3IEdyYXBoUUxOb25OdWxsKEdyYXBoUUxJRCk7XG5cbmNvbnN0IENMQVNTX05BTUVfQVRUID0ge1xuICBkZXNjcmlwdGlvbjogJ1RoaXMgaXMgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIG9iamVjdC4nLFxuICB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoR3JhcGhRTFN0cmluZyksXG59O1xuXG5jb25zdCBHTE9CQUxfT1JfT0JKRUNUX0lEX0FUVCA9IHtcbiAgZGVzY3JpcHRpb246ICdUaGlzIGlzIHRoZSBvYmplY3QgaWQuIFlvdSBjYW4gdXNlIGVpdGhlciB0aGUgZ2xvYmFsIG9yIHRoZSBvYmplY3QgaWQuJyxcbiAgdHlwZTogT0JKRUNUX0lELFxufTtcblxuY29uc3QgT0JKRUNUX0lEX0FUVCA9IHtcbiAgZGVzY3JpcHRpb246ICdUaGlzIGlzIHRoZSBvYmplY3QgaWQuJyxcbiAgdHlwZTogT0JKRUNUX0lELFxufTtcblxuY29uc3QgQ1JFQVRFRF9BVF9BVFQgPSB7XG4gIGRlc2NyaXB0aW9uOiAnVGhpcyBpcyB0aGUgZGF0ZSBpbiB3aGljaCB0aGUgb2JqZWN0IHdhcyBjcmVhdGVkLicsXG4gIHR5cGU6IG5ldyBHcmFwaFFMTm9uTnVsbChEQVRFKSxcbn07XG5cbmNvbnN0IFVQREFURURfQVRfQVRUID0ge1xuICBkZXNjcmlwdGlvbjogJ1RoaXMgaXMgdGhlIGRhdGUgaW4gd2hpY2ggdGhlIG9iamVjdCB3YXMgbGFzIHVwZGF0ZWQuJyxcbiAgdHlwZTogbmV3IEdyYXBoUUxOb25OdWxsKERBVEUpLFxufTtcblxuY29uc3QgSU5QVVRfRklFTERTID0ge1xuICBBQ0w6IHtcbiAgICB0eXBlOiBBQ0wsXG4gIH0sXG59O1xuXG5jb25zdCBDUkVBVEVfUkVTVUxUX0ZJRUxEUyA9IHtcbiAgb2JqZWN0SWQ6IE9CSkVDVF9JRF9BVFQsXG4gIGNyZWF0ZWRBdDogQ1JFQVRFRF9BVF9BVFQsXG59O1xuXG5jb25zdCBVUERBVEVfUkVTVUxUX0ZJRUxEUyA9IHtcbiAgdXBkYXRlZEF0OiBVUERBVEVEX0FUX0FUVCxcbn07XG5cbmNvbnN0IFBBUlNFX09CSkVDVF9GSUVMRFMgPSB7XG4gIC4uLkNSRUFURV9SRVNVTFRfRklFTERTLFxuICAuLi5VUERBVEVfUkVTVUxUX0ZJRUxEUyxcbiAgLi4uSU5QVVRfRklFTERTLFxuICBBQ0w6IHtcbiAgICB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoQUNMKSxcbiAgICByZXNvbHZlOiAoeyBBQ0wgfSkgPT4gKEFDTCA/IEFDTCA6IHsgJyonOiB7IHJlYWQ6IHRydWUsIHdyaXRlOiB0cnVlIH0gfSksXG4gIH0sXG59O1xuXG5jb25zdCBQQVJTRV9PQkpFQ1QgPSBuZXcgR3JhcGhRTEludGVyZmFjZVR5cGUoe1xuICBuYW1lOiAnUGFyc2VPYmplY3QnLFxuICBkZXNjcmlwdGlvbjpcbiAgICAnVGhlIFBhcnNlT2JqZWN0IGludGVyZmFjZSB0eXBlIGlzIHVzZWQgYXMgYSBiYXNlIHR5cGUgZm9yIHRoZSBhdXRvIGdlbmVyYXRlZCBvYmplY3QgdHlwZXMuJyxcbiAgZmllbGRzOiBQQVJTRV9PQkpFQ1RfRklFTERTLFxufSk7XG5cbmNvbnN0IFNFU1NJT05fVE9LRU5fQVRUID0ge1xuICBkZXNjcmlwdGlvbjogJ1RoZSBjdXJyZW50IHVzZXIgc2Vzc2lvbiB0b2tlbi4nLFxuICB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoR3JhcGhRTFN0cmluZyksXG59O1xuXG5jb25zdCBSRUFEX1BSRUZFUkVOQ0UgPSBuZXcgR3JhcGhRTEVudW1UeXBlKHtcbiAgbmFtZTogJ1JlYWRQcmVmZXJlbmNlJyxcbiAgZGVzY3JpcHRpb246XG4gICAgJ1RoZSBSZWFkUHJlZmVyZW5jZSBlbnVtIHR5cGUgaXMgdXNlZCBpbiBxdWVyaWVzIGluIG9yZGVyIHRvIHNlbGVjdCBpbiB3aGljaCBkYXRhYmFzZSByZXBsaWNhIHRoZSBvcGVyYXRpb24gbXVzdCBydW4uJyxcbiAgdmFsdWVzOiB7XG4gICAgUFJJTUFSWTogeyB2YWx1ZTogJ1BSSU1BUlknIH0sXG4gICAgUFJJTUFSWV9QUkVGRVJSRUQ6IHsgdmFsdWU6ICdQUklNQVJZX1BSRUZFUlJFRCcgfSxcbiAgICBTRUNPTkRBUlk6IHsgdmFsdWU6ICdTRUNPTkRBUlknIH0sXG4gICAgU0VDT05EQVJZX1BSRUZFUlJFRDogeyB2YWx1ZTogJ1NFQ09OREFSWV9QUkVGRVJSRUQnIH0sXG4gICAgTkVBUkVTVDogeyB2YWx1ZTogJ05FQVJFU1QnIH0sXG4gIH0sXG59KTtcblxuY29uc3QgUkVBRF9QUkVGRVJFTkNFX0FUVCA9IHtcbiAgZGVzY3JpcHRpb246ICdUaGUgcmVhZCBwcmVmZXJlbmNlIGZvciB0aGUgbWFpbiBxdWVyeSB0byBiZSBleGVjdXRlZC4nLFxuICB0eXBlOiBSRUFEX1BSRUZFUkVOQ0UsXG59O1xuXG5jb25zdCBJTkNMVURFX1JFQURfUFJFRkVSRU5DRV9BVFQgPSB7XG4gIGRlc2NyaXB0aW9uOiAnVGhlIHJlYWQgcHJlZmVyZW5jZSBmb3IgdGhlIHF1ZXJpZXMgdG8gYmUgZXhlY3V0ZWQgdG8gaW5jbHVkZSBmaWVsZHMuJyxcbiAgdHlwZTogUkVBRF9QUkVGRVJFTkNFLFxufTtcblxuY29uc3QgU1VCUVVFUllfUkVBRF9QUkVGRVJFTkNFX0FUVCA9IHtcbiAgZGVzY3JpcHRpb246ICdUaGUgcmVhZCBwcmVmZXJlbmNlIGZvciB0aGUgc3VicXVlcmllcyB0aGF0IG1heSBiZSByZXF1aXJlZC4nLFxuICB0eXBlOiBSRUFEX1BSRUZFUkVOQ0UsXG59O1xuXG5jb25zdCBSRUFEX09QVElPTlNfSU5QVVQgPSBuZXcgR3JhcGhRTElucHV0T2JqZWN0VHlwZSh7XG4gIG5hbWU6ICdSZWFkT3B0aW9uc0lucHV0JyxcbiAgZGVzY3JpcHRpb246XG4gICAgJ1RoZSBSZWFkT3B0aW9uc0lucHV0dCB0eXBlIGlzIHVzZWQgaW4gcXVlcmllcyBpbiBvcmRlciB0byBzZXQgdGhlIHJlYWQgcHJlZmVyZW5jZXMuJyxcbiAgZmllbGRzOiB7XG4gICAgcmVhZFByZWZlcmVuY2U6IFJFQURfUFJFRkVSRU5DRV9BVFQsXG4gICAgaW5jbHVkZVJlYWRQcmVmZXJlbmNlOiBJTkNMVURFX1JFQURfUFJFRkVSRU5DRV9BVFQsXG4gICAgc3VicXVlcnlSZWFkUHJlZmVyZW5jZTogU1VCUVVFUllfUkVBRF9QUkVGRVJFTkNFX0FUVCxcbiAgfSxcbn0pO1xuXG5jb25zdCBSRUFEX09QVElPTlNfQVRUID0ge1xuICBkZXNjcmlwdGlvbjogJ1RoZSByZWFkIG9wdGlvbnMgZm9yIHRoZSBxdWVyeSB0byBiZSBleGVjdXRlZC4nLFxuICB0eXBlOiBSRUFEX09QVElPTlNfSU5QVVQsXG59O1xuXG5jb25zdCBXSEVSRV9BVFQgPSB7XG4gIGRlc2NyaXB0aW9uOiAnVGhlc2UgYXJlIHRoZSBjb25kaXRpb25zIHRoYXQgdGhlIG9iamVjdHMgbmVlZCB0byBtYXRjaCBpbiBvcmRlciB0byBiZSBmb3VuZCcsXG4gIHR5cGU6IE9CSkVDVCxcbn07XG5cbmNvbnN0IFNLSVBfQVRUID0ge1xuICBkZXNjcmlwdGlvbjogJ1RoaXMgaXMgdGhlIG51bWJlciBvZiBvYmplY3RzIHRoYXQgbXVzdCBiZSBza2lwcGVkIHRvIHJldHVybi4nLFxuICB0eXBlOiBHcmFwaFFMSW50LFxufTtcblxuY29uc3QgTElNSVRfQVRUID0ge1xuICBkZXNjcmlwdGlvbjogJ1RoaXMgaXMgdGhlIGxpbWl0IG51bWJlciBvZiBvYmplY3RzIHRoYXQgbXVzdCBiZSByZXR1cm5lZC4nLFxuICB0eXBlOiBHcmFwaFFMSW50LFxufTtcblxuY29uc3QgQ09VTlRfQVRUID0ge1xuICBkZXNjcmlwdGlvbjpcbiAgICAnVGhpcyBpcyB0aGUgdG90YWwgbWF0Y2hlZCBvYmplY3MgY291bnQgdGhhdCBpcyByZXR1cm5lZCB3aGVuIHRoZSBjb3VudCBmbGFnIGlzIHNldC4nLFxuICB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoR3JhcGhRTEludCksXG59O1xuXG5jb25zdCBTRUFSQ0hfSU5QVVQgPSBuZXcgR3JhcGhRTElucHV0T2JqZWN0VHlwZSh7XG4gIG5hbWU6ICdTZWFyY2hJbnB1dCcsXG4gIGRlc2NyaXB0aW9uOiAnVGhlIFNlYXJjaElucHV0IHR5cGUgaXMgdXNlZCB0byBzcGVjaWZpeSBhIHNlYXJjaCBvcGVyYXRpb24gb24gYSBmdWxsIHRleHQgc2VhcmNoLicsXG4gIGZpZWxkczoge1xuICAgIHRlcm06IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhpcyBpcyB0aGUgdGVybSB0byBiZSBzZWFyY2hlZC4nLFxuICAgICAgdHlwZTogbmV3IEdyYXBoUUxOb25OdWxsKEdyYXBoUUxTdHJpbmcpLFxuICAgIH0sXG4gICAgbGFuZ3VhZ2U6IHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnVGhpcyBpcyB0aGUgbGFuZ3VhZ2UgdG8gdGV0ZXJtaW5lIHRoZSBsaXN0IG9mIHN0b3Agd29yZHMgYW5kIHRoZSBydWxlcyBmb3IgdG9rZW5pemVyLicsXG4gICAgICB0eXBlOiBHcmFwaFFMU3RyaW5nLFxuICAgIH0sXG4gICAgY2FzZVNlbnNpdGl2ZToge1xuICAgICAgZGVzY3JpcHRpb246ICdUaGlzIGlzIHRoZSBmbGFnIHRvIGVuYWJsZSBvciBkaXNhYmxlIGNhc2Ugc2Vuc2l0aXZlIHNlYXJjaC4nLFxuICAgICAgdHlwZTogR3JhcGhRTEJvb2xlYW4sXG4gICAgfSxcbiAgICBkaWFjcml0aWNTZW5zaXRpdmU6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhpcyBpcyB0aGUgZmxhZyB0byBlbmFibGUgb3IgZGlzYWJsZSBkaWFjcml0aWMgc2Vuc2l0aXZlIHNlYXJjaC4nLFxuICAgICAgdHlwZTogR3JhcGhRTEJvb2xlYW4sXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5jb25zdCBURVhUX0lOUFVUID0gbmV3IEdyYXBoUUxJbnB1dE9iamVjdFR5cGUoe1xuICBuYW1lOiAnVGV4dElucHV0JyxcbiAgZGVzY3JpcHRpb246ICdUaGUgVGV4dElucHV0IHR5cGUgaXMgdXNlZCB0byBzcGVjaWZ5IGEgdGV4dCBvcGVyYXRpb24gb24gYSBjb25zdHJhaW50LicsXG4gIGZpZWxkczoge1xuICAgIHNlYXJjaDoge1xuICAgICAgZGVzY3JpcHRpb246ICdUaGlzIGlzIHRoZSBzZWFyY2ggdG8gYmUgZXhlY3V0ZWQuJyxcbiAgICAgIHR5cGU6IG5ldyBHcmFwaFFMTm9uTnVsbChTRUFSQ0hfSU5QVVQpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuY29uc3QgQk9YX0lOUFVUID0gbmV3IEdyYXBoUUxJbnB1dE9iamVjdFR5cGUoe1xuICBuYW1lOiAnQm94SW5wdXQnLFxuICBkZXNjcmlwdGlvbjogJ1RoZSBCb3hJbnB1dCB0eXBlIGlzIHVzZWQgdG8gc3BlY2lmaXkgYSBib3ggb3BlcmF0aW9uIG9uIGEgd2l0aGluIGdlbyBxdWVyeS4nLFxuICBmaWVsZHM6IHtcbiAgICBib3R0b21MZWZ0OiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1RoaXMgaXMgdGhlIGJvdHRvbSBsZWZ0IGNvb3JkaW5hdGVzIG9mIHRoZSBib3guJyxcbiAgICAgIHR5cGU6IG5ldyBHcmFwaFFMTm9uTnVsbChHRU9fUE9JTlRfSU5QVVQpLFxuICAgIH0sXG4gICAgdXBwZXJSaWdodDoge1xuICAgICAgZGVzY3JpcHRpb246ICdUaGlzIGlzIHRoZSB1cHBlciByaWdodCBjb29yZGluYXRlcyBvZiB0aGUgYm94LicsXG4gICAgICB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoR0VPX1BPSU5UX0lOUFVUKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmNvbnN0IFdJVEhJTl9JTlBVVCA9IG5ldyBHcmFwaFFMSW5wdXRPYmplY3RUeXBlKHtcbiAgbmFtZTogJ1dpdGhpbklucHV0JyxcbiAgZGVzY3JpcHRpb246ICdUaGUgV2l0aGluSW5wdXQgdHlwZSBpcyB1c2VkIHRvIHNwZWNpZnkgYSB3aXRoaW4gb3BlcmF0aW9uIG9uIGEgY29uc3RyYWludC4nLFxuICBmaWVsZHM6IHtcbiAgICBib3g6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhpcyBpcyB0aGUgYm94IHRvIGJlIHNwZWNpZmllZC4nLFxuICAgICAgdHlwZTogbmV3IEdyYXBoUUxOb25OdWxsKEJPWF9JTlBVVCksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5jb25zdCBDRU5URVJfU1BIRVJFX0lOUFVUID0gbmV3IEdyYXBoUUxJbnB1dE9iamVjdFR5cGUoe1xuICBuYW1lOiAnQ2VudGVyU3BoZXJlSW5wdXQnLFxuICBkZXNjcmlwdGlvbjpcbiAgICAnVGhlIENlbnRlclNwaGVyZUlucHV0IHR5cGUgaXMgdXNlZCB0byBzcGVjaWZpeSBhIGNlbnRlclNwaGVyZSBvcGVyYXRpb24gb24gYSBnZW9XaXRoaW4gcXVlcnkuJyxcbiAgZmllbGRzOiB7XG4gICAgY2VudGVyOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1RoaXMgaXMgdGhlIGNlbnRlciBvZiB0aGUgc3BoZXJlLicsXG4gICAgICB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoR0VPX1BPSU5UX0lOUFVUKSxcbiAgICB9LFxuICAgIGRpc3RhbmNlOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1RoaXMgaXMgdGhlIHJhZGl1cyBvZiB0aGUgc3BoZXJlLicsXG4gICAgICB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoR3JhcGhRTEZsb2F0KSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmNvbnN0IEdFT19XSVRISU5fSU5QVVQgPSBuZXcgR3JhcGhRTElucHV0T2JqZWN0VHlwZSh7XG4gIG5hbWU6ICdHZW9XaXRoaW5JbnB1dCcsXG4gIGRlc2NyaXB0aW9uOiAnVGhlIEdlb1dpdGhpbklucHV0IHR5cGUgaXMgdXNlZCB0byBzcGVjaWZ5IGEgZ2VvV2l0aGluIG9wZXJhdGlvbiBvbiBhIGNvbnN0cmFpbnQuJyxcbiAgZmllbGRzOiB7XG4gICAgcG9seWdvbjoge1xuICAgICAgZGVzY3JpcHRpb246ICdUaGlzIGlzIHRoZSBwb2x5Z29uIHRvIGJlIHNwZWNpZmllZC4nLFxuICAgICAgdHlwZTogUE9MWUdPTl9JTlBVVCxcbiAgICB9LFxuICAgIGNlbnRlclNwaGVyZToge1xuICAgICAgZGVzY3JpcHRpb246ICdUaGlzIGlzIHRoZSBzcGhlcmUgdG8gYmUgc3BlY2lmaWVkLicsXG4gICAgICB0eXBlOiBDRU5URVJfU1BIRVJFX0lOUFVULFxuICAgIH0sXG4gIH0sXG59KTtcblxuY29uc3QgR0VPX0lOVEVSU0VDVFNfSU5QVVQgPSBuZXcgR3JhcGhRTElucHV0T2JqZWN0VHlwZSh7XG4gIG5hbWU6ICdHZW9JbnRlcnNlY3RzSW5wdXQnLFxuICBkZXNjcmlwdGlvbjpcbiAgICAnVGhlIEdlb0ludGVyc2VjdHNJbnB1dCB0eXBlIGlzIHVzZWQgdG8gc3BlY2lmeSBhIGdlb0ludGVyc2VjdHMgb3BlcmF0aW9uIG9uIGEgY29uc3RyYWludC4nLFxuICBmaWVsZHM6IHtcbiAgICBwb2ludDoge1xuICAgICAgZGVzY3JpcHRpb246ICdUaGlzIGlzIHRoZSBwb2ludCB0byBiZSBzcGVjaWZpZWQuJyxcbiAgICAgIHR5cGU6IEdFT19QT0lOVF9JTlBVVCxcbiAgICB9LFxuICB9LFxufSk7XG5cbmNvbnN0IGVxdWFsVG8gPSB0eXBlID0+ICh7XG4gIGRlc2NyaXB0aW9uOlxuICAgICdUaGlzIGlzIHRoZSBlcXVhbFRvIG9wZXJhdG9yIHRvIHNwZWNpZnkgYSBjb25zdHJhaW50IHRvIHNlbGVjdCB0aGUgb2JqZWN0cyB3aGVyZSB0aGUgdmFsdWUgb2YgYSBmaWVsZCBlcXVhbHMgdG8gYSBzcGVjaWZpZWQgdmFsdWUuJyxcbiAgdHlwZSxcbn0pO1xuXG5jb25zdCBub3RFcXVhbFRvID0gdHlwZSA9PiAoe1xuICBkZXNjcmlwdGlvbjpcbiAgICAnVGhpcyBpcyB0aGUgbm90RXF1YWxUbyBvcGVyYXRvciB0byBzcGVjaWZ5IGEgY29uc3RyYWludCB0byBzZWxlY3QgdGhlIG9iamVjdHMgd2hlcmUgdGhlIHZhbHVlIG9mIGEgZmllbGQgZG8gbm90IGVxdWFsIHRvIGEgc3BlY2lmaWVkIHZhbHVlLicsXG4gIHR5cGUsXG59KTtcblxuY29uc3QgbGVzc1RoYW4gPSB0eXBlID0+ICh7XG4gIGRlc2NyaXB0aW9uOlxuICAgICdUaGlzIGlzIHRoZSBsZXNzVGhhbiBvcGVyYXRvciB0byBzcGVjaWZ5IGEgY29uc3RyYWludCB0byBzZWxlY3QgdGhlIG9iamVjdHMgd2hlcmUgdGhlIHZhbHVlIG9mIGEgZmllbGQgaXMgbGVzcyB0aGFuIGEgc3BlY2lmaWVkIHZhbHVlLicsXG4gIHR5cGUsXG59KTtcblxuY29uc3QgbGVzc1RoYW5PckVxdWFsVG8gPSB0eXBlID0+ICh7XG4gIGRlc2NyaXB0aW9uOlxuICAgICdUaGlzIGlzIHRoZSBsZXNzVGhhbk9yRXF1YWxUbyBvcGVyYXRvciB0byBzcGVjaWZ5IGEgY29uc3RyYWludCB0byBzZWxlY3QgdGhlIG9iamVjdHMgd2hlcmUgdGhlIHZhbHVlIG9mIGEgZmllbGQgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGEgc3BlY2lmaWVkIHZhbHVlLicsXG4gIHR5cGUsXG59KTtcblxuY29uc3QgZ3JlYXRlclRoYW4gPSB0eXBlID0+ICh7XG4gIGRlc2NyaXB0aW9uOlxuICAgICdUaGlzIGlzIHRoZSBncmVhdGVyVGhhbiBvcGVyYXRvciB0byBzcGVjaWZ5IGEgY29uc3RyYWludCB0byBzZWxlY3QgdGhlIG9iamVjdHMgd2hlcmUgdGhlIHZhbHVlIG9mIGEgZmllbGQgaXMgZ3JlYXRlciB0aGFuIGEgc3BlY2lmaWVkIHZhbHVlLicsXG4gIHR5cGUsXG59KTtcblxuY29uc3QgZ3JlYXRlclRoYW5PckVxdWFsVG8gPSB0eXBlID0+ICh7XG4gIGRlc2NyaXB0aW9uOlxuICAgICdUaGlzIGlzIHRoZSBncmVhdGVyVGhhbk9yRXF1YWxUbyBvcGVyYXRvciB0byBzcGVjaWZ5IGEgY29uc3RyYWludCB0byBzZWxlY3QgdGhlIG9iamVjdHMgd2hlcmUgdGhlIHZhbHVlIG9mIGEgZmllbGQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGEgc3BlY2lmaWVkIHZhbHVlLicsXG4gIHR5cGUsXG59KTtcblxuY29uc3QgaW5PcCA9IHR5cGUgPT4gKHtcbiAgZGVzY3JpcHRpb246XG4gICAgJ1RoaXMgaXMgdGhlIGluIG9wZXJhdG9yIHRvIHNwZWNpZnkgYSBjb25zdHJhaW50IHRvIHNlbGVjdCB0aGUgb2JqZWN0cyB3aGVyZSB0aGUgdmFsdWUgb2YgYSBmaWVsZCBlcXVhbHMgYW55IHZhbHVlIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkuJyxcbiAgdHlwZTogbmV3IEdyYXBoUUxMaXN0KHR5cGUpLFxufSk7XG5cbmNvbnN0IG5vdEluID0gdHlwZSA9PiAoe1xuICBkZXNjcmlwdGlvbjpcbiAgICAnVGhpcyBpcyB0aGUgbm90SW4gb3BlcmF0b3IgdG8gc3BlY2lmeSBhIGNvbnN0cmFpbnQgdG8gc2VsZWN0IHRoZSBvYmplY3RzIHdoZXJlIHRoZSB2YWx1ZSBvZiBhIGZpZWxkIGRvIG5vdCBlcXVhbCBhbnkgdmFsdWUgaW4gdGhlIHNwZWNpZmllZCBhcnJheS4nLFxuICB0eXBlOiBuZXcgR3JhcGhRTExpc3QodHlwZSksXG59KTtcblxuY29uc3QgZXhpc3RzID0ge1xuICBkZXNjcmlwdGlvbjpcbiAgICAnVGhpcyBpcyB0aGUgZXhpc3RzIG9wZXJhdG9yIHRvIHNwZWNpZnkgYSBjb25zdHJhaW50IHRvIHNlbGVjdCB0aGUgb2JqZWN0cyB3aGVyZSBhIGZpZWxkIGV4aXN0cyAob3IgZG8gbm90IGV4aXN0KS4nLFxuICB0eXBlOiBHcmFwaFFMQm9vbGVhbixcbn07XG5cbmNvbnN0IG1hdGNoZXNSZWdleCA9IHtcbiAgZGVzY3JpcHRpb246XG4gICAgJ1RoaXMgaXMgdGhlIG1hdGNoZXNSZWdleCBvcGVyYXRvciB0byBzcGVjaWZ5IGEgY29uc3RyYWludCB0byBzZWxlY3QgdGhlIG9iamVjdHMgd2hlcmUgdGhlIHZhbHVlIG9mIGEgZmllbGQgbWF0Y2hlcyBhIHNwZWNpZmllZCByZWd1bGFyIGV4cHJlc3Npb24uJyxcbiAgdHlwZTogR3JhcGhRTFN0cmluZyxcbn07XG5cbmNvbnN0IG9wdGlvbnMgPSB7XG4gIGRlc2NyaXB0aW9uOlxuICAgICdUaGlzIGlzIHRoZSBvcHRpb25zIG9wZXJhdG9yIHRvIHNwZWNpZnkgb3B0aW9uYWwgZmxhZ3MgKHN1Y2ggYXMgXCJpXCIgYW5kIFwibVwiKSB0byBiZSBhZGRlZCB0byBhIG1hdGNoZXNSZWdleCBvcGVyYXRpb24gaW4gdGhlIHNhbWUgc2V0IG9mIGNvbnN0cmFpbnRzLicsXG4gIHR5cGU6IEdyYXBoUUxTdHJpbmcsXG59O1xuXG5jb25zdCBTVUJRVUVSWV9JTlBVVCA9IG5ldyBHcmFwaFFMSW5wdXRPYmplY3RUeXBlKHtcbiAgbmFtZTogJ1N1YnF1ZXJ5SW5wdXQnLFxuICBkZXNjcmlwdGlvbjogJ1RoZSBTdWJxdWVyeUlucHV0IHR5cGUgaXMgdXNlZCB0byBzcGVjaWZ5IGEgc3ViIHF1ZXJ5IHRvIGFub3RoZXIgY2xhc3MuJyxcbiAgZmllbGRzOiB7XG4gICAgY2xhc3NOYW1lOiBDTEFTU19OQU1FX0FUVCxcbiAgICB3aGVyZTogT2JqZWN0LmFzc2lnbih7fSwgV0hFUkVfQVRULCB7XG4gICAgICB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoV0hFUkVfQVRULnR5cGUpLFxuICAgIH0pLFxuICB9LFxufSk7XG5cbmNvbnN0IFNFTEVDVF9JTlBVVCA9IG5ldyBHcmFwaFFMSW5wdXRPYmplY3RUeXBlKHtcbiAgbmFtZTogJ1NlbGVjdElucHV0JyxcbiAgZGVzY3JpcHRpb246XG4gICAgJ1RoZSBTZWxlY3RJbnB1dCB0eXBlIGlzIHVzZWQgdG8gc3BlY2lmeSBhbiBpblF1ZXJ5S2V5IG9yIGEgbm90SW5RdWVyeUtleSBvcGVyYXRpb24gb24gYSBjb25zdHJhaW50LicsXG4gIGZpZWxkczoge1xuICAgIHF1ZXJ5OiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1RoaXMgaXMgdGhlIHN1YnF1ZXJ5IHRvIGJlIGV4ZWN1dGVkLicsXG4gICAgICB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoU1VCUVVFUllfSU5QVVQpLFxuICAgIH0sXG4gICAga2V5OiB7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ1RoaXMgaXMgdGhlIGtleSBpbiB0aGUgcmVzdWx0IG9mIHRoZSBzdWJxdWVyeSB0aGF0IG11c3QgbWF0Y2ggKG5vdCBtYXRjaCkgdGhlIGZpZWxkLicsXG4gICAgICB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoR3JhcGhRTFN0cmluZyksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5jb25zdCBpblF1ZXJ5S2V5ID0ge1xuICBkZXNjcmlwdGlvbjpcbiAgICAnVGhpcyBpcyB0aGUgaW5RdWVyeUtleSBvcGVyYXRvciB0byBzcGVjaWZ5IGEgY29uc3RyYWludCB0byBzZWxlY3QgdGhlIG9iamVjdHMgd2hlcmUgYSBmaWVsZCBlcXVhbHMgdG8gYSBrZXkgaW4gdGhlIHJlc3VsdCBvZiBhIGRpZmZlcmVudCBxdWVyeS4nLFxuICB0eXBlOiBTRUxFQ1RfSU5QVVQsXG59O1xuXG5jb25zdCBub3RJblF1ZXJ5S2V5ID0ge1xuICBkZXNjcmlwdGlvbjpcbiAgICAnVGhpcyBpcyB0aGUgbm90SW5RdWVyeUtleSBvcGVyYXRvciB0byBzcGVjaWZ5IGEgY29uc3RyYWludCB0byBzZWxlY3QgdGhlIG9iamVjdHMgd2hlcmUgYSBmaWVsZCBkbyBub3QgZXF1YWwgdG8gYSBrZXkgaW4gdGhlIHJlc3VsdCBvZiBhIGRpZmZlcmVudCBxdWVyeS4nLFxuICB0eXBlOiBTRUxFQ1RfSU5QVVQsXG59O1xuXG5jb25zdCBJRF9XSEVSRV9JTlBVVCA9IG5ldyBHcmFwaFFMSW5wdXRPYmplY3RUeXBlKHtcbiAgbmFtZTogJ0lkV2hlcmVJbnB1dCcsXG4gIGRlc2NyaXB0aW9uOlxuICAgICdUaGUgSWRXaGVyZUlucHV0IGlucHV0IHR5cGUgaXMgdXNlZCBpbiBvcGVyYXRpb25zIHRoYXQgaW52b2x2ZSBmaWx0ZXJpbmcgb2JqZWN0cyBieSBhbiBpZC4nLFxuICBmaWVsZHM6IHtcbiAgICBlcXVhbFRvOiBlcXVhbFRvKEdyYXBoUUxJRCksXG4gICAgbm90RXF1YWxUbzogbm90RXF1YWxUbyhHcmFwaFFMSUQpLFxuICAgIGxlc3NUaGFuOiBsZXNzVGhhbihHcmFwaFFMSUQpLFxuICAgIGxlc3NUaGFuT3JFcXVhbFRvOiBsZXNzVGhhbk9yRXF1YWxUbyhHcmFwaFFMSUQpLFxuICAgIGdyZWF0ZXJUaGFuOiBncmVhdGVyVGhhbihHcmFwaFFMSUQpLFxuICAgIGdyZWF0ZXJUaGFuT3JFcXVhbFRvOiBncmVhdGVyVGhhbk9yRXF1YWxUbyhHcmFwaFFMSUQpLFxuICAgIGluOiBpbk9wKEdyYXBoUUxJRCksXG4gICAgbm90SW46IG5vdEluKEdyYXBoUUxJRCksXG4gICAgZXhpc3RzLFxuICAgIGluUXVlcnlLZXksXG4gICAgbm90SW5RdWVyeUtleSxcbiAgfSxcbn0pO1xuXG5jb25zdCBTVFJJTkdfV0hFUkVfSU5QVVQgPSBuZXcgR3JhcGhRTElucHV0T2JqZWN0VHlwZSh7XG4gIG5hbWU6ICdTdHJpbmdXaGVyZUlucHV0JyxcbiAgZGVzY3JpcHRpb246XG4gICAgJ1RoZSBTdHJpbmdXaGVyZUlucHV0IGlucHV0IHR5cGUgaXMgdXNlZCBpbiBvcGVyYXRpb25zIHRoYXQgaW52b2x2ZSBmaWx0ZXJpbmcgb2JqZWN0cyBieSBhIGZpZWxkIG9mIHR5cGUgU3RyaW5nLicsXG4gIGZpZWxkczoge1xuICAgIGVxdWFsVG86IGVxdWFsVG8oR3JhcGhRTFN0cmluZyksXG4gICAgbm90RXF1YWxUbzogbm90RXF1YWxUbyhHcmFwaFFMU3RyaW5nKSxcbiAgICBsZXNzVGhhbjogbGVzc1RoYW4oR3JhcGhRTFN0cmluZyksXG4gICAgbGVzc1RoYW5PckVxdWFsVG86IGxlc3NUaGFuT3JFcXVhbFRvKEdyYXBoUUxTdHJpbmcpLFxuICAgIGdyZWF0ZXJUaGFuOiBncmVhdGVyVGhhbihHcmFwaFFMU3RyaW5nKSxcbiAgICBncmVhdGVyVGhhbk9yRXF1YWxUbzogZ3JlYXRlclRoYW5PckVxdWFsVG8oR3JhcGhRTFN0cmluZyksXG4gICAgaW46IGluT3AoR3JhcGhRTFN0cmluZyksXG4gICAgbm90SW46IG5vdEluKEdyYXBoUUxTdHJpbmcpLFxuICAgIGV4aXN0cyxcbiAgICBtYXRjaGVzUmVnZXgsXG4gICAgb3B0aW9ucyxcbiAgICB0ZXh0OiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1RoaXMgaXMgdGhlICR0ZXh0IG9wZXJhdG9yIHRvIHNwZWNpZnkgYSBmdWxsIHRleHQgc2VhcmNoIGNvbnN0cmFpbnQuJyxcbiAgICAgIHR5cGU6IFRFWFRfSU5QVVQsXG4gICAgfSxcbiAgICBpblF1ZXJ5S2V5LFxuICAgIG5vdEluUXVlcnlLZXksXG4gIH0sXG59KTtcblxuY29uc3QgTlVNQkVSX1dIRVJFX0lOUFVUID0gbmV3IEdyYXBoUUxJbnB1dE9iamVjdFR5cGUoe1xuICBuYW1lOiAnTnVtYmVyV2hlcmVJbnB1dCcsXG4gIGRlc2NyaXB0aW9uOlxuICAgICdUaGUgTnVtYmVyV2hlcmVJbnB1dCBpbnB1dCB0eXBlIGlzIHVzZWQgaW4gb3BlcmF0aW9ucyB0aGF0IGludm9sdmUgZmlsdGVyaW5nIG9iamVjdHMgYnkgYSBmaWVsZCBvZiB0eXBlIE51bWJlci4nLFxuICBmaWVsZHM6IHtcbiAgICBlcXVhbFRvOiBlcXVhbFRvKEdyYXBoUUxGbG9hdCksXG4gICAgbm90RXF1YWxUbzogbm90RXF1YWxUbyhHcmFwaFFMRmxvYXQpLFxuICAgIGxlc3NUaGFuOiBsZXNzVGhhbihHcmFwaFFMRmxvYXQpLFxuICAgIGxlc3NUaGFuT3JFcXVhbFRvOiBsZXNzVGhhbk9yRXF1YWxUbyhHcmFwaFFMRmxvYXQpLFxuICAgIGdyZWF0ZXJUaGFuOiBncmVhdGVyVGhhbihHcmFwaFFMRmxvYXQpLFxuICAgIGdyZWF0ZXJUaGFuT3JFcXVhbFRvOiBncmVhdGVyVGhhbk9yRXF1YWxUbyhHcmFwaFFMRmxvYXQpLFxuICAgIGluOiBpbk9wKEdyYXBoUUxGbG9hdCksXG4gICAgbm90SW46IG5vdEluKEdyYXBoUUxGbG9hdCksXG4gICAgZXhpc3RzLFxuICAgIGluUXVlcnlLZXksXG4gICAgbm90SW5RdWVyeUtleSxcbiAgfSxcbn0pO1xuXG5jb25zdCBCT09MRUFOX1dIRVJFX0lOUFVUID0gbmV3IEdyYXBoUUxJbnB1dE9iamVjdFR5cGUoe1xuICBuYW1lOiAnQm9vbGVhbldoZXJlSW5wdXQnLFxuICBkZXNjcmlwdGlvbjpcbiAgICAnVGhlIEJvb2xlYW5XaGVyZUlucHV0IGlucHV0IHR5cGUgaXMgdXNlZCBpbiBvcGVyYXRpb25zIHRoYXQgaW52b2x2ZSBmaWx0ZXJpbmcgb2JqZWN0cyBieSBhIGZpZWxkIG9mIHR5cGUgQm9vbGVhbi4nLFxuICBmaWVsZHM6IHtcbiAgICBlcXVhbFRvOiBlcXVhbFRvKEdyYXBoUUxCb29sZWFuKSxcbiAgICBub3RFcXVhbFRvOiBub3RFcXVhbFRvKEdyYXBoUUxCb29sZWFuKSxcbiAgICBleGlzdHMsXG4gICAgaW5RdWVyeUtleSxcbiAgICBub3RJblF1ZXJ5S2V5LFxuICB9LFxufSk7XG5cbmNvbnN0IEFSUkFZX1dIRVJFX0lOUFVUID0gbmV3IEdyYXBoUUxJbnB1dE9iamVjdFR5cGUoe1xuICBuYW1lOiAnQXJyYXlXaGVyZUlucHV0JyxcbiAgZGVzY3JpcHRpb246XG4gICAgJ1RoZSBBcnJheVdoZXJlSW5wdXQgaW5wdXQgdHlwZSBpcyB1c2VkIGluIG9wZXJhdGlvbnMgdGhhdCBpbnZvbHZlIGZpbHRlcmluZyBvYmplY3RzIGJ5IGEgZmllbGQgb2YgdHlwZSBBcnJheS4nLFxuICBmaWVsZHM6IHtcbiAgICBlcXVhbFRvOiBlcXVhbFRvKEFOWSksXG4gICAgbm90RXF1YWxUbzogbm90RXF1YWxUbyhBTlkpLFxuICAgIGxlc3NUaGFuOiBsZXNzVGhhbihBTlkpLFxuICAgIGxlc3NUaGFuT3JFcXVhbFRvOiBsZXNzVGhhbk9yRXF1YWxUbyhBTlkpLFxuICAgIGdyZWF0ZXJUaGFuOiBncmVhdGVyVGhhbihBTlkpLFxuICAgIGdyZWF0ZXJUaGFuT3JFcXVhbFRvOiBncmVhdGVyVGhhbk9yRXF1YWxUbyhBTlkpLFxuICAgIGluOiBpbk9wKEFOWSksXG4gICAgbm90SW46IG5vdEluKEFOWSksXG4gICAgZXhpc3RzLFxuICAgIGNvbnRhaW5lZEJ5OiB7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ1RoaXMgaXMgdGhlIGNvbnRhaW5lZEJ5IG9wZXJhdG9yIHRvIHNwZWNpZnkgYSBjb25zdHJhaW50IHRvIHNlbGVjdCB0aGUgb2JqZWN0cyB3aGVyZSB0aGUgdmFsdWVzIG9mIGFuIGFycmF5IGZpZWxkIGlzIGNvbnRhaW5lZCBieSBhbm90aGVyIHNwZWNpZmllZCBhcnJheS4nLFxuICAgICAgdHlwZTogbmV3IEdyYXBoUUxMaXN0KEFOWSksXG4gICAgfSxcbiAgICBjb250YWluczoge1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdUaGlzIGlzIHRoZSBjb250YWlucyBvcGVyYXRvciB0byBzcGVjaWZ5IGEgY29uc3RyYWludCB0byBzZWxlY3QgdGhlIG9iamVjdHMgd2hlcmUgdGhlIHZhbHVlcyBvZiBhbiBhcnJheSBmaWVsZCBjb250YWluIGFsbCBlbGVtZW50cyBvZiBhbm90aGVyIHNwZWNpZmllZCBhcnJheS4nLFxuICAgICAgdHlwZTogbmV3IEdyYXBoUUxMaXN0KEFOWSksXG4gICAgfSxcbiAgICBpblF1ZXJ5S2V5LFxuICAgIG5vdEluUXVlcnlLZXksXG4gIH0sXG59KTtcblxuY29uc3QgS0VZX1ZBTFVFX0lOUFVUID0gbmV3IEdyYXBoUUxJbnB1dE9iamVjdFR5cGUoe1xuICBuYW1lOiAnS2V5VmFsdWVJbnB1dCcsXG4gIGRlc2NyaXB0aW9uOiAnQW4gZW50cnkgZnJvbSBhbiBvYmplY3QsIGkuZS4sIGEgcGFpciBvZiBrZXkgYW5kIHZhbHVlLicsXG4gIGZpZWxkczoge1xuICAgIGtleToge1xuICAgICAgZGVzY3JpcHRpb246ICdUaGUga2V5IHVzZWQgdG8gcmV0cmlldmUgdGhlIHZhbHVlIG9mIHRoaXMgZW50cnkuJyxcbiAgICAgIHR5cGU6IG5ldyBHcmFwaFFMTm9uTnVsbChHcmFwaFFMU3RyaW5nKSxcbiAgICB9LFxuICAgIHZhbHVlOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1RoZSB2YWx1ZSBvZiB0aGUgZW50cnkuIENvdWxkIGJlIGFueSB0eXBlIG9mIHNjYWxhciBkYXRhLicsXG4gICAgICB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoQU5ZKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmNvbnN0IE9CSkVDVF9XSEVSRV9JTlBVVCA9IG5ldyBHcmFwaFFMSW5wdXRPYmplY3RUeXBlKHtcbiAgbmFtZTogJ09iamVjdFdoZXJlSW5wdXQnLFxuICBkZXNjcmlwdGlvbjpcbiAgICAnVGhlIE9iamVjdFdoZXJlSW5wdXQgaW5wdXQgdHlwZSBpcyB1c2VkIGluIG9wZXJhdGlvbnMgdGhhdCBpbnZvbHZlIGZpbHRlcmluZyByZXN1bHQgYnkgYSBmaWVsZCBvZiB0eXBlIE9iamVjdC4nLFxuICBmaWVsZHM6IHtcbiAgICBlcXVhbFRvOiBlcXVhbFRvKEtFWV9WQUxVRV9JTlBVVCksXG4gICAgbm90RXF1YWxUbzogbm90RXF1YWxUbyhLRVlfVkFMVUVfSU5QVVQpLFxuICAgIGluOiBpbk9wKEtFWV9WQUxVRV9JTlBVVCksXG4gICAgbm90SW46IG5vdEluKEtFWV9WQUxVRV9JTlBVVCksXG4gICAgbGVzc1RoYW46IGxlc3NUaGFuKEtFWV9WQUxVRV9JTlBVVCksXG4gICAgbGVzc1RoYW5PckVxdWFsVG86IGxlc3NUaGFuT3JFcXVhbFRvKEtFWV9WQUxVRV9JTlBVVCksXG4gICAgZ3JlYXRlclRoYW46IGdyZWF0ZXJUaGFuKEtFWV9WQUxVRV9JTlBVVCksXG4gICAgZ3JlYXRlclRoYW5PckVxdWFsVG86IGdyZWF0ZXJUaGFuT3JFcXVhbFRvKEtFWV9WQUxVRV9JTlBVVCksXG4gICAgZXhpc3RzLFxuICAgIGluUXVlcnlLZXksXG4gICAgbm90SW5RdWVyeUtleSxcbiAgfSxcbn0pO1xuXG5jb25zdCBEQVRFX1dIRVJFX0lOUFVUID0gbmV3IEdyYXBoUUxJbnB1dE9iamVjdFR5cGUoe1xuICBuYW1lOiAnRGF0ZVdoZXJlSW5wdXQnLFxuICBkZXNjcmlwdGlvbjpcbiAgICAnVGhlIERhdGVXaGVyZUlucHV0IGlucHV0IHR5cGUgaXMgdXNlZCBpbiBvcGVyYXRpb25zIHRoYXQgaW52b2x2ZSBmaWx0ZXJpbmcgb2JqZWN0cyBieSBhIGZpZWxkIG9mIHR5cGUgRGF0ZS4nLFxuICBmaWVsZHM6IHtcbiAgICBlcXVhbFRvOiBlcXVhbFRvKERBVEUpLFxuICAgIG5vdEVxdWFsVG86IG5vdEVxdWFsVG8oREFURSksXG4gICAgbGVzc1RoYW46IGxlc3NUaGFuKERBVEUpLFxuICAgIGxlc3NUaGFuT3JFcXVhbFRvOiBsZXNzVGhhbk9yRXF1YWxUbyhEQVRFKSxcbiAgICBncmVhdGVyVGhhbjogZ3JlYXRlclRoYW4oREFURSksXG4gICAgZ3JlYXRlclRoYW5PckVxdWFsVG86IGdyZWF0ZXJUaGFuT3JFcXVhbFRvKERBVEUpLFxuICAgIGluOiBpbk9wKERBVEUpLFxuICAgIG5vdEluOiBub3RJbihEQVRFKSxcbiAgICBleGlzdHMsXG4gICAgaW5RdWVyeUtleSxcbiAgICBub3RJblF1ZXJ5S2V5LFxuICB9LFxufSk7XG5cbmNvbnN0IEJZVEVTX1dIRVJFX0lOUFVUID0gbmV3IEdyYXBoUUxJbnB1dE9iamVjdFR5cGUoe1xuICBuYW1lOiAnQnl0ZXNXaGVyZUlucHV0JyxcbiAgZGVzY3JpcHRpb246XG4gICAgJ1RoZSBCeXRlc1doZXJlSW5wdXQgaW5wdXQgdHlwZSBpcyB1c2VkIGluIG9wZXJhdGlvbnMgdGhhdCBpbnZvbHZlIGZpbHRlcmluZyBvYmplY3RzIGJ5IGEgZmllbGQgb2YgdHlwZSBCeXRlcy4nLFxuICBmaWVsZHM6IHtcbiAgICBlcXVhbFRvOiBlcXVhbFRvKEJZVEVTKSxcbiAgICBub3RFcXVhbFRvOiBub3RFcXVhbFRvKEJZVEVTKSxcbiAgICBsZXNzVGhhbjogbGVzc1RoYW4oQllURVMpLFxuICAgIGxlc3NUaGFuT3JFcXVhbFRvOiBsZXNzVGhhbk9yRXF1YWxUbyhCWVRFUyksXG4gICAgZ3JlYXRlclRoYW46IGdyZWF0ZXJUaGFuKEJZVEVTKSxcbiAgICBncmVhdGVyVGhhbk9yRXF1YWxUbzogZ3JlYXRlclRoYW5PckVxdWFsVG8oQllURVMpLFxuICAgIGluOiBpbk9wKEJZVEVTKSxcbiAgICBub3RJbjogbm90SW4oQllURVMpLFxuICAgIGV4aXN0cyxcbiAgICBpblF1ZXJ5S2V5LFxuICAgIG5vdEluUXVlcnlLZXksXG4gIH0sXG59KTtcblxuY29uc3QgRklMRV9XSEVSRV9JTlBVVCA9IG5ldyBHcmFwaFFMSW5wdXRPYmplY3RUeXBlKHtcbiAgbmFtZTogJ0ZpbGVXaGVyZUlucHV0JyxcbiAgZGVzY3JpcHRpb246XG4gICAgJ1RoZSBGaWxlV2hlcmVJbnB1dCBpbnB1dCB0eXBlIGlzIHVzZWQgaW4gb3BlcmF0aW9ucyB0aGF0IGludm9sdmUgZmlsdGVyaW5nIG9iamVjdHMgYnkgYSBmaWVsZCBvZiB0eXBlIEZpbGUuJyxcbiAgZmllbGRzOiB7XG4gICAgZXF1YWxUbzogZXF1YWxUbyhGSUxFKSxcbiAgICBub3RFcXVhbFRvOiBub3RFcXVhbFRvKEZJTEUpLFxuICAgIGxlc3NUaGFuOiBsZXNzVGhhbihGSUxFKSxcbiAgICBsZXNzVGhhbk9yRXF1YWxUbzogbGVzc1RoYW5PckVxdWFsVG8oRklMRSksXG4gICAgZ3JlYXRlclRoYW46IGdyZWF0ZXJUaGFuKEZJTEUpLFxuICAgIGdyZWF0ZXJUaGFuT3JFcXVhbFRvOiBncmVhdGVyVGhhbk9yRXF1YWxUbyhGSUxFKSxcbiAgICBpbjogaW5PcChGSUxFKSxcbiAgICBub3RJbjogbm90SW4oRklMRSksXG4gICAgZXhpc3RzLFxuICAgIG1hdGNoZXNSZWdleCxcbiAgICBvcHRpb25zLFxuICAgIGluUXVlcnlLZXksXG4gICAgbm90SW5RdWVyeUtleSxcbiAgfSxcbn0pO1xuXG5jb25zdCBHRU9fUE9JTlRfV0hFUkVfSU5QVVQgPSBuZXcgR3JhcGhRTElucHV0T2JqZWN0VHlwZSh7XG4gIG5hbWU6ICdHZW9Qb2ludFdoZXJlSW5wdXQnLFxuICBkZXNjcmlwdGlvbjpcbiAgICAnVGhlIEdlb1BvaW50V2hlcmVJbnB1dCBpbnB1dCB0eXBlIGlzIHVzZWQgaW4gb3BlcmF0aW9ucyB0aGF0IGludm9sdmUgZmlsdGVyaW5nIG9iamVjdHMgYnkgYSBmaWVsZCBvZiB0eXBlIEdlb1BvaW50LicsXG4gIGZpZWxkczoge1xuICAgIGV4aXN0cyxcbiAgICBuZWFyU3BoZXJlOiB7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ1RoaXMgaXMgdGhlIG5lYXJTcGhlcmUgb3BlcmF0b3IgdG8gc3BlY2lmeSBhIGNvbnN0cmFpbnQgdG8gc2VsZWN0IHRoZSBvYmplY3RzIHdoZXJlIHRoZSB2YWx1ZXMgb2YgYSBnZW8gcG9pbnQgZmllbGQgaXMgbmVhciB0byBhbm90aGVyIGdlbyBwb2ludC4nLFxuICAgICAgdHlwZTogR0VPX1BPSU5UX0lOUFVULFxuICAgIH0sXG4gICAgbWF4RGlzdGFuY2U6IHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnVGhpcyBpcyB0aGUgbWF4RGlzdGFuY2Ugb3BlcmF0b3IgdG8gc3BlY2lmeSBhIGNvbnN0cmFpbnQgdG8gc2VsZWN0IHRoZSBvYmplY3RzIHdoZXJlIHRoZSB2YWx1ZXMgb2YgYSBnZW8gcG9pbnQgZmllbGQgaXMgYXQgYSBtYXggZGlzdGFuY2UgKGluIHJhZGlhbnMpIGZyb20gdGhlIGdlbyBwb2ludCBzcGVjaWZpZWQgaW4gdGhlICRuZWFyU3BoZXJlIG9wZXJhdG9yLicsXG4gICAgICB0eXBlOiBHcmFwaFFMRmxvYXQsXG4gICAgfSxcbiAgICBtYXhEaXN0YW5jZUluUmFkaWFuczoge1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdUaGlzIGlzIHRoZSBtYXhEaXN0YW5jZUluUmFkaWFucyBvcGVyYXRvciB0byBzcGVjaWZ5IGEgY29uc3RyYWludCB0byBzZWxlY3QgdGhlIG9iamVjdHMgd2hlcmUgdGhlIHZhbHVlcyBvZiBhIGdlbyBwb2ludCBmaWVsZCBpcyBhdCBhIG1heCBkaXN0YW5jZSAoaW4gcmFkaWFucykgZnJvbSB0aGUgZ2VvIHBvaW50IHNwZWNpZmllZCBpbiB0aGUgJG5lYXJTcGhlcmUgb3BlcmF0b3IuJyxcbiAgICAgIHR5cGU6IEdyYXBoUUxGbG9hdCxcbiAgICB9LFxuICAgIG1heERpc3RhbmNlSW5NaWxlczoge1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdUaGlzIGlzIHRoZSBtYXhEaXN0YW5jZUluTWlsZXMgb3BlcmF0b3IgdG8gc3BlY2lmeSBhIGNvbnN0cmFpbnQgdG8gc2VsZWN0IHRoZSBvYmplY3RzIHdoZXJlIHRoZSB2YWx1ZXMgb2YgYSBnZW8gcG9pbnQgZmllbGQgaXMgYXQgYSBtYXggZGlzdGFuY2UgKGluIG1pbGVzKSBmcm9tIHRoZSBnZW8gcG9pbnQgc3BlY2lmaWVkIGluIHRoZSAkbmVhclNwaGVyZSBvcGVyYXRvci4nLFxuICAgICAgdHlwZTogR3JhcGhRTEZsb2F0LFxuICAgIH0sXG4gICAgbWF4RGlzdGFuY2VJbktpbG9tZXRlcnM6IHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnVGhpcyBpcyB0aGUgbWF4RGlzdGFuY2VJbktpbG9tZXRlcnMgb3BlcmF0b3IgdG8gc3BlY2lmeSBhIGNvbnN0cmFpbnQgdG8gc2VsZWN0IHRoZSBvYmplY3RzIHdoZXJlIHRoZSB2YWx1ZXMgb2YgYSBnZW8gcG9pbnQgZmllbGQgaXMgYXQgYSBtYXggZGlzdGFuY2UgKGluIGtpbG9tZXRlcnMpIGZyb20gdGhlIGdlbyBwb2ludCBzcGVjaWZpZWQgaW4gdGhlICRuZWFyU3BoZXJlIG9wZXJhdG9yLicsXG4gICAgICB0eXBlOiBHcmFwaFFMRmxvYXQsXG4gICAgfSxcbiAgICB3aXRoaW46IHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnVGhpcyBpcyB0aGUgd2l0aGluIG9wZXJhdG9yIHRvIHNwZWNpZnkgYSBjb25zdHJhaW50IHRvIHNlbGVjdCB0aGUgb2JqZWN0cyB3aGVyZSB0aGUgdmFsdWVzIG9mIGEgZ2VvIHBvaW50IGZpZWxkIGlzIHdpdGhpbiBhIHNwZWNpZmllZCBib3guJyxcbiAgICAgIHR5cGU6IFdJVEhJTl9JTlBVVCxcbiAgICB9LFxuICAgIGdlb1dpdGhpbjoge1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdUaGlzIGlzIHRoZSBnZW9XaXRoaW4gb3BlcmF0b3IgdG8gc3BlY2lmeSBhIGNvbnN0cmFpbnQgdG8gc2VsZWN0IHRoZSBvYmplY3RzIHdoZXJlIHRoZSB2YWx1ZXMgb2YgYSBnZW8gcG9pbnQgZmllbGQgaXMgd2l0aGluIGEgc3BlY2lmaWVkIHBvbHlnb24gb3Igc3BoZXJlLicsXG4gICAgICB0eXBlOiBHRU9fV0lUSElOX0lOUFVULFxuICAgIH0sXG4gIH0sXG59KTtcblxuY29uc3QgUE9MWUdPTl9XSEVSRV9JTlBVVCA9IG5ldyBHcmFwaFFMSW5wdXRPYmplY3RUeXBlKHtcbiAgbmFtZTogJ1BvbHlnb25XaGVyZUlucHV0JyxcbiAgZGVzY3JpcHRpb246XG4gICAgJ1RoZSBQb2x5Z29uV2hlcmVJbnB1dCBpbnB1dCB0eXBlIGlzIHVzZWQgaW4gb3BlcmF0aW9ucyB0aGF0IGludm9sdmUgZmlsdGVyaW5nIG9iamVjdHMgYnkgYSBmaWVsZCBvZiB0eXBlIFBvbHlnb24uJyxcbiAgZmllbGRzOiB7XG4gICAgZXhpc3RzLFxuICAgIGdlb0ludGVyc2VjdHM6IHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnVGhpcyBpcyB0aGUgZ2VvSW50ZXJzZWN0cyBvcGVyYXRvciB0byBzcGVjaWZ5IGEgY29uc3RyYWludCB0byBzZWxlY3QgdGhlIG9iamVjdHMgd2hlcmUgdGhlIHZhbHVlcyBvZiBhIHBvbHlnb24gZmllbGQgaW50ZXJzZWN0IGEgc3BlY2lmaWVkIHBvaW50LicsXG4gICAgICB0eXBlOiBHRU9fSU5URVJTRUNUU19JTlBVVCxcbiAgICB9LFxuICB9LFxufSk7XG5cbmNvbnN0IEVMRU1FTlQgPSBuZXcgR3JhcGhRTE9iamVjdFR5cGUoe1xuICBuYW1lOiAnRWxlbWVudCcsXG4gIGRlc2NyaXB0aW9uOiBcIlRoZSBFbGVtZW50IG9iamVjdCB0eXBlIGlzIHVzZWQgdG8gcmV0dXJuIGFycmF5IGl0ZW1zJyB2YWx1ZS5cIixcbiAgZmllbGRzOiB7XG4gICAgdmFsdWU6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudCBpbiB0aGUgYXJyYXknLFxuICAgICAgdHlwZTogbmV3IEdyYXBoUUxOb25OdWxsKEFOWSksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG4vLyBEZWZhdWx0IHN0YXRpYyB1bmlvbiB0eXBlLCB3ZSB1cGRhdGUgdHlwZXMgYW5kIHJlc29sdmVUeXBlIGZ1bmN0aW9uIGxhdGVyXG5sZXQgQVJSQVlfUkVTVUxUO1xuXG5jb25zdCBsb2FkQXJyYXlSZXN1bHQgPSAocGFyc2VHcmFwaFFMU2NoZW1hLCBwYXJzZUNsYXNzZXNBcnJheSkgPT4ge1xuICBjb25zdCBjbGFzc1R5cGVzID0gcGFyc2VDbGFzc2VzQXJyYXlcbiAgICAuZmlsdGVyKHBhcnNlQ2xhc3MgPT5cbiAgICAgIHBhcnNlR3JhcGhRTFNjaGVtYS5wYXJzZUNsYXNzVHlwZXNbcGFyc2VDbGFzcy5jbGFzc05hbWVdLmNsYXNzR3JhcGhRTE91dHB1dFR5cGUgPyB0cnVlIDogZmFsc2VcbiAgICApXG4gICAgLm1hcChcbiAgICAgIHBhcnNlQ2xhc3MgPT4gcGFyc2VHcmFwaFFMU2NoZW1hLnBhcnNlQ2xhc3NUeXBlc1twYXJzZUNsYXNzLmNsYXNzTmFtZV0uY2xhc3NHcmFwaFFMT3V0cHV0VHlwZVxuICAgICk7XG4gIEFSUkFZX1JFU1VMVCA9IG5ldyBHcmFwaFFMVW5pb25UeXBlKHtcbiAgICBuYW1lOiAnQXJyYXlSZXN1bHQnLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1VzZSBJbmxpbmUgRnJhZ21lbnQgb24gQXJyYXkgdG8gZ2V0IHJlc3VsdHM6IGh0dHBzOi8vZ3JhcGhxbC5vcmcvbGVhcm4vcXVlcmllcy8jaW5saW5lLWZyYWdtZW50cycsXG4gICAgdHlwZXM6ICgpID0+IFtFTEVNRU5ULCAuLi5jbGFzc1R5cGVzXSxcbiAgICByZXNvbHZlVHlwZTogdmFsdWUgPT4ge1xuICAgICAgaWYgKHZhbHVlLl9fdHlwZSA9PT0gJ09iamVjdCcgJiYgdmFsdWUuY2xhc3NOYW1lICYmIHZhbHVlLm9iamVjdElkKSB7XG4gICAgICAgIGlmIChwYXJzZUdyYXBoUUxTY2hlbWEucGFyc2VDbGFzc1R5cGVzW3ZhbHVlLmNsYXNzTmFtZV0pIHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VHcmFwaFFMU2NoZW1hLnBhcnNlQ2xhc3NUeXBlc1t2YWx1ZS5jbGFzc05hbWVdLmNsYXNzR3JhcGhRTE91dHB1dFR5cGUubmFtZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gRUxFTUVOVC5uYW1lO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gRUxFTUVOVC5uYW1lO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xuICBwYXJzZUdyYXBoUUxTY2hlbWEuZ3JhcGhRTFR5cGVzLnB1c2goQVJSQVlfUkVTVUxUKTtcbn07XG5cbmNvbnN0IGxvYWQgPSBwYXJzZUdyYXBoUUxTY2hlbWEgPT4ge1xuICBwYXJzZUdyYXBoUUxTY2hlbWEuYWRkR3JhcGhRTFR5cGUoR3JhcGhRTFVwbG9hZCwgdHJ1ZSk7XG4gIHBhcnNlR3JhcGhRTFNjaGVtYS5hZGRHcmFwaFFMVHlwZShBTlksIHRydWUpO1xuICBwYXJzZUdyYXBoUUxTY2hlbWEuYWRkR3JhcGhRTFR5cGUoT0JKRUNULCB0cnVlKTtcbiAgcGFyc2VHcmFwaFFMU2NoZW1hLmFkZEdyYXBoUUxUeXBlKERBVEUsIHRydWUpO1xuICBwYXJzZUdyYXBoUUxTY2hlbWEuYWRkR3JhcGhRTFR5cGUoQllURVMsIHRydWUpO1xuICBwYXJzZUdyYXBoUUxTY2hlbWEuYWRkR3JhcGhRTFR5cGUoRklMRSwgdHJ1ZSk7XG4gIHBhcnNlR3JhcGhRTFNjaGVtYS5hZGRHcmFwaFFMVHlwZShGSUxFX0lORk8sIHRydWUpO1xuICBwYXJzZUdyYXBoUUxTY2hlbWEuYWRkR3JhcGhRTFR5cGUoRklMRV9JTlBVVCwgdHJ1ZSk7XG4gIHBhcnNlR3JhcGhRTFNjaGVtYS5hZGRHcmFwaFFMVHlwZShHRU9fUE9JTlRfSU5QVVQsIHRydWUpO1xuICBwYXJzZUdyYXBoUUxTY2hlbWEuYWRkR3JhcGhRTFR5cGUoR0VPX1BPSU5ULCB0cnVlKTtcbiAgcGFyc2VHcmFwaFFMU2NoZW1hLmFkZEdyYXBoUUxUeXBlKFBBUlNFX09CSkVDVCwgdHJ1ZSk7XG4gIHBhcnNlR3JhcGhRTFNjaGVtYS5hZGRHcmFwaFFMVHlwZShSRUFEX1BSRUZFUkVOQ0UsIHRydWUpO1xuICBwYXJzZUdyYXBoUUxTY2hlbWEuYWRkR3JhcGhRTFR5cGUoUkVBRF9PUFRJT05TX0lOUFVULCB0cnVlKTtcbiAgcGFyc2VHcmFwaFFMU2NoZW1hLmFkZEdyYXBoUUxUeXBlKFNFQVJDSF9JTlBVVCwgdHJ1ZSk7XG4gIHBhcnNlR3JhcGhRTFNjaGVtYS5hZGRHcmFwaFFMVHlwZShURVhUX0lOUFVULCB0cnVlKTtcbiAgcGFyc2VHcmFwaFFMU2NoZW1hLmFkZEdyYXBoUUxUeXBlKEJPWF9JTlBVVCwgdHJ1ZSk7XG4gIHBhcnNlR3JhcGhRTFNjaGVtYS5hZGRHcmFwaFFMVHlwZShXSVRISU5fSU5QVVQsIHRydWUpO1xuICBwYXJzZUdyYXBoUUxTY2hlbWEuYWRkR3JhcGhRTFR5cGUoQ0VOVEVSX1NQSEVSRV9JTlBVVCwgdHJ1ZSk7XG4gIHBhcnNlR3JhcGhRTFNjaGVtYS5hZGRHcmFwaFFMVHlwZShHRU9fV0lUSElOX0lOUFVULCB0cnVlKTtcbiAgcGFyc2VHcmFwaFFMU2NoZW1hLmFkZEdyYXBoUUxUeXBlKEdFT19JTlRFUlNFQ1RTX0lOUFVULCB0cnVlKTtcbiAgcGFyc2VHcmFwaFFMU2NoZW1hLmFkZEdyYXBoUUxUeXBlKElEX1dIRVJFX0lOUFVULCB0cnVlKTtcbiAgcGFyc2VHcmFwaFFMU2NoZW1hLmFkZEdyYXBoUUxUeXBlKFNUUklOR19XSEVSRV9JTlBVVCwgdHJ1ZSk7XG4gIHBhcnNlR3JhcGhRTFNjaGVtYS5hZGRHcmFwaFFMVHlwZShOVU1CRVJfV0hFUkVfSU5QVVQsIHRydWUpO1xuICBwYXJzZUdyYXBoUUxTY2hlbWEuYWRkR3JhcGhRTFR5cGUoQk9PTEVBTl9XSEVSRV9JTlBVVCwgdHJ1ZSk7XG4gIHBhcnNlR3JhcGhRTFNjaGVtYS5hZGRHcmFwaFFMVHlwZShBUlJBWV9XSEVSRV9JTlBVVCwgdHJ1ZSk7XG4gIHBhcnNlR3JhcGhRTFNjaGVtYS5hZGRHcmFwaFFMVHlwZShLRVlfVkFMVUVfSU5QVVQsIHRydWUpO1xuICBwYXJzZUdyYXBoUUxTY2hlbWEuYWRkR3JhcGhRTFR5cGUoT0JKRUNUX1dIRVJFX0lOUFVULCB0cnVlKTtcbiAgcGFyc2VHcmFwaFFMU2NoZW1hLmFkZEdyYXBoUUxUeXBlKERBVEVfV0hFUkVfSU5QVVQsIHRydWUpO1xuICBwYXJzZUdyYXBoUUxTY2hlbWEuYWRkR3JhcGhRTFR5cGUoQllURVNfV0hFUkVfSU5QVVQsIHRydWUpO1xuICBwYXJzZUdyYXBoUUxTY2hlbWEuYWRkR3JhcGhRTFR5cGUoRklMRV9XSEVSRV9JTlBVVCwgdHJ1ZSk7XG4gIHBhcnNlR3JhcGhRTFNjaGVtYS5hZGRHcmFwaFFMVHlwZShHRU9fUE9JTlRfV0hFUkVfSU5QVVQsIHRydWUpO1xuICBwYXJzZUdyYXBoUUxTY2hlbWEuYWRkR3JhcGhRTFR5cGUoUE9MWUdPTl9XSEVSRV9JTlBVVCwgdHJ1ZSk7XG4gIHBhcnNlR3JhcGhRTFNjaGVtYS5hZGRHcmFwaFFMVHlwZShFTEVNRU5ULCB0cnVlKTtcbiAgcGFyc2VHcmFwaFFMU2NoZW1hLmFkZEdyYXBoUUxUeXBlKEFDTF9JTlBVVCwgdHJ1ZSk7XG4gIHBhcnNlR3JhcGhRTFNjaGVtYS5hZGRHcmFwaFFMVHlwZShVU0VSX0FDTF9JTlBVVCwgdHJ1ZSk7XG4gIHBhcnNlR3JhcGhRTFNjaGVtYS5hZGRHcmFwaFFMVHlwZShST0xFX0FDTF9JTlBVVCwgdHJ1ZSk7XG4gIHBhcnNlR3JhcGhRTFNjaGVtYS5hZGRHcmFwaFFMVHlwZShQVUJMSUNfQUNMX0lOUFVULCB0cnVlKTtcbiAgcGFyc2VHcmFwaFFMU2NoZW1hLmFkZEdyYXBoUUxUeXBlKEFDTCwgdHJ1ZSk7XG4gIHBhcnNlR3JhcGhRTFNjaGVtYS5hZGRHcmFwaFFMVHlwZShVU0VSX0FDTCwgdHJ1ZSk7XG4gIHBhcnNlR3JhcGhRTFNjaGVtYS5hZGRHcmFwaFFMVHlwZShST0xFX0FDTCwgdHJ1ZSk7XG4gIHBhcnNlR3JhcGhRTFNjaGVtYS5hZGRHcmFwaFFMVHlwZShQVUJMSUNfQUNMLCB0cnVlKTtcbiAgcGFyc2VHcmFwaFFMU2NoZW1hLmFkZEdyYXBoUUxUeXBlKFNVQlFVRVJZX0lOUFVULCB0cnVlKTtcbiAgcGFyc2VHcmFwaFFMU2NoZW1hLmFkZEdyYXBoUUxUeXBlKFNFTEVDVF9JTlBVVCwgdHJ1ZSk7XG59O1xuXG5leHBvcnQge1xuICBHcmFwaFFMVXBsb2FkLFxuICBUeXBlVmFsaWRhdGlvbkVycm9yLFxuICBwYXJzZVN0cmluZ1ZhbHVlLFxuICBwYXJzZUludFZhbHVlLFxuICBwYXJzZUZsb2F0VmFsdWUsXG4gIHBhcnNlQm9vbGVhblZhbHVlLFxuICBwYXJzZVZhbHVlLFxuICBwYXJzZUxpc3RWYWx1ZXMsXG4gIHBhcnNlT2JqZWN0RmllbGRzLFxuICBBTlksXG4gIE9CSkVDVCxcbiAgcGFyc2VEYXRlSXNvVmFsdWUsXG4gIHNlcmlhbGl6ZURhdGVJc28sXG4gIERBVEUsXG4gIEJZVEVTLFxuICBwYXJzZUZpbGVWYWx1ZSxcbiAgU1VCUVVFUllfSU5QVVQsXG4gIFNFTEVDVF9JTlBVVCxcbiAgRklMRSxcbiAgRklMRV9JTkZPLFxuICBGSUxFX0lOUFVULFxuICBHRU9fUE9JTlRfRklFTERTLFxuICBHRU9fUE9JTlRfSU5QVVQsXG4gIEdFT19QT0lOVCxcbiAgUE9MWUdPTl9JTlBVVCxcbiAgUE9MWUdPTixcbiAgT0JKRUNUX0lELFxuICBDTEFTU19OQU1FX0FUVCxcbiAgR0xPQkFMX09SX09CSkVDVF9JRF9BVFQsXG4gIE9CSkVDVF9JRF9BVFQsXG4gIFVQREFURURfQVRfQVRULFxuICBDUkVBVEVEX0FUX0FUVCxcbiAgSU5QVVRfRklFTERTLFxuICBDUkVBVEVfUkVTVUxUX0ZJRUxEUyxcbiAgVVBEQVRFX1JFU1VMVF9GSUVMRFMsXG4gIFBBUlNFX09CSkVDVF9GSUVMRFMsXG4gIFBBUlNFX09CSkVDVCxcbiAgU0VTU0lPTl9UT0tFTl9BVFQsXG4gIFJFQURfUFJFRkVSRU5DRSxcbiAgUkVBRF9QUkVGRVJFTkNFX0FUVCxcbiAgSU5DTFVERV9SRUFEX1BSRUZFUkVOQ0VfQVRULFxuICBTVUJRVUVSWV9SRUFEX1BSRUZFUkVOQ0VfQVRULFxuICBSRUFEX09QVElPTlNfSU5QVVQsXG4gIFJFQURfT1BUSU9OU19BVFQsXG4gIFdIRVJFX0FUVCxcbiAgU0tJUF9BVFQsXG4gIExJTUlUX0FUVCxcbiAgQ09VTlRfQVRULFxuICBTRUFSQ0hfSU5QVVQsXG4gIFRFWFRfSU5QVVQsXG4gIEJPWF9JTlBVVCxcbiAgV0lUSElOX0lOUFVULFxuICBDRU5URVJfU1BIRVJFX0lOUFVULFxuICBHRU9fV0lUSElOX0lOUFVULFxuICBHRU9fSU5URVJTRUNUU19JTlBVVCxcbiAgZXF1YWxUbyxcbiAgbm90RXF1YWxUbyxcbiAgbGVzc1RoYW4sXG4gIGxlc3NUaGFuT3JFcXVhbFRvLFxuICBncmVhdGVyVGhhbixcbiAgZ3JlYXRlclRoYW5PckVxdWFsVG8sXG4gIGluT3AsXG4gIG5vdEluLFxuICBleGlzdHMsXG4gIG1hdGNoZXNSZWdleCxcbiAgb3B0aW9ucyxcbiAgaW5RdWVyeUtleSxcbiAgbm90SW5RdWVyeUtleSxcbiAgSURfV0hFUkVfSU5QVVQsXG4gIFNUUklOR19XSEVSRV9JTlBVVCxcbiAgTlVNQkVSX1dIRVJFX0lOUFVULFxuICBCT09MRUFOX1dIRVJFX0lOUFVULFxuICBBUlJBWV9XSEVSRV9JTlBVVCxcbiAgS0VZX1ZBTFVFX0lOUFVULFxuICBPQkpFQ1RfV0hFUkVfSU5QVVQsXG4gIERBVEVfV0hFUkVfSU5QVVQsXG4gIEJZVEVTX1dIRVJFX0lOUFVULFxuICBGSUxFX1dIRVJFX0lOUFVULFxuICBHRU9fUE9JTlRfV0hFUkVfSU5QVVQsXG4gIFBPTFlHT05fV0hFUkVfSU5QVVQsXG4gIEFSUkFZX1JFU1VMVCxcbiAgRUxFTUVOVCxcbiAgQUNMX0lOUFVULFxuICBVU0VSX0FDTF9JTlBVVCxcbiAgUk9MRV9BQ0xfSU5QVVQsXG4gIFBVQkxJQ19BQ0xfSU5QVVQsXG4gIEFDTCxcbiAgVVNFUl9BQ0wsXG4gIFJPTEVfQUNMLFxuICBQVUJMSUNfQUNMLFxuICBsb2FkLFxuICBsb2FkQXJyYXlSZXN1bHQsXG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsUUFBQSxHQUFBQyxPQUFBO0FBZ0JBLElBQUFDLGFBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLGNBQUEsR0FBQUMsc0JBQUEsQ0FBQUgsT0FBQTtBQUNBLElBQUFJLE1BQUEsR0FBQUQsc0JBQUEsQ0FBQUgsT0FBQTtBQUFnQyxTQUFBRyx1QkFBQUUsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQUVoQyxNQUFNRyxtQkFBbUIsU0FBU0MsS0FBSyxDQUFDO0VBQ3RDQyxXQUFXQSxDQUFDQyxLQUFLLEVBQUVDLElBQUksRUFBRTtJQUN2QixLQUFLLENBQUMsR0FBR0QsS0FBSyxtQkFBbUJDLElBQUksRUFBRSxDQUFDO0VBQzFDO0FBQ0Y7QUFBQ0MsT0FBQSxDQUFBTCxtQkFBQSxHQUFBQSxtQkFBQTtBQUVELE1BQU1NLGdCQUFnQixHQUFHSCxLQUFLLElBQUk7RUFDaEMsSUFBSSxPQUFPQSxLQUFLLEtBQUssUUFBUSxFQUFFO0lBQzdCLE9BQU9BLEtBQUs7RUFDZDtFQUVBLE1BQU0sSUFBSUgsbUJBQW1CLENBQUNHLEtBQUssRUFBRSxRQUFRLENBQUM7QUFDaEQsQ0FBQztBQUFDRSxPQUFBLENBQUFDLGdCQUFBLEdBQUFBLGdCQUFBO0FBRUYsTUFBTUMsYUFBYSxHQUFHSixLQUFLLElBQUk7RUFDN0IsSUFBSSxPQUFPQSxLQUFLLEtBQUssUUFBUSxFQUFF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