1 | ;
|
2 |
|
3 | exports.__esModule = true;
|
4 | exports.default = void 0;
|
5 |
|
6 | var _sourceMap = _interopRequireDefault(require("source-map"));
|
7 |
|
8 | var _path = _interopRequireDefault(require("path"));
|
9 |
|
10 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
11 |
|
12 | var MapGenerator =
|
13 | /*#__PURE__*/
|
14 | function () {
|
15 | function MapGenerator(stringify, root, opts) {
|
16 | this.stringify = stringify;
|
17 | this.mapOpts = opts.map || {};
|
18 | this.root = root;
|
19 | this.opts = opts;
|
20 | }
|
21 |
|
22 | var _proto = MapGenerator.prototype;
|
23 |
|
24 | _proto.isMap = function isMap() {
|
25 | if (typeof this.opts.map !== 'undefined') {
|
26 | return !!this.opts.map;
|
27 | }
|
28 |
|
29 | return this.previous().length > 0;
|
30 | };
|
31 |
|
32 | _proto.previous = function previous() {
|
33 | var _this = this;
|
34 |
|
35 | if (!this.previousMaps) {
|
36 | this.previousMaps = [];
|
37 | this.root.walk(function (node) {
|
38 | if (node.source && node.source.input.map) {
|
39 | var map = node.source.input.map;
|
40 |
|
41 | if (_this.previousMaps.indexOf(map) === -1) {
|
42 | _this.previousMaps.push(map);
|
43 | }
|
44 | }
|
45 | });
|
46 | }
|
47 |
|
48 | return this.previousMaps;
|
49 | };
|
50 |
|
51 | _proto.isInline = function isInline() {
|
52 | if (typeof this.mapOpts.inline !== 'undefined') {
|
53 | return this.mapOpts.inline;
|
54 | }
|
55 |
|
56 | var annotation = this.mapOpts.annotation;
|
57 |
|
58 | if (typeof annotation !== 'undefined' && annotation !== true) {
|
59 | return false;
|
60 | }
|
61 |
|
62 | if (this.previous().length) {
|
63 | return this.previous().some(function (i) {
|
64 | return i.inline;
|
65 | });
|
66 | }
|
67 |
|
68 | return true;
|
69 | };
|
70 |
|
71 | _proto.isSourcesContent = function isSourcesContent() {
|
72 | if (typeof this.mapOpts.sourcesContent !== 'undefined') {
|
73 | return this.mapOpts.sourcesContent;
|
74 | }
|
75 |
|
76 | if (this.previous().length) {
|
77 | return this.previous().some(function (i) {
|
78 | return i.withContent();
|
79 | });
|
80 | }
|
81 |
|
82 | return true;
|
83 | };
|
84 |
|
85 | _proto.clearAnnotation = function clearAnnotation() {
|
86 | if (this.mapOpts.annotation === false) return;
|
87 | var node;
|
88 |
|
89 | for (var i = this.root.nodes.length - 1; i >= 0; i--) {
|
90 | node = this.root.nodes[i];
|
91 | if (node.type !== 'comment') continue;
|
92 |
|
93 | if (node.text.indexOf('# sourceMappingURL=') === 0) {
|
94 | this.root.removeChild(i);
|
95 | }
|
96 | }
|
97 | };
|
98 |
|
99 | _proto.setSourcesContent = function setSourcesContent() {
|
100 | var _this2 = this;
|
101 |
|
102 | var already = {};
|
103 | this.root.walk(function (node) {
|
104 | if (node.source) {
|
105 | var from = node.source.input.from;
|
106 |
|
107 | if (from && !already[from]) {
|
108 | already[from] = true;
|
109 |
|
110 | var relative = _this2.relative(from);
|
111 |
|
112 | _this2.map.setSourceContent(relative, node.source.input.css);
|
113 | }
|
114 | }
|
115 | });
|
116 | };
|
117 |
|
118 | _proto.applyPrevMaps = function applyPrevMaps() {
|
119 | for (var _iterator = this.previous(), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
|
120 | var _ref;
|
121 |
|
122 | if (_isArray) {
|
123 | if (_i >= _iterator.length) break;
|
124 | _ref = _iterator[_i++];
|
125 | } else {
|
126 | _i = _iterator.next();
|
127 | if (_i.done) break;
|
128 | _ref = _i.value;
|
129 | }
|
130 |
|
131 | var prev = _ref;
|
132 | var from = this.relative(prev.file);
|
133 |
|
134 | var root = prev.root || _path.default.dirname(prev.file);
|
135 |
|
136 | var map = void 0;
|
137 |
|
138 | if (this.mapOpts.sourcesContent === false) {
|
139 | map = new _sourceMap.default.SourceMapConsumer(prev.text);
|
140 |
|
141 | if (map.sourcesContent) {
|
142 | map.sourcesContent = map.sourcesContent.map(function () {
|
143 | return null;
|
144 | });
|
145 | }
|
146 | } else {
|
147 | map = prev.consumer();
|
148 | }
|
149 |
|
150 | this.map.applySourceMap(map, from, this.relative(root));
|
151 | }
|
152 | };
|
153 |
|
154 | _proto.isAnnotation = function isAnnotation() {
|
155 | if (this.isInline()) {
|
156 | return true;
|
157 | }
|
158 |
|
159 | if (typeof this.mapOpts.annotation !== 'undefined') {
|
160 | return this.mapOpts.annotation;
|
161 | }
|
162 |
|
163 | if (this.previous().length) {
|
164 | return this.previous().some(function (i) {
|
165 | return i.annotation;
|
166 | });
|
167 | }
|
168 |
|
169 | return true;
|
170 | };
|
171 |
|
172 | _proto.toBase64 = function toBase64(str) {
|
173 | if (Buffer) {
|
174 | return Buffer.from(str).toString('base64');
|
175 | }
|
176 |
|
177 | return window.btoa(unescape(encodeURIComponent(str)));
|
178 | };
|
179 |
|
180 | _proto.addAnnotation = function addAnnotation() {
|
181 | var content;
|
182 |
|
183 | if (this.isInline()) {
|
184 | content = 'data:application/json;base64,' + this.toBase64(this.map.toString());
|
185 | } else if (typeof this.mapOpts.annotation === 'string') {
|
186 | content = this.mapOpts.annotation;
|
187 | } else {
|
188 | content = this.outputFile() + '.map';
|
189 | }
|
190 |
|
191 | var eol = '\n';
|
192 | if (this.css.indexOf('\r\n') !== -1) eol = '\r\n';
|
193 | this.css += eol + '/*# sourceMappingURL=' + content + ' */';
|
194 | };
|
195 |
|
196 | _proto.outputFile = function outputFile() {
|
197 | if (this.opts.to) {
|
198 | return this.relative(this.opts.to);
|
199 | }
|
200 |
|
201 | if (this.opts.from) {
|
202 | return this.relative(this.opts.from);
|
203 | }
|
204 |
|
205 | return 'to.css';
|
206 | };
|
207 |
|
208 | _proto.generateMap = function generateMap() {
|
209 | this.generateString();
|
210 | if (this.isSourcesContent()) this.setSourcesContent();
|
211 | if (this.previous().length > 0) this.applyPrevMaps();
|
212 | if (this.isAnnotation()) this.addAnnotation();
|
213 |
|
214 | if (this.isInline()) {
|
215 | return [this.css];
|
216 | }
|
217 |
|
218 | return [this.css, this.map];
|
219 | };
|
220 |
|
221 | _proto.relative = function relative(file) {
|
222 | if (file.indexOf('<') === 0) return file;
|
223 | if (/^\w+:\/\//.test(file)) return file;
|
224 | var from = this.opts.to ? _path.default.dirname(this.opts.to) : '.';
|
225 |
|
226 | if (typeof this.mapOpts.annotation === 'string') {
|
227 | from = _path.default.dirname(_path.default.resolve(from, this.mapOpts.annotation));
|
228 | }
|
229 |
|
230 | file = _path.default.relative(from, file);
|
231 |
|
232 | if (_path.default.sep === '\\') {
|
233 | return file.replace(/\\/g, '/');
|
234 | }
|
235 |
|
236 | return file;
|
237 | };
|
238 |
|
239 | _proto.sourcePath = function sourcePath(node) {
|
240 | if (this.mapOpts.from) {
|
241 | return this.mapOpts.from;
|
242 | }
|
243 |
|
244 | return this.relative(node.source.input.from);
|
245 | };
|
246 |
|
247 | _proto.generateString = function generateString() {
|
248 | var _this3 = this;
|
249 |
|
250 | this.css = '';
|
251 | this.map = new _sourceMap.default.SourceMapGenerator({
|
252 | file: this.outputFile()
|
253 | });
|
254 | var line = 1;
|
255 | var column = 1;
|
256 | var lines, last;
|
257 | this.stringify(this.root, function (str, node, type) {
|
258 | _this3.css += str;
|
259 |
|
260 | if (node && type !== 'end') {
|
261 | if (node.source && node.source.start) {
|
262 | _this3.map.addMapping({
|
263 | source: _this3.sourcePath(node),
|
264 | generated: {
|
265 | line: line,
|
266 | column: column - 1
|
267 | },
|
268 | original: {
|
269 | line: node.source.start.line,
|
270 | column: node.source.start.column - 1
|
271 | }
|
272 | });
|
273 | } else {
|
274 | _this3.map.addMapping({
|
275 | source: '<no source>',
|
276 | original: {
|
277 | line: 1,
|
278 | column: 0
|
279 | },
|
280 | generated: {
|
281 | line: line,
|
282 | column: column - 1
|
283 | }
|
284 | });
|
285 | }
|
286 | }
|
287 |
|
288 | lines = str.match(/\n/g);
|
289 |
|
290 | if (lines) {
|
291 | line += lines.length;
|
292 | last = str.lastIndexOf('\n');
|
293 | column = str.length - last;
|
294 | } else {
|
295 | column += str.length;
|
296 | }
|
297 |
|
298 | if (node && type !== 'start') {
|
299 | if (node.source && node.source.end) {
|
300 | _this3.map.addMapping({
|
301 | source: _this3.sourcePath(node),
|
302 | generated: {
|
303 | line: line,
|
304 | column: column - 2
|
305 | },
|
306 | original: {
|
307 | line: node.source.end.line,
|
308 | column: node.source.end.column - 1
|
309 | }
|
310 | });
|
311 | } else {
|
312 | _this3.map.addMapping({
|
313 | source: '<no source>',
|
314 | original: {
|
315 | line: 1,
|
316 | column: 0
|
317 | },
|
318 | generated: {
|
319 | line: line,
|
320 | column: column - 1
|
321 | }
|
322 | });
|
323 | }
|
324 | }
|
325 | });
|
326 | };
|
327 |
|
328 | _proto.generate = function generate() {
|
329 | this.clearAnnotation();
|
330 |
|
331 | if (this.isMap()) {
|
332 | return this.generateMap();
|
333 | }
|
334 |
|
335 | var result = '';
|
336 | this.stringify(this.root, function (i) {
|
337 | result += i;
|
338 | });
|
339 | return [result];
|
340 | };
|
341 |
|
342 | return MapGenerator;
|
343 | }();
|
344 |
|
345 | var _default = MapGenerator;
|
346 | exports.default = _default;
|
347 | module.exports = exports.default;
|
348 | //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1hcC1nZW5lcmF0b3IuZXM2Il0sIm5hbWVzIjpbIk1hcEdlbmVyYXRvciIsInN0cmluZ2lmeSIsInJvb3QiLCJvcHRzIiwibWFwT3B0cyIsIm1hcCIsImlzTWFwIiwicHJldmlvdXMiLCJsZW5ndGgiLCJwcmV2aW91c01hcHMiLCJ3YWxrIiwibm9kZSIsInNvdXJjZSIsImlucHV0IiwiaW5kZXhPZiIsInB1c2giLCJpc0lubGluZSIsImlubGluZSIsImFubm90YXRpb24iLCJzb21lIiwiaSIsImlzU291cmNlc0NvbnRlbnQiLCJzb3VyY2VzQ29udGVudCIsIndpdGhDb250ZW50IiwiY2xlYXJBbm5vdGF0aW9uIiwibm9kZXMiLCJ0eXBlIiwidGV4dCIsInJlbW92ZUNoaWxkIiwic2V0U291cmNlc0NvbnRlbnQiLCJhbHJlYWR5IiwiZnJvbSIsInJlbGF0aXZlIiwic2V0U291cmNlQ29udGVudCIsImNzcyIsImFwcGx5UHJldk1hcHMiLCJwcmV2IiwiZmlsZSIsInBhdGgiLCJkaXJuYW1lIiwibW96aWxsYSIsIlNvdXJjZU1hcENvbnN1bWVyIiwiY29uc3VtZXIiLCJhcHBseVNvdXJjZU1hcCIsImlzQW5ub3RhdGlvbiIsInRvQmFzZTY0Iiwic3RyIiwiQnVmZmVyIiwidG9TdHJpbmciLCJ3aW5kb3ciLCJidG9hIiwidW5lc2NhcGUiLCJlbmNvZGVVUklDb21wb25lbnQiLCJhZGRBbm5vdGF0aW9uIiwiY29udGVudCIsIm91dHB1dEZpbGUiLCJlb2wiLCJ0byIsImdlbmVyYXRlTWFwIiwiZ2VuZXJhdGVTdHJpbmciLCJ0ZXN0IiwicmVzb2x2ZSIsInNlcCIsInJlcGxhY2UiLCJzb3VyY2VQYXRoIiwiU291cmNlTWFwR2VuZXJhdG9yIiwibGluZSIsImNvbHVtbiIsImxpbmVzIiwibGFzdCIsInN0YXJ0IiwiYWRkTWFwcGluZyIsImdlbmVyYXRlZCIsIm9yaWdpbmFsIiwibWF0Y2giLCJsYXN0SW5kZXhPZiIsImVuZCIsImdlbmVyYXRlIiwicmVzdWx0Il0s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LElBQXBCLEVBQTBCLFVBQUFrQixDQUFDLEVBQUk7QUFDN0IwRCxNQUFBQSxNQUFNLElBQUkxRCxDQUFWO0FBQ0QsS0FGRDtBQUdBLFdBQU8sQ0FBQzBELE1BQUQsQ0FBUDtBQUNELEc7Ozs7O2VBR1k5RSxZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vemlsbGEgZnJvbSAnc291cmNlLW1hcCdcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5cbmNsYXNzIE1hcEdlbmVyYXRvciB7XG4gIGNvbnN0cnVjdG9yIChzdHJpbmdpZnksIHJvb3QsIG9wdHMpIHtcbiAgICB0aGlzLnN0cmluZ2lmeSA9IHN0cmluZ2lmeVxuICAgIHRoaXMubWFwT3B0cyA9IG9wdHMubWFwIHx8IHsgfVxuICAgIHRoaXMucm9vdCA9IHJvb3RcbiAgICB0aGlzLm9wdHMgPSBvcHRzXG4gIH1cblxuICBpc01hcCAoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLm9wdHMubWFwICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuICEhdGhpcy5vcHRzLm1hcFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wcmV2aW91cygpLmxlbmd0aCA+IDBcbiAgfVxuXG4gIHByZXZpb3VzICgpIHtcbiAgICBpZiAoIXRoaXMucHJldmlvdXNNYXBzKSB7XG4gICAgICB0aGlzLnByZXZpb3VzTWFwcyA9IFtdXG4gICAgICB0aGlzLnJvb3Qud2Fsayhub2RlID0+IHtcbiAgICAgICAgaWYgKG5vZGUuc291cmNlICYmIG5vZGUuc291cmNlLmlucHV0Lm1hcCkge1xuICAgICAgICAgIGxldCBtYXAgPSBub2RlLnNvdXJjZS5pbnB1dC5tYXBcbiAgICAgICAgICBpZiAodGhpcy5wcmV2aW91c01hcHMuaW5kZXhPZihtYXApID09PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5wcmV2aW91c01hcHMucHVzaChtYXApXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnByZXZpb3VzTWFwc1xuICB9XG5cbiAgaXNJbmxpbmUgKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5tYXBPcHRzLmlubGluZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiB0aGlzLm1hcE9wdHMuaW5saW5lXG4gICAgfVxuXG4gICAgbGV0IGFubm90YXRpb24gPSB0aGlzLm1hcE9wdHMuYW5ub3RhdGlvblxuICAgIGlmICh0eXBlb2YgYW5ub3RhdGlvbiAhPT0gJ3VuZGVmaW5lZCcgJiYgYW5ub3RhdGlvbiAhPT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJldmlvdXMoKS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLnByZXZpb3VzKCkuc29tZShpID0+IGkuaW5saW5lKVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaXNTb3VyY2VzQ29udGVudCAoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLm1hcE9wdHMuc291cmNlc0NvbnRlbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5tYXBPcHRzLnNvdXJjZXNDb250ZW50XG4gICAgfVxuICAgIGlmICh0aGlzLnByZXZpb3VzKCkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcmV2aW91cygpLnNvbWUoaSA9PiBpLndpdGhDb250ZW50KCkpXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBjbGVhckFubm90YXRpb24gKCkge1xuICAgIGlmICh0aGlzLm1hcE9wdHMuYW5ub3RhdGlvbiA9PT0gZmFsc2UpIHJldHVyblxuXG4gICAgbGV0IG5vZGVcbiAgICBmb3IgKGxldCBpID0gdGhpcy5yb290Lm5vZGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBub2RlID0gdGhpcy5yb290Lm5vZGVzW2ldXG4gICAgICBpZiAobm9kZS50eXBlICE9PSAnY29tbWVudCcpIGNvbnRpbnVlXG4gICAgICBpZiAobm9kZS50ZXh0LmluZGV4T2YoJyMgc291cmNlTWFwcGluZ1VSTD0nKSA9PT0gMCkge1xuICAgICAgICB0aGlzLnJvb3QucmVtb3ZlQ2hpbGQoaSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZXRTb3VyY2VzQ29udGVudCAoKSB7XG4gICAgbGV0IGFscmVhZHkgPSB7IH1cbiAgICB0aGlzLnJvb3Qud2Fsayhub2RlID0+IHtcbiAgICAgIGlmIChub2RlLnNvdXJjZSkge1xuICAgICAgICBsZXQgZnJvbSA9IG5vZGUuc291cmNlLmlucHV0LmZyb21cbiAgICAgICAgaWYgKGZyb20gJiYgIWFscmVhZHlbZnJvbV0pIHtcbiAgICAgICAgICBhbHJlYWR5W2Zyb21dID0gdHJ1ZVxuICAgICAgICAgIGxldCByZWxhdGl2ZSA9IHRoaXMucmVsYXRpdmUoZnJvbSlcbiAgICAgICAgICB0aGlzLm1hcC5zZXRTb3VyY2VDb250ZW50KHJlbGF0aXZlLCBub2RlLnNvdXJjZS5pbnB1dC5jc3MpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgYXBwbHlQcmV2TWFwcyAoKSB7XG4gICAgZm9yIChsZXQgcHJldiBvZiB0aGlzLnByZXZpb3VzKCkpIHtcbiAgICAgIGxldCBmcm9tID0gdGhpcy5yZWxhdGl2ZShwcmV2LmZpbGUpXG4gICAgICBsZXQgcm9vdCA9IHByZXYucm9vdCB8fCBwYXRoLmRpcm5hbWUocHJldi5maWxlKVxuICAgICAgbGV0IG1hcFxuXG4gICAgICBpZiAodGhpcy5tYXBPcHRzLnNvdXJjZXNDb250ZW50ID09PSBmYWxzZSkge1xuICAgICAgICBtYXAgPSBuZXcgbW96aWxsYS5Tb3VyY2VNYXBDb25zdW1lcihwcmV2LnRleHQpXG4gICAgICAgIGlmIChtYXAuc291cmNlc0NvbnRlbnQpIHtcbiAgICAgICAgICBtYXAuc291cmNlc0NvbnRlbnQgPSBtYXAuc291cmNlc0NvbnRlbnQubWFwKCgpID0+IG51bGwpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1hcCA9IHByZXYuY29uc3VtZXIoKVxuICAgICAgfVxuXG4gICAgICB0aGlzLm1hcC5hcHBseVNvdXJjZU1hcChtYXAsIGZyb20sIHRoaXMucmVsYXRpdmUocm9vdCkpXG4gICAgfVxuICB9XG5cbiAgaXNBbm5vdGF0aW9uICgpIHtcbiAgICBpZiAodGhpcy5pc0lubGluZSgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHRoaXMubWFwT3B0cy5hbm5vdGF0aW9uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHRoaXMubWFwT3B0cy5hbm5vdGF0aW9uXG4gICAgfVxuICAgIGlmICh0aGlzLnByZXZpb3VzKCkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcmV2aW91cygpLnNvbWUoaSA9PiBpLmFubm90YXRpb24pXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICB0b0Jhc2U2NCAoc3RyKSB7XG4gICAgaWYgKEJ1ZmZlcikge1xuICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHN0cikudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgfVxuICAgIHJldHVybiB3aW5kb3cuYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSkpXG4gIH1cblxuICBhZGRBbm5vdGF0aW9uICgpIHtcbiAgICBsZXQgY29udGVudFxuXG4gICAgaWYgKHRoaXMuaXNJbmxpbmUoKSkge1xuICAgICAgY29udGVudCA9ICdkYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LCcgK1xuICAgICAgICAgICAgICAgIHRoaXMudG9CYXNlNjQodGhpcy5tYXAudG9TdHJpbmcoKSlcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLm1hcE9wdHMuYW5ub3RhdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnRlbnQgPSB0aGlzLm1hcE9wdHMuYW5ub3RhdGlvblxuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZW50ID0gdGhpcy5vdXRwdXRGaWxlKCkgKyAnLm1hcCdcbiAgICB9XG5cbiAgICBsZXQgZW9sID0gJ1xcbidcbiAgICBpZiAodGhpcy5jc3MuaW5kZXhPZignXFxyXFxuJykgIT09IC0xKSBlb2wgPSAnXFxyXFxuJ1xuXG4gICAgdGhpcy5jc3MgKz0gZW9sICsgJy8qIyBzb3VyY2VNYXBwaW5nVVJMPScgKyBjb250ZW50ICsgJyAqLydcbiAgfVxuXG4gIG91dHB1dEZpbGUgKCkge1xuICAgIGlmICh0aGlzLm9wdHMudG8pIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbGF0aXZlKHRoaXMub3B0cy50bylcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5mcm9tKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGl2ZSh0aGlzLm9wdHMuZnJvbSlcbiAgICB9XG4gICAgcmV0dXJuICd0by5jc3MnXG4gIH1cblxuICBnZW5lcmF0ZU1hcCAoKSB7XG4gICAgdGhpcy5nZW5lcmF0ZVN0cmluZygpXG4gICAgaWYgKHRoaXMuaXNTb3VyY2VzQ29udGVudCgpKSB0aGlzLnNldFNvdXJjZXNDb250ZW50KClcbiAgICBpZiAodGhpcy5wcmV2aW91cygpLmxlbmd0aCA+IDApIHRoaXMuYXBwbHlQcmV2TWFwcygpXG4gICAgaWYgKHRoaXMuaXNBbm5vdGF0aW9uKCkpIHRoaXMuYWRkQW5ub3RhdGlvbigpXG5cbiAgICBpZiAodGhpcy5pc0lubGluZSgpKSB7XG4gICAgICByZXR1cm4gW3RoaXMuY3NzXVxuICAgIH1cbiAgICByZXR1cm4gW3RoaXMuY3NzLCB0aGlzLm1hcF1cbiAgfVxuXG4gIHJlbGF0aXZlIChmaWxlKSB7XG4gICAgaWYgKGZpbGUuaW5kZXhPZignPCcpID09PSAwKSByZXR1cm4gZmlsZVxuICAgIGlmICgvXlxcdys6XFwvXFwvLy50ZXN0KGZpbGUpKSByZXR1cm4gZmlsZVxuXG4gICAgbGV0IGZyb20gPSB0aGlzLm9wdHMudG8gPyBwYXRoLmRpcm5hbWUodGhpcy5vcHRzLnRvKSA6ICcuJ1xuXG4gICAgaWYgKHR5cGVvZiB0aGlzLm1hcE9wdHMuYW5ub3RhdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGZyb20gPSBwYXRoLmRpcm5hbWUocGF0aC5yZXNvbHZlKGZyb20sIHRoaXMubWFwT3B0cy5hbm5vdGF0aW9uKSlcbiAgICB9XG5cbiAgICBmaWxlID0gcGF0aC5yZWxhdGl2ZShmcm9tLCBmaWxlKVxuICAgIGlmIChwYXRoLnNlcCA9PT0gJ1xcXFwnKSB7XG4gICAgICByZXR1cm4gZmlsZS5yZXBsYWNlKC9cXFxcL2csICcvJylcbiAgICB9XG4gICAgcmV0dXJuIGZpbGVcbiAgfVxuXG4gIHNvdXJjZVBhdGggKG5vZGUpIHtcbiAgICBpZiAodGhpcy5tYXBPcHRzLmZyb20pIHtcbiAgICAgIHJldHVybiB0aGlzLm1hcE9wdHMuZnJvbVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZWxhdGl2ZShub2RlLnNvdXJjZS5pbnB1dC5mcm9tKVxuICB9XG5cbiAgZ2VuZXJhdGVTdHJpbmcgKCkge1xuICAgIHRoaXMuY3NzID0gJydcbiAgICB0aGlzLm1hcCA9IG5ldyBtb3ppbGxhLlNvdXJjZU1hcEdlbmVyYXRvcih7IGZpbGU6IHRoaXMub3V0cHV0RmlsZSgpIH0pXG5cbiAgICBsZXQgbGluZSA9IDFcbiAgICBsZXQgY29sdW1uID0gMVxuXG4gICAgbGV0IGxpbmVzLCBsYXN0XG4gICAgdGhpcy5zdHJpbmdpZnkodGhpcy5yb290LCAoc3RyLCBub2RlLCB0eXBlKSA9PiB7XG4gICAgICB0aGlzLmNzcyArPSBzdHJcblxuICAgICAgaWYgKG5vZGUgJiYgdHlwZSAhPT0gJ2VuZCcpIHtcbiAgICAgICAgaWYgKG5vZGUuc291cmNlICYmIG5vZGUuc291cmNlLnN0YXJ0KSB7XG4gICAgICAgICAgdGhpcy5tYXAuYWRkTWFwcGluZyh7XG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlUGF0aChub2RlKSxcbiAgICAgICAgICAgIGdlbmVyYXRlZDogeyBsaW5lLCBjb2x1bW46IGNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIG9yaWdpbmFsOiB7XG4gICAgICAgICAgICAgIGxpbmU6IG5vZGUuc291cmNlLnN0YXJ0LmxpbmUsXG4gICAgICAgICAgICAgIGNvbHVtbjogbm9kZS5zb3VyY2Uuc3RhcnQuY29sdW1uIC0gMVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5tYXAuYWRkTWFwcGluZyh7XG4gICAgICAgICAgICBzb3VyY2U6ICc8bm8gc291cmNlPicsXG4gICAgICAgICAgICBvcmlnaW5hbDogeyBsaW5lOiAxLCBjb2x1bW46IDAgfSxcbiAgICAgICAgICAgIGdlbmVyYXRlZDogeyBsaW5lLCBjb2x1bW46IGNvbHVtbiAtIDEgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGluZXMgPSBzdHIubWF0Y2goL1xcbi9nKVxuICAgICAgaWYgKGxpbmVzKSB7XG4gICAgICAgIGxpbmUgKz0gbGluZXMubGVuZ3RoXG4gICAgICAgIGxhc3QgPSBzdHIubGFzdEluZGV4T2YoJ1xcbicpXG4gICAgICAgIGNvbHVtbiA9IHN0ci5sZW5ndGggLSBsYXN0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2x1bW4gKz0gc3RyLmxlbmd0aFxuICAgICAgfVxuXG4gICAgICBpZiAobm9kZSAmJiB0eXBlICE9PSAnc3RhcnQnKSB7XG4gICAgICAgIGlmIChub2RlLnNvdXJjZSAmJiBub2RlLnNvdXJjZS5lbmQpIHtcbiAgICAgICAgICB0aGlzLm1hcC5hZGRNYXBwaW5nKHtcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2VQYXRoKG5vZGUpLFxuICAgICAgICAgICAgZ2VuZXJhdGVkOiB7IGxpbmUsIGNvbHVtbjogY29sdW1uIC0gMiB9LFxuICAgICAgICAgICAgb3JpZ2luYWw6IHtcbiAgICAgICAgICAgICAgbGluZTogbm9kZS5zb3VyY2UuZW5kLmxpbmUsXG4gICAgICAgICAgICAgIGNvbHVtbjogbm9kZS5zb3VyY2UuZW5kLmNvbHVtbiAtIDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgICAgc291cmNlOiAnPG5vIHNvdXJjZT4nLFxuICAgICAgICAgICAgb3JpZ2luYWw6IHsgbGluZTogMSwgY29sdW1uOiAwIH0sXG4gICAgICAgICAgICBnZW5lcmF0ZWQ6IHsgbGluZSwgY29sdW1uOiBjb2x1bW4gLSAxIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGdlbmVyYXRlICgpIHtcbiAgICB0aGlzLmNsZWFyQW5ub3RhdGlvbigpXG5cbiAgICBpZiAodGhpcy5pc01hcCgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZU1hcCgpXG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdCA9ICcnXG4gICAgdGhpcy5zdHJpbmdpZnkodGhpcy5yb290LCBpID0+IHtcbiAgICAgIHJlc3VsdCArPSBpXG4gICAgfSlcbiAgICByZXR1cm4gW3Jlc3VsdF1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBNYXBHZW5lcmF0b3JcbiJdLCJmaWxlIjoibWFwLWdlbmVyYXRvci5qcyJ9
|