angular-slickgrid 4.3.1 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +179 -181
  3. package/app/modules/angular-slickgrid/components/angular-slickgrid.component.d.ts +5 -9
  4. package/app/modules/angular-slickgrid/index.d.ts +1 -1
  5. package/app/modules/angular-slickgrid/services/index.d.ts +0 -1
  6. package/docs/assets/lib/multiple-select/README.md +17 -17
  7. package/esm2020/app/modules/angular-slickgrid/components/angular-slickgrid.component.mjs +14 -15
  8. package/esm2020/app/modules/angular-slickgrid/constants.mjs +2 -1
  9. package/esm2020/app/modules/angular-slickgrid/extensions/index.mjs +1 -1
  10. package/esm2020/app/modules/angular-slickgrid/extensions/slickRowDetailView.mjs +2 -2
  11. package/esm2020/app/modules/angular-slickgrid/global-grid-options.mjs +3 -3
  12. package/esm2020/app/modules/angular-slickgrid/index.mjs +2 -2
  13. package/esm2020/app/modules/angular-slickgrid/models/angularComponentOutput.interface.mjs +1 -1
  14. package/esm2020/app/modules/angular-slickgrid/models/angularGridInstance.interface.mjs +1 -1
  15. package/esm2020/app/modules/angular-slickgrid/models/externalTestingDependencies.interface.mjs +1 -1
  16. package/esm2020/app/modules/angular-slickgrid/models/gridOption.interface.mjs +1 -1
  17. package/esm2020/app/modules/angular-slickgrid/models/index.mjs +1 -1
  18. package/esm2020/app/modules/angular-slickgrid/models/rowDetailView.interface.mjs +1 -1
  19. package/esm2020/app/modules/angular-slickgrid/models/slickGrid.interface.mjs +1 -1
  20. package/esm2020/app/modules/angular-slickgrid/modules/angular-slickgrid.module.mjs +7 -12
  21. package/esm2020/app/modules/angular-slickgrid/services/angularUtil.service.mjs +4 -4
  22. package/esm2020/app/modules/angular-slickgrid/services/container.service.mjs +4 -4
  23. package/esm2020/app/modules/angular-slickgrid/services/index.mjs +1 -2
  24. package/esm2020/app/modules/angular-slickgrid/services/translater.service.mjs +4 -4
  25. package/esm2020/app/modules/angular-slickgrid/services/utilities.mjs +1 -1
  26. package/esm2020/app/modules/angular-slickgrid/slickgrid-config.mjs +1 -1
  27. package/esm2020/public_api.mjs +1 -1
  28. package/fesm2015/angular-slickgrid.mjs +34 -137
  29. package/fesm2015/angular-slickgrid.mjs.map +1 -1
  30. package/fesm2020/angular-slickgrid.mjs +33 -136
  31. package/fesm2020/angular-slickgrid.mjs.map +1 -1
  32. package/i18n/en.json +90 -89
  33. package/i18n/fr.json +91 -90
  34. package/{angular-slickgrid.d.ts → index.d.ts} +0 -0
  35. package/package.json +13 -15
  36. package/test/cypress/node_modules/@4tw/cypress-drag-drop/README.md +169 -0
  37. package/test/cypress/node_modules/@cypress/request/README.md +1038 -0
  38. package/test/cypress/node_modules/@cypress/xvfb/README.md +48 -0
  39. package/test/cypress/node_modules/@cypress/xvfb/node_modules/debug/README.md +437 -0
  40. package/test/cypress/node_modules/@types/node/README.md +16 -0
  41. package/test/cypress/node_modules/@types/sinonjs__fake-timers/README.md +16 -0
  42. package/test/cypress/node_modules/@types/sizzle/README.md +16 -0
  43. package/test/cypress/node_modules/@types/yauzl/README.md +16 -0
  44. package/test/cypress/node_modules/@types/yauzl/node_modules/@types/node/README.md +16 -0
  45. package/test/cypress/node_modules/aggregate-error/README.md +61 -0
  46. package/test/cypress/node_modules/ansi-colors/README.md +315 -0
  47. package/test/cypress/node_modules/ansi-escapes/README.md +245 -0
  48. package/test/cypress/node_modules/ansi-regex/README.md +78 -0
  49. package/test/cypress/node_modules/ansi-styles/README.md +152 -0
  50. package/test/cypress/node_modules/arch/README.md +71 -0
  51. package/test/cypress/node_modules/asn1/README.md +50 -0
  52. package/test/cypress/node_modules/assert-plus/README.md +162 -0
  53. package/test/cypress/node_modules/astral-regex/README.md +46 -0
  54. package/test/cypress/node_modules/async/README.md +60 -0
  55. package/test/cypress/node_modules/asynckit/README.md +233 -0
  56. package/test/cypress/node_modules/at-least-node/README.md +25 -0
  57. package/test/cypress/node_modules/aws-sign2/README.md +4 -0
  58. package/test/cypress/node_modules/aws4/README.md +183 -0
  59. package/test/cypress/node_modules/balanced-match/README.md +91 -0
  60. package/test/cypress/node_modules/base64-js/README.md +34 -0
  61. package/test/cypress/node_modules/bcrypt-pbkdf/README.md +45 -0
  62. package/test/cypress/node_modules/blob-util/README.md +623 -0
  63. package/test/cypress/node_modules/bluebird/README.md +57 -0
  64. package/test/cypress/node_modules/brace-expansion/README.md +129 -0
  65. package/test/cypress/node_modules/buffer/README.md +410 -0
  66. package/test/cypress/node_modules/buffer-crc32/README.md +47 -0
  67. package/test/cypress/node_modules/cachedir/README.md +27 -0
  68. package/test/cypress/node_modules/caseless/README.md +45 -0
  69. package/test/cypress/node_modules/chalk/README.md +293 -0
  70. package/test/cypress/node_modules/chalk/node_modules/supports-color/README.md +76 -0
  71. package/test/cypress/node_modules/check-more-types/README.md +952 -0
  72. package/test/cypress/node_modules/ci-info/README.md +114 -0
  73. package/test/cypress/node_modules/clean-stack/README.md +76 -0
  74. package/test/cypress/node_modules/cli-cursor/README.md +55 -0
  75. package/test/cypress/node_modules/cli-table3/README.md +218 -0
  76. package/test/cypress/node_modules/cli-truncate/README.md +139 -0
  77. package/test/cypress/node_modules/color-convert/README.md +68 -0
  78. package/test/cypress/node_modules/color-name/README.md +11 -0
  79. package/test/cypress/node_modules/colorette/README.md +102 -0
  80. package/test/cypress/node_modules/colors/README.md +221 -0
  81. package/test/cypress/node_modules/combined-stream/README.md +138 -0
  82. package/test/cypress/node_modules/commander/README.md +737 -0
  83. package/test/cypress/node_modules/common-tags/README.md +687 -0
  84. package/test/cypress/node_modules/core-util-is/README.md +3 -0
  85. package/test/cypress/node_modules/cross-spawn/README.md +96 -0
  86. package/test/cypress/node_modules/cypress/README.md +25 -0
  87. package/test/cypress/node_modules/cypress/angular/README.md +85 -0
  88. package/test/cypress/node_modules/cypress/mount-utils/README.md +21 -0
  89. package/test/cypress/node_modules/cypress/react/README.md +119 -0
  90. package/test/cypress/node_modules/cypress/svelte/README.md +83 -0
  91. package/test/cypress/node_modules/cypress/vue/README.md +88 -0
  92. package/test/cypress/node_modules/cypress/vue2/README.md +77 -0
  93. package/test/cypress/node_modules/dashdash/README.md +574 -0
  94. package/test/cypress/node_modules/dayjs/README.md +128 -0
  95. package/test/cypress/node_modules/debug/README.md +455 -0
  96. package/test/cypress/node_modules/delayed-stream/README.md +141 -0
  97. package/test/cypress/node_modules/ecc-jsbn/README.md +8 -0
  98. package/test/cypress/node_modules/emoji-regex/README.md +73 -0
  99. package/test/cypress/node_modules/end-of-stream/README.md +54 -0
  100. package/test/cypress/node_modules/enquirer/README.md +1752 -0
  101. package/test/cypress/node_modules/escape-string-regexp/README.md +27 -0
  102. package/test/cypress/node_modules/eventemitter2/README.md +809 -0
  103. package/test/cypress/node_modules/execa/README.md +656 -0
  104. package/test/cypress/node_modules/executable/README.md +64 -0
  105. package/test/cypress/node_modules/extend/README.md +81 -0
  106. package/test/cypress/node_modules/extract-zip/README.md +57 -0
  107. package/test/cypress/node_modules/extract-zip/node_modules/debug/README.md +455 -0
  108. package/test/cypress/node_modules/extsprintf/README.md +46 -0
  109. package/test/cypress/node_modules/fd-slicer/README.md +199 -0
  110. package/test/cypress/node_modules/figures/README.md +139 -0
  111. package/test/cypress/node_modules/forever-agent/README.md +4 -0
  112. package/test/cypress/node_modules/form-data/README.md +234 -0
  113. package/test/cypress/node_modules/fs-extra/README.md +264 -0
  114. package/test/cypress/node_modules/fs.realpath/README.md +33 -0
  115. package/test/cypress/node_modules/get-stream/README.md +124 -0
  116. package/test/cypress/node_modules/getos/README.md +79 -0
  117. package/test/cypress/node_modules/getpass/README.md +32 -0
  118. package/test/cypress/node_modules/glob/README.md +375 -0
  119. package/test/cypress/node_modules/global-dirs/README.md +72 -0
  120. package/test/cypress/node_modules/graceful-fs/README.md +133 -0
  121. package/test/cypress/node_modules/has-flag/README.md +89 -0
  122. package/test/cypress/node_modules/http-signature/README.md +80 -0
  123. package/test/cypress/node_modules/human-signals/README.md +155 -0
  124. package/test/cypress/node_modules/ieee754/README.md +51 -0
  125. package/test/cypress/node_modules/indent-string/README.md +70 -0
  126. package/test/cypress/node_modules/inflight/README.md +37 -0
  127. package/test/cypress/node_modules/inherits/README.md +42 -0
  128. package/test/cypress/node_modules/ini/README.md +102 -0
  129. package/test/cypress/node_modules/is-ci/README.md +50 -0
  130. package/test/cypress/node_modules/is-fullwidth-code-point/README.md +39 -0
  131. package/test/cypress/node_modules/is-installed-globally/README.md +31 -0
  132. package/test/cypress/node_modules/is-path-inside/README.md +63 -0
  133. package/test/cypress/node_modules/is-stream/README.md +57 -0
  134. package/test/cypress/node_modules/is-typedarray/README.md +16 -0
  135. package/test/cypress/node_modules/isexe/README.md +51 -0
  136. package/test/cypress/node_modules/isstream/README.md +66 -0
  137. package/test/cypress/node_modules/jsbn/README.md +175 -0
  138. package/test/cypress/node_modules/json-schema/README.md +3 -0
  139. package/test/cypress/node_modules/json-stringify-safe/README.md +52 -0
  140. package/test/cypress/node_modules/jsonfile/README.md +205 -0
  141. package/test/cypress/node_modules/jsonfile/node_modules/universalify/README.md +76 -0
  142. package/test/cypress/node_modules/jsprim/README.md +287 -0
  143. package/test/cypress/node_modules/lazy-ass/README.md +269 -0
  144. package/test/cypress/node_modules/listr2/README.md +17 -0
  145. package/test/cypress/node_modules/lodash/README.md +39 -0
  146. package/test/cypress/node_modules/lodash.once/README.md +18 -0
  147. package/test/cypress/node_modules/log-symbols/README.md +51 -0
  148. package/test/cypress/node_modules/log-update/README.md +97 -0
  149. package/test/cypress/node_modules/log-update/node_modules/slice-ansi/README.md +66 -0
  150. package/test/cypress/node_modules/log-update/node_modules/wrap-ansi/README.md +97 -0
  151. package/test/cypress/node_modules/lru-cache/README.md +166 -0
  152. package/test/cypress/node_modules/merge-stream/README.md +78 -0
  153. package/test/cypress/node_modules/mime-db/README.md +102 -0
  154. package/test/cypress/node_modules/mime-types/README.md +123 -0
  155. package/test/cypress/node_modules/mimic-fn/README.md +69 -0
  156. package/test/cypress/node_modules/minimatch/README.md +209 -0
  157. package/test/cypress/node_modules/ms/README.md +60 -0
  158. package/test/cypress/node_modules/npm-run-path/README.md +115 -0
  159. package/test/cypress/node_modules/once/README.md +79 -0
  160. package/test/cypress/node_modules/onetime/README.md +94 -0
  161. package/test/cypress/node_modules/ospath/README.md +53 -0
  162. package/test/cypress/node_modules/p-map/README.md +89 -0
  163. package/test/cypress/node_modules/path-is-absolute/README.md +59 -0
  164. package/test/cypress/node_modules/path-key/README.md +61 -0
  165. package/test/cypress/node_modules/pend/README.md +41 -0
  166. package/test/cypress/node_modules/performance-now/README.md +30 -0
  167. package/test/cypress/node_modules/pify/README.md +119 -0
  168. package/test/cypress/node_modules/pretty-bytes/README.md +131 -0
  169. package/test/cypress/node_modules/proxy-from-env/README.md +131 -0
  170. package/test/cypress/node_modules/psl/README.md +215 -0
  171. package/test/cypress/node_modules/pump/README.md +65 -0
  172. package/test/cypress/node_modules/punycode/README.md +122 -0
  173. package/test/cypress/node_modules/qs/README.md +475 -0
  174. package/test/cypress/node_modules/request-progress/README.md +78 -0
  175. package/test/cypress/node_modules/restore-cursor/README.md +26 -0
  176. package/test/cypress/node_modules/rimraf/README.md +101 -0
  177. package/test/cypress/node_modules/rxjs/README.md +147 -0
  178. package/test/cypress/node_modules/rxjs/_esm2015/README.md +147 -0
  179. package/test/cypress/node_modules/rxjs/_esm5/README.md +147 -0
  180. package/test/cypress/node_modules/rxjs/src/README.md +147 -0
  181. package/test/cypress/node_modules/safe-buffer/README.md +584 -0
  182. package/test/cypress/node_modules/safer-buffer/README.md +156 -0
  183. package/test/cypress/node_modules/semver/README.md +566 -0
  184. package/test/cypress/node_modules/shebang-command/README.md +34 -0
  185. package/test/cypress/node_modules/shebang-regex/README.md +33 -0
  186. package/test/cypress/node_modules/signal-exit/README.md +39 -0
  187. package/test/cypress/node_modules/slice-ansi/README.md +72 -0
  188. package/test/cypress/node_modules/sshpk/README.md +804 -0
  189. package/test/cypress/node_modules/string-width/README.md +50 -0
  190. package/test/cypress/node_modules/strip-ansi/README.md +46 -0
  191. package/test/cypress/node_modules/strip-final-newline/README.md +30 -0
  192. package/test/cypress/node_modules/supports-color/README.md +77 -0
  193. package/test/cypress/node_modules/throttleit/README.md +32 -0
  194. package/test/cypress/node_modules/tmp/README.md +365 -0
  195. package/test/cypress/node_modules/tough-cookie/README.md +527 -0
  196. package/test/cypress/node_modules/tslib/README.md +142 -0
  197. package/test/cypress/node_modules/tunnel-agent/README.md +4 -0
  198. package/test/cypress/node_modules/tweetnacl/README.md +459 -0
  199. package/test/cypress/node_modules/type-fest/README.md +760 -0
  200. package/test/cypress/node_modules/universalify/README.md +76 -0
  201. package/test/cypress/node_modules/untildify/README.md +30 -0
  202. package/test/cypress/node_modules/uuid/README.md +505 -0
  203. package/test/cypress/node_modules/verror/README.md +528 -0
  204. package/test/cypress/node_modules/verror/node_modules/extsprintf/README.md +46 -0
  205. package/test/cypress/node_modules/which/README.md +54 -0
  206. package/test/cypress/node_modules/wrap-ansi/README.md +91 -0
  207. package/test/cypress/node_modules/wrappy/README.md +36 -0
  208. package/test/cypress/node_modules/yallist/README.md +204 -0
  209. package/test/cypress/node_modules/yauzl/README.md +658 -0
  210. package/app/modules/angular-slickgrid/services/bsDropdown.service.d.ts +0 -31
  211. package/esm2020/app/modules/angular-slickgrid/services/bsDropdown.service.mjs +0 -103
@@ -1,103 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "./angularUtil.service";
4
- // Boostrap dropdown service
5
- export class BsDropDownService {
6
- constructor(angularUtilService) {
7
- this.angularUtilService = angularUtilService;
8
- }
9
- get domElement() {
10
- return this._domElement;
11
- }
12
- get domContainerElement() {
13
- return this._domContainerElement;
14
- }
15
- get gridViewport() {
16
- return $('.slick-viewport');
17
- }
18
- dispose() {
19
- if (this._domElement && this._domElement.remove) {
20
- this._domElement.remove();
21
- }
22
- }
23
- dropContainerShow() {
24
- if (this._domContainerElement && this._domContainerElement.show) {
25
- this._domContainerElement.show();
26
- }
27
- }
28
- render(dropdownParams) {
29
- return new Promise((resolve) => {
30
- const { component, args, parent, offsetTop, offsetLeft, offsetDropupBottom } = dropdownParams;
31
- const cell = args.cell;
32
- const row = args.row;
33
- this._domContainerElement = $(`#myDrop-r${row}-c${cell}`);
34
- if (this._domContainerElement) {
35
- // hide the dropdown we created as a formatter Component, we'll redisplay it later
36
- const cellPos = this._domContainerElement.offset();
37
- const componentOutput = this.angularUtilService.createAngularComponent(component);
38
- const componentInstance = componentOutput && componentOutput.componentRef && componentOutput.componentRef.instance;
39
- if (componentInstance) {
40
- const myDropId = componentInstance.dropdownId || 'myDrop';
41
- const dropDownToggleId = componentInstance.dropDownToggleId || 'dropdownMenu1';
42
- this._domElement = $(`#${myDropId}`);
43
- if (this._domElement) {
44
- // make sure to remove any previous Action dropdown elements, to avoid having multiple element of the same on top of each other
45
- this.dispose();
46
- // assign the row data to the dropdown component instance
47
- Object.assign(componentInstance, { parent, row: args.row, dataContext: args.grid.getDataItem(args.row) });
48
- // use a delay to make sure Angular ran at least a full cycle and make sure it finished rendering the Component before using it
49
- setTimeout(() => {
50
- // create a new dropdown element
51
- this._domElement = $(componentOutput.domElement);
52
- const topPos = (cellPos && cellPos.top || 0) + 30 + (offsetTop || 0);
53
- const leftPos = (cellPos && cellPos.left || 0) + (offsetLeft || 0);
54
- this._domElement.appendTo('body');
55
- this._domElement.css('position', 'absolute');
56
- this._domElement.css('top', topPos);
57
- this._domElement.css('left', leftPos);
58
- $(`#${myDropId}`).addClass('open');
59
- $(`#${dropDownToggleId}`).hide();
60
- // check if it should drop Up or Down
61
- const offset = 35;
62
- const iElement = $('.dropdown-menu');
63
- const iElementWrapper = iElement.parent();
64
- const iElementWrapperOffset = iElementWrapper.offset() || {};
65
- const iElementWrapperOffsetTop = iElementWrapperOffset.top || iElementWrapper && iElementWrapper.length > 0 && iElementWrapper[0].offsetTop;
66
- const iElementHeight = iElement.height();
67
- const windowHeight = window.innerHeight;
68
- const shouldDropUp = (windowHeight - iElementHeight - offset) < iElementWrapperOffsetTop;
69
- let menuMarginTop = '0px';
70
- if (shouldDropUp) {
71
- const offsetBottom = offsetDropupBottom || 0;
72
- menuMarginTop = '-'.concat(`${iElementHeight + offset + offsetBottom + 5}`, 'px');
73
- }
74
- this._domElement.css({ 'margin-top': menuMarginTop });
75
- // set dropdown margin left according to the document width
76
- const parentOffset = iElementWrapperOffset.left;
77
- const leftMargin = parentOffset - $(document).width();
78
- this._domElement.css({ 'margin-left': (this._domElement.width() + leftMargin + 60) + 'px' });
79
- try {
80
- this._domElement.dropdown('show'); // required for Bootstrap 4 only
81
- }
82
- catch (e) {
83
- // Bootstrap 3 wil throw an error since that method doesn't exist, we can safely disregard it
84
- }
85
- this._domElement.on('hidden.bs.dropdown', () => this.dropContainerShow());
86
- // hide dropdown menu on grid scroll
87
- this.gridViewport.on('scroll', () => this.dispose());
88
- // hide on dropdown click
89
- this._domElement.on('click', () => this.dispose());
90
- resolve(true);
91
- });
92
- }
93
- }
94
- }
95
- });
96
- }
97
- }
98
- BsDropDownService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: BsDropDownService, deps: [{ token: i1.AngularUtilService }], target: i0.ɵɵFactoryTarget.Injectable });
99
- BsDropDownService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: BsDropDownService });
100
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: BsDropDownService, decorators: [{
101
- type: Injectable
102
- }], ctorParameters: function () { return [{ type: i1.AngularUtilService }]; } });
103
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnNEcm9wZG93bi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2FuZ3VsYXItc2xpY2tncmlkL3NlcnZpY2VzL2JzRHJvcGRvd24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUEwQjNDLDRCQUE0QjtBQUU1QixNQUFNLE9BQU8saUJBQWlCO0lBSTVCLFlBQW9CLGtCQUFzQztRQUF0Qyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO0lBQUksQ0FBQztJQUUvRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksbUJBQW1CO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDO0lBQ25DLENBQUM7SUFFRCxJQUFJLFlBQVk7UUFDZCxPQUFPLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFO1lBQy9DLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDM0I7SUFDSCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsSUFBSSxJQUFJLENBQUMsb0JBQW9CLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRTtZQUMvRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDbEM7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLGNBQXFDO1FBQzFDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUM3QixNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxrQkFB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QUFPLENBQUMsRUFBRTtnQ0FDViw2RkFBNkY7NkJBQzlGOzRCQUVELElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7NEJBRTFFLG9DQUFvQzs0QkFDcEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDOzRCQUVyRCx5QkFBeUI7NEJBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQzs0QkFDbkQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUNoQixDQUFDLENBQUMsQ0FBQztxQkFDSjtpQkFDRjthQUNGO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOzsrR0EvR1UsaUJBQWlCO21IQUFqQixpQkFBaUI7NEZBQWpCLGlCQUFpQjtrQkFEN0IsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbIlxyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFuZ3VsYXJVdGlsU2VydmljZSB9IGZyb20gJy4vYW5ndWxhclV0aWwuc2VydmljZSc7XHJcblxyXG5pbnRlcmZhY2UgRHJvcERvd25TZXJ2aWNlUGFyYW1zIHtcclxuICAvKiogdGhlIGN1c3RvbSBhY3Rpb24gZm9ybWF0dGVyIGNvbXBvbmVudCB0aGF0IGNvbnRhaW5zIHRoZSBkcm9wZG93biAqL1xyXG4gIGNvbXBvbmVudDogYW55O1xyXG5cclxuICAvKiogaGVscCB0byBnZXQgdGhlIGRhdGEgY29udGV4dCAqL1xyXG4gIGFyZ3M6IGFueTtcclxuXHJcbiAgLyoqIHBhcmVudCBjb250YWluZXIgKi9cclxuICBwYXJlbnQ6IGFueTtcclxuXHJcbiAgLyoqIE9mZnNldCBib3R0b20gd2hlbiB1c2luZyBhIERyb3AgVXAsIGlmIHdlIG5lZWQgdG8gcmVwb3NpdGlvbiB0aGUgZHJvcGRvd24gY29tcG9uZW50ICovXHJcbiAgb2Zmc2V0RHJvcHVwQm90dG9tPzogbnVtYmVyO1xyXG5cclxuICAvKiogT2Zmc2V0IGxlZnQgaWYgd2UgbmVlZCB0byByZXBvc2l0aW9uIHRoZSBkcm9wZG93biBjb21wb25lbnQgKi9cclxuICBvZmZzZXRMZWZ0PzogbnVtYmVyO1xyXG5cclxuICAvKiogT2Zmc2V0IHRvcCBpZiB3ZSBuZWVkIHRvIHJlcG9zaXRpb24gdGhlIGRyb3Bkb3duIGNvbXBvbmVudCAqL1xyXG4gIG9mZnNldFRvcD86IG51bWJlcjtcclxufVxyXG5cclxuLy8gdXNpbmcgZXh0ZXJuYWwgbm9uLXR5cGVkIGpzIGxpYnJhcmllc1xyXG5kZWNsYXJlIGNvbnN0ICQ6IGFueTtcclxuXHJcbi8vIEJvb3N0cmFwIGRyb3Bkb3duIHNlcnZpY2VcclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQnNEcm9wRG93blNlcnZpY2Uge1xyXG4gIHByaXZhdGUgX2RvbUNvbnRhaW5lckVsZW1lbnQ6IGFueTtcclxuICBwcml2YXRlIF9kb21FbGVtZW50OiBhbnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYW5ndWxhclV0aWxTZXJ2aWNlOiBBbmd1bGFyVXRpbFNlcnZpY2UpIHsgfVxyXG5cclxuICBnZXQgZG9tRWxlbWVudCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9kb21FbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRvbUNvbnRhaW5lckVsZW1lbnQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZG9tQ29udGFpbmVyRWxlbWVudDtcclxuICB9XHJcblxyXG4gIGdldCBncmlkVmlld3BvcnQoKSB7XHJcbiAgICByZXR1cm4gJCgnLnNsaWNrLXZpZXdwb3J0Jyk7XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG4gICAgaWYgKHRoaXMuX2RvbUVsZW1lbnQgJiYgdGhpcy5fZG9tRWxlbWVudC5yZW1vdmUpIHtcclxuICAgICAgdGhpcy5fZG9tRWxlbWVudC5yZW1vdmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRyb3BDb250YWluZXJTaG93KCkge1xyXG4gICAgaWYgKHRoaXMuX2RvbUNvbnRhaW5lckVsZW1lbnQgJiYgdGhpcy5fZG9tQ29udGFpbmVyRWxlbWVudC5zaG93KSB7XHJcbiAgICAgIHRoaXMuX2RvbUNvbnRhaW5lckVsZW1lbnQuc2hvdygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVuZGVyKGRyb3Bkb3duUGFyYW1zOiBEcm9wRG93blNlcnZpY2VQYXJhbXMpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICBjb25zdCB7IGNvbXBvbmVudCwgYXJncywgcGFyZW50LCBvZmZzZXRUb3AsIG9mZnNldExlZnQsIG9mZnNldERyb3B1cEJvdHRvbSB9ID0gZHJvcGRvd25QYXJhbXM7XHJcblxyXG4gICAgICBjb25zdCBjZWxsID0gYXJncy5jZWxsO1xyXG4gICAgICBjb25zdCByb3cgPSBhcmdzLnJvdztcclxuXHJcbiAgICAgIHRoaXMuX2RvbUNvbnRhaW5lckVsZW1lbnQgPSAkKGAjbXlEcm9wLXIke3Jvd30tYyR7Y2VsbH1gKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9kb21Db250YWluZXJFbGVtZW50KSB7XHJcbiAgICAgICAgLy8gaGlkZSB0aGUgZHJvcGRvd24gd2UgY3JlYXRlZCBhcyBhIGZvcm1hdHRlciBDb21wb25lbnQsIHdlJ2xsIHJlZGlzcGxheSBpdCBsYXRlclxyXG4gICAgICAgIGNvbnN0IGNlbGxQb3MgPSB0aGlzLl9kb21Db250YWluZXJFbGVtZW50Lm9mZnNldCgpO1xyXG5cclxuICAgICAgICBjb25zdCBjb21wb25lbnRPdXRwdXQgPSB0aGlzLmFuZ3VsYXJVdGlsU2VydmljZS5jcmVhdGVBbmd1bGFyQ29tcG9uZW50KGNvbXBvbmVudCk7XHJcbiAgICAgICAgY29uc3QgY29tcG9uZW50SW5zdGFuY2UgPSBjb21wb25lbnRPdXRwdXQgJiYgY29tcG9uZW50T3V0cHV0LmNvbXBvbmVudFJlZiAmJiBjb21wb25lbnRPdXRwdXQuY29tcG9uZW50UmVmLmluc3RhbmNlO1xyXG5cclxuICAgICAgICBpZiAoY29tcG9uZW50SW5zdGFuY2UpIHtcclxuICAgICAgICAgIGNvbnN0IG15RHJvcElkID0gY29tcG9uZW50SW5zdGFuY2UuZHJvcGRvd25JZCB8fCAnbXlEcm9wJztcclxuICAgICAgICAgIGNvbnN0IGRyb3BEb3duVG9nZ2xlSWQgPSBjb21wb25lbnRJbnN0YW5jZS5kcm9wRG93blRvZ2dsZUlkIHx8ICdkcm9wZG93bk1lbnUxJztcclxuICAgICAgICAgIHRoaXMuX2RvbUVsZW1lbnQgPSAkKGAjJHtteURyb3BJZH1gKTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5fZG9tRWxlbWVudCkge1xyXG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgdG8gcmVtb3ZlIGFueSBwcmV2aW91cyBBY3Rpb24gZHJvcGRvd24gZWxlbWVudHMsIHRvIGF2b2lkIGhhdmluZyBtdWx0aXBsZSBlbGVtZW50IG9mIHRoZSBzYW1lIG9uIHRvcCBvZiBlYWNoIG90aGVyXHJcbiAgICAgICAgICAgIHRoaXMuZGlzcG9zZSgpO1xyXG5cclxuICAgICAgICAgICAgLy8gYXNzaWduIHRoZSByb3cgZGF0YSB0byB0aGUgZHJvcGRvd24gY29tcG9uZW50IGluc3RhbmNlXHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29tcG9uZW50SW5zdGFuY2UsIHsgcGFyZW50LCByb3c6IGFyZ3Mucm93LCBkYXRhQ29udGV4dDogYXJncy5ncmlkLmdldERhdGFJdGVtKGFyZ3Mucm93KSB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIHVzZSBhIGRlbGF5IHRvIG1ha2Ugc3VyZSBBbmd1bGFyIHJhbiBhdCBsZWFzdCBhIGZ1bGwgY3ljbGUgYW5kIG1ha2Ugc3VyZSBpdCBmaW5pc2hlZCByZW5kZXJpbmcgdGhlIENvbXBvbmVudCBiZWZvcmUgdXNpbmcgaXRcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IGRyb3Bkb3duIGVsZW1lbnRcclxuICAgICAgICAgICAgICB0aGlzLl9kb21FbGVtZW50ID0gJChjb21wb25lbnRPdXRwdXQuZG9tRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgY29uc3QgdG9wUG9zID0gKGNlbGxQb3MgJiYgY2VsbFBvcy50b3AgfHwgMCkgKyAzMCArIChvZmZzZXRUb3AgfHwgMCk7XHJcbiAgICAgICAgICAgICAgY29uc3QgbGVmdFBvcyA9IChjZWxsUG9zICYmIGNlbGxQb3MubGVmdCB8fCAwKSArIChvZmZzZXRMZWZ0IHx8IDApO1xyXG4gICAgICAgICAgICAgIHRoaXMuX2RvbUVsZW1lbnQuYXBwZW5kVG8oJ2JvZHknKTtcclxuICAgICAgICAgICAgICB0aGlzLl9kb21FbGVtZW50LmNzcygncG9zaXRpb24nLCAnYWJzb2x1dGUnKTtcclxuICAgICAgICAgICAgICB0aGlzLl9kb21FbGVtZW50LmNzcygndG9wJywgdG9wUG9zKTtcclxuICAgICAgICAgICAgICB0aGlzLl9kb21FbGVtZW50LmNzcygnbGVmdCcsIGxlZnRQb3MpO1xyXG4gICAgICAgICAgICAgICQoYCMke215RHJvcElkfWApLmFkZENsYXNzKCdvcGVuJyk7XHJcbiAgICAgICAgICAgICAgJChgIyR7ZHJvcERvd25Ub2dnbGVJZH1gKS5oaWRlKCk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0IHNob3VsZCBkcm9wIFVwIG9yIERvd25cclxuICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSAzNTtcclxuICAgICAgICAgICAgICBjb25zdCBpRWxlbWVudCA9ICQoJy5kcm9wZG93bi1tZW51Jyk7XHJcbiAgICAgICAgICAgICAgY29uc3QgaUVsZW1lbnRXcmFwcGVyID0gaUVsZW1lbnQucGFyZW50KCk7XHJcbiAgICAgICAgICAgICAgY29uc3QgaUVsZW1lbnRXcmFwcGVyT2Zmc2V0ID0gaUVsZW1lbnRXcmFwcGVyLm9mZnNldCgpIHx8IHt9O1xyXG4gICAgICAgICAgICAgIGNvbnN0IGlFbGVtZW50V3JhcHBlck9mZnNldFRvcCA9IGlFbGVtZW50V3JhcHBlck9mZnNldC50b3AgfHwgaUVsZW1lbnRXcmFwcGVyICYmIGlFbGVtZW50V3JhcHBlci5sZW5ndGggPiAwICYmIGlFbGVtZW50V3JhcHBlclswXS5vZmZzZXRUb3A7XHJcbiAgICAgICAgICAgICAgY29uc3QgaUVsZW1lbnRIZWlnaHQgPSBpRWxlbWVudC5oZWlnaHQoKTtcclxuICAgICAgICAgICAgICBjb25zdCB3aW5kb3dIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkRHJvcFVwID0gKHdpbmRvd0hlaWdodCAtIGlFbGVtZW50SGVpZ2h0IC0gb2Zmc2V0KSA8IGlFbGVtZW50V3JhcHBlck9mZnNldFRvcDtcclxuICAgICAgICAgICAgICBsZXQgbWVudU1hcmdpblRvcCA9ICcwcHgnO1xyXG4gICAgICAgICAgICAgIGlmIChzaG91bGREcm9wVXApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldEJvdHRvbSA9IG9mZnNldERyb3B1cEJvdHRvbSB8fCAwO1xyXG4gICAgICAgICAgICAgICAgbWVudU1hcmdpblRvcCA9ICctJy5jb25jYXQoYCR7aUVsZW1lbnRIZWlnaHQgKyBvZmZzZXQgKyBvZmZzZXRCb3R0b20gKyA1fWAsICdweCcpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0aGlzLl9kb21FbGVtZW50LmNzcyh7ICdtYXJnaW4tdG9wJzogbWVudU1hcmdpblRvcCB9KTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gc2V0IGRyb3Bkb3duIG1hcmdpbiBsZWZ0IGFjY29yZGluZyB0byB0aGUgZG9jdW1lbnQgd2lkdGhcclxuICAgICAgICAgICAgICBjb25zdCBwYXJlbnRPZmZzZXQgPSBpRWxlbWVudFdyYXBwZXJPZmZzZXQubGVmdDtcclxuICAgICAgICAgICAgICBjb25zdCBsZWZ0TWFyZ2luID0gcGFyZW50T2Zmc2V0IC0gJChkb2N1bWVudCkud2lkdGgoKTtcclxuICAgICAgICAgICAgICB0aGlzLl9kb21FbGVtZW50LmNzcyh7ICdtYXJnaW4tbGVmdCc6ICh0aGlzLl9kb21FbGVtZW50LndpZHRoKCkgKyBsZWZ0TWFyZ2luICsgNjApICsgJ3B4JyB9KTtcclxuXHJcbiAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2RvbUVsZW1lbnQuZHJvcGRvd24oJ3Nob3cnKTsgLy8gcmVxdWlyZWQgZm9yIEJvb3RzdHJhcCA0IG9ubHlcclxuICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBCb290c3RyYXAgMyB3aWwgdGhyb3cgYW4gZXJyb3Igc2luY2UgdGhhdCBtZXRob2QgZG9lc24ndCBleGlzdCwgd2UgY2FuIHNhZmVseSBkaXNyZWdhcmQgaXRcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMuX2RvbUVsZW1lbnQub24oJ2hpZGRlbi5icy5kcm9wZG93bicsICgpID0+IHRoaXMuZHJvcENvbnRhaW5lclNob3coKSk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIGhpZGUgZHJvcGRvd24gbWVudSBvbiBncmlkIHNjcm9sbFxyXG4gICAgICAgICAgICAgIHRoaXMuZ3JpZFZpZXdwb3J0Lm9uKCdzY3JvbGwnLCAoKSA9PiB0aGlzLmRpc3Bvc2UoKSk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIGhpZGUgb24gZHJvcGRvd24gY2xpY2tcclxuICAgICAgICAgICAgICB0aGlzLl9kb21FbGVtZW50Lm9uKCdjbGljaycsICgpID0+IHRoaXMuZGlzcG9zZSgpKTtcclxuICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=