collapse.directive.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. /**
  2. * @fileoverview added by tsickle
  3. * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
  4. */
  5. import { AnimationBuilder } from '@angular/animations';
  6. import { Directive, ElementRef, EventEmitter, HostBinding, Input, Output, Renderer2 } from '@angular/core';
  7. import { collapseAnimation, expandAnimation } from './collapse-animations';
  8. var CollapseDirective = /** @class */ (function () {
  9. function CollapseDirective(_el, _renderer, _builder) {
  10. this._el = _el;
  11. this._renderer = _renderer;
  12. /**
  13. * This event fires as soon as content collapses
  14. */
  15. this.collapsed = new EventEmitter();
  16. /**
  17. * This event fires when collapsing is started
  18. */
  19. this.collapses = new EventEmitter();
  20. /**
  21. * This event fires as soon as content becomes visible
  22. */
  23. this.expanded = new EventEmitter();
  24. /**
  25. * This event fires when expansion is started
  26. */
  27. this.expands = new EventEmitter();
  28. // shown
  29. this.isExpanded = true;
  30. // hidden
  31. this.isCollapsed = false;
  32. // stale state
  33. this.isCollapse = true;
  34. // animation state
  35. this.isCollapsing = false;
  36. /**
  37. * turn on/off animation
  38. */
  39. this.isAnimated = false;
  40. this._display = 'block';
  41. this._stylesLoaded = false;
  42. this._COLLAPSE_ACTION_NAME = 'collapse';
  43. this._EXPAND_ACTION_NAME = 'expand';
  44. this._factoryCollapseAnimation = _builder.build(collapseAnimation);
  45. this._factoryExpandAnimation = _builder.build(expandAnimation);
  46. }
  47. Object.defineProperty(CollapseDirective.prototype, "display", {
  48. set: /**
  49. * @param {?} value
  50. * @return {?}
  51. */
  52. function (value) {
  53. if (!this.isAnimated) {
  54. this._renderer.setStyle(this._el.nativeElement, 'display', value);
  55. return;
  56. }
  57. this._display = value;
  58. if (value === 'none') {
  59. this.hide();
  60. return;
  61. }
  62. this.show();
  63. },
  64. enumerable: true,
  65. configurable: true
  66. });
  67. Object.defineProperty(CollapseDirective.prototype, "collapse", {
  68. get: /**
  69. * @return {?}
  70. */
  71. function () {
  72. return this.isExpanded;
  73. },
  74. /** A flag indicating visibility of content (shown or hidden) */
  75. set: /**
  76. * A flag indicating visibility of content (shown or hidden)
  77. * @param {?} value
  78. * @return {?}
  79. */
  80. function (value) {
  81. if (!this._player || this._isAnimationDone) {
  82. this.isExpanded = value;
  83. this.toggle();
  84. }
  85. },
  86. enumerable: true,
  87. configurable: true
  88. });
  89. /**
  90. * @return {?}
  91. */
  92. CollapseDirective.prototype.ngAfterViewChecked = /**
  93. * @return {?}
  94. */
  95. function () {
  96. this._stylesLoaded = true;
  97. if (!this._player || !this._isAnimationDone) {
  98. return;
  99. }
  100. this._player.reset();
  101. this._renderer.setStyle(this._el.nativeElement, 'height', '*');
  102. };
  103. /** allows to manually toggle content visibility */
  104. /**
  105. * allows to manually toggle content visibility
  106. * @return {?}
  107. */
  108. CollapseDirective.prototype.toggle = /**
  109. * allows to manually toggle content visibility
  110. * @return {?}
  111. */
  112. function () {
  113. if (this.isExpanded) {
  114. this.hide();
  115. }
  116. else {
  117. this.show();
  118. }
  119. };
  120. /** allows to manually hide content */
  121. /**
  122. * allows to manually hide content
  123. * @return {?}
  124. */
  125. CollapseDirective.prototype.hide = /**
  126. * allows to manually hide content
  127. * @return {?}
  128. */
  129. function () {
  130. var _this = this;
  131. this.isCollapsing = true;
  132. this.isExpanded = false;
  133. this.isCollapsed = true;
  134. this.isCollapsing = false;
  135. this.collapses.emit(this);
  136. this._isAnimationDone = false;
  137. this.animationRun(this.isAnimated, this._COLLAPSE_ACTION_NAME)((/**
  138. * @return {?}
  139. */
  140. function () {
  141. _this._isAnimationDone = true;
  142. _this.collapsed.emit(_this);
  143. _this._renderer.setStyle(_this._el.nativeElement, 'display', 'none');
  144. }));
  145. };
  146. /** allows to manually show collapsed content */
  147. /**
  148. * allows to manually show collapsed content
  149. * @return {?}
  150. */
  151. CollapseDirective.prototype.show = /**
  152. * allows to manually show collapsed content
  153. * @return {?}
  154. */
  155. function () {
  156. var _this = this;
  157. this._renderer.setStyle(this._el.nativeElement, 'display', this._display);
  158. this.isCollapsing = true;
  159. this.isExpanded = true;
  160. this.isCollapsed = false;
  161. this.isCollapsing = false;
  162. this.expands.emit(this);
  163. this._isAnimationDone = false;
  164. this.animationRun(this.isAnimated, this._EXPAND_ACTION_NAME)((/**
  165. * @return {?}
  166. */
  167. function () {
  168. _this._isAnimationDone = true;
  169. _this.expanded.emit(_this);
  170. }));
  171. };
  172. /**
  173. * @param {?} isAnimated
  174. * @param {?} action
  175. * @return {?}
  176. */
  177. CollapseDirective.prototype.animationRun = /**
  178. * @param {?} isAnimated
  179. * @param {?} action
  180. * @return {?}
  181. */
  182. function (isAnimated, action) {
  183. var _this = this;
  184. if (!isAnimated || !this._stylesLoaded) {
  185. return (/**
  186. * @param {?} callback
  187. * @return {?}
  188. */
  189. function (callback) { return callback(); });
  190. }
  191. this._renderer.setStyle(this._el.nativeElement, 'overflow', 'hidden');
  192. this._renderer.addClass(this._el.nativeElement, 'collapse');
  193. /** @type {?} */
  194. var factoryAnimation = (action === this._EXPAND_ACTION_NAME)
  195. ? this._factoryExpandAnimation
  196. : this._factoryCollapseAnimation;
  197. if (this._player) {
  198. this._player.destroy();
  199. }
  200. this._player = factoryAnimation.create(this._el.nativeElement);
  201. this._player.play();
  202. return (/**
  203. * @param {?} callback
  204. * @return {?}
  205. */
  206. function (callback) { return _this._player.onDone(callback); });
  207. };
  208. CollapseDirective.decorators = [
  209. { type: Directive, args: [{
  210. selector: '[collapse]',
  211. exportAs: 'bs-collapse',
  212. host: {
  213. '[class.collapse]': 'true'
  214. }
  215. },] }
  216. ];
  217. /** @nocollapse */
  218. CollapseDirective.ctorParameters = function () { return [
  219. { type: ElementRef },
  220. { type: Renderer2 },
  221. { type: AnimationBuilder }
  222. ]; };
  223. CollapseDirective.propDecorators = {
  224. collapsed: [{ type: Output }],
  225. collapses: [{ type: Output }],
  226. expanded: [{ type: Output }],
  227. expands: [{ type: Output }],
  228. isExpanded: [{ type: HostBinding, args: ['class.in',] }, { type: HostBinding, args: ['class.show',] }, { type: HostBinding, args: ['attr.aria-expanded',] }],
  229. isCollapsed: [{ type: HostBinding, args: ['attr.aria-hidden',] }],
  230. isCollapse: [{ type: HostBinding, args: ['class.collapse',] }],
  231. isCollapsing: [{ type: HostBinding, args: ['class.collapsing',] }],
  232. display: [{ type: Input }],
  233. isAnimated: [{ type: Input }],
  234. collapse: [{ type: Input }]
  235. };
  236. return CollapseDirective;
  237. }());
  238. export { CollapseDirective };
  239. if (false) {
  240. /**
  241. * This event fires as soon as content collapses
  242. * @type {?}
  243. */
  244. CollapseDirective.prototype.collapsed;
  245. /**
  246. * This event fires when collapsing is started
  247. * @type {?}
  248. */
  249. CollapseDirective.prototype.collapses;
  250. /**
  251. * This event fires as soon as content becomes visible
  252. * @type {?}
  253. */
  254. CollapseDirective.prototype.expanded;
  255. /**
  256. * This event fires when expansion is started
  257. * @type {?}
  258. */
  259. CollapseDirective.prototype.expands;
  260. /** @type {?} */
  261. CollapseDirective.prototype.isExpanded;
  262. /** @type {?} */
  263. CollapseDirective.prototype.isCollapsed;
  264. /** @type {?} */
  265. CollapseDirective.prototype.isCollapse;
  266. /** @type {?} */
  267. CollapseDirective.prototype.isCollapsing;
  268. /**
  269. * turn on/off animation
  270. * @type {?}
  271. */
  272. CollapseDirective.prototype.isAnimated;
  273. /**
  274. * @type {?}
  275. * @private
  276. */
  277. CollapseDirective.prototype._display;
  278. /**
  279. * @type {?}
  280. * @private
  281. */
  282. CollapseDirective.prototype._factoryCollapseAnimation;
  283. /**
  284. * @type {?}
  285. * @private
  286. */
  287. CollapseDirective.prototype._factoryExpandAnimation;
  288. /**
  289. * @type {?}
  290. * @private
  291. */
  292. CollapseDirective.prototype._isAnimationDone;
  293. /**
  294. * @type {?}
  295. * @private
  296. */
  297. CollapseDirective.prototype._player;
  298. /**
  299. * @type {?}
  300. * @private
  301. */
  302. CollapseDirective.prototype._stylesLoaded;
  303. /**
  304. * @type {?}
  305. * @private
  306. */
  307. CollapseDirective.prototype._COLLAPSE_ACTION_NAME;
  308. /**
  309. * @type {?}
  310. * @private
  311. */
  312. CollapseDirective.prototype._EXPAND_ACTION_NAME;
  313. /**
  314. * @type {?}
  315. * @private
  316. */
  317. CollapseDirective.prototype._el;
  318. /**
  319. * @type {?}
  320. * @private
  321. */
  322. CollapseDirective.prototype._renderer;
  323. }
  324. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGFwc2UuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWJvb3RzdHJhcC9jb2xsYXBzZS8iLCJzb3VyY2VzIjpbImNvbGxhcHNlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUdqQixNQUFNLHFCQUFxQixDQUFDO0FBRTdCLE9BQU8sRUFFTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixlQUFlLEVBQ2hCLE1BQU0sdUJBQXVCLENBQUM7QUFFL0I7SUF3RUUsMkJBQ1UsR0FBZSxFQUNmLFNBQW9CLEVBQzVCLFFBQTBCO1FBRmxCLFFBQUcsR0FBSCxHQUFHLENBQVk7UUFDZixjQUFTLEdBQVQsU0FBUyxDQUFXOzs7O1FBakVwQixjQUFTLEdBQW9DLElBQUksWUFBWSxFQUFFLENBQUM7Ozs7UUFFaEUsY0FBUyxHQUFvQyxJQUFJLFlBQVksRUFBRSxDQUFDOzs7O1FBRWhFLGFBQVEsR0FBb0MsSUFBSSxZQUFZLEVBQUUsQ0FBQzs7OztRQUUvRCxZQUFPLEdBQW9DLElBQUksWUFBWSxFQUFFLENBQUM7O1FBTXhFLGVBQVUsR0FBRyxJQUFJLENBQUM7O1FBRWUsZ0JBQVcsR0FBRyxLQUFLLENBQUM7O1FBRXRCLGVBQVUsR0FBRyxJQUFJLENBQUM7O1FBRWhCLGlCQUFZLEdBQUcsS0FBSyxDQUFDOzs7O1FBcUI3QyxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBY3BCLGFBQVEsR0FBRyxPQUFPLENBQUM7UUFLbkIsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFFdEIsMEJBQXFCLEdBQUcsVUFBVSxDQUFDO1FBQ25DLHdCQUFtQixHQUFHLFFBQVEsQ0FBQztRQU9yQyxJQUFJLENBQUMseUJBQXlCLEdBQUcsUUFBUSxDQUFDLEtB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YzVCLHFDQUEyQjs7Ozs7SUFDM0Isc0RBQW9EOzs7OztJQUNwRCxvREFBa0Q7Ozs7O0lBQ2xELDZDQUFrQzs7Ozs7SUFDbEMsb0NBQWlDOzs7OztJQUNqQywwQ0FBOEI7Ozs7O0lBRTlCLGtEQUEyQzs7Ozs7SUFDM0MsZ0RBQXVDOzs7OztJQUdyQyxnQ0FBdUI7Ozs7O0lBQ3ZCLHNDQUE0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFuaW1hdGlvbkJ1aWxkZXIsXG4gIEFuaW1hdGlvbkZhY3RvcnksXG4gIEFuaW1hdGlvblBsYXllclxufSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcblxuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3Q2hlY2tlZCxcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RCaW5kaW5nLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7XG4gIGNvbGxhcHNlQW5pbWF0aW9uLFxuICBleHBhbmRBbmltYXRpb25cbn0gZnJvbSAnLi9jb2xsYXBzZS1hbmltYXRpb25zJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2NvbGxhcHNlXScsXG4gIGV4cG9ydEFzOiAnYnMtY29sbGFwc2UnLFxuICBob3N0OiB7XG4gICAgJ1tjbGFzcy5jb2xsYXBzZV0nOiAndHJ1ZSdcbiAgfVxufSlcbmV4cG9ydCBjbGFzcyBDb2xsYXBzZURpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0NoZWNrZWQge1xuICAvKiogVGhpcyBldmVudCBmaXJlcyBhcyBzb29uIGFzIGNvbnRlbnQgY29sbGFwc2VzICovXG4gIEBPdXRwdXQoKSBjb2xsYXBzZWQ6IEV2ZW50RW1pdHRlcjxDb2xsYXBzZURpcmVjdGl2ZT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIC8qKiBUaGlzIGV2ZW50IGZpcmVzIHdoZW4gY29sbGFwc2luZyBpcyBzdGFydGVkICovXG4gIEBPdXRwdXQoKSBjb2xsYXBzZXM6IEV2ZW50RW1pdHRlcjxDb2xsYXBzZURpcmVjdGl2ZT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIC8qKiBUaGlzIGV2ZW50IGZpcmVzIGFzIHNvb24gYXMgY29udGVudCBiZWNvbWVzIHZpc2libGUgKi9cbiAgQE91dHB1dCgpIGV4cGFuZGVkOiBFdmVudEVtaXR0ZXI8Q29sbGFwc2VEaXJlY3RpdmU+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAvKiogVGhpcyBldmVudCBmaXJlcyB3aGVuIGV4cGFuc2lvbiBpcyBzdGFydGVkICovXG4gIEBPdXRwdXQoKSBleHBhbmRzOiBFdmVudEVtaXR0ZXI8Q29sbGFwc2VEaXJlY3RpdmU+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8vIHNob3duXG4gIEBIb3N0QmluZGluZygnY2xhc3MuaW4nKVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNob3cnKVxuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1leHBhbmRlZCcpXG4gIGlzRXhwYW5kZWQgPSB0cnVlO1xuICAvLyBoaWRkZW5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtaGlkZGVuJykgaXNDb2xsYXBzZWQgPSBmYWxzZTtcbiAgLy8gc3RhbGUgc3RhdGVcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5jb2xsYXBzZScpIGlzQ29sbGFwc2UgPSB0cnVlO1xuICAvLyBhbmltYXRpb24gc3RhdGVcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5jb2xsYXBzaW5nJykgaXNDb2xsYXBzaW5nID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgc2V0IGRpc3BsYXkodmFsdWU6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5pc0FuaW1hdGVkKSB7XG4gICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZSh0aGlzLl9lbC5uYXRpdmVFbGVtZW50LCAnZGlzcGxheScsIHZhbHVlKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2Rpc3BsYXkgPSB2YWx1ZTtcblxuICAgIGlmICh2YWx1ZSA9PT0gJ25vbmUnKSB7XG4gICAgICB0aGlzLmhpZGUoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2hvdygpO1xuICB9XG4gIC8qKiB0dXJuIG9uL29mZiBhbmltYXRpb24gKi9cbiAgQElucHV0KCkgaXNBbmltYXRlZCA9IGZhbHNlO1xuICAvKiogQSBmbGFnIGluZGljYXRpbmcgdmlzaWJpbGl0eSBvZiBjb250ZW50IChzaG93biBvciBoaWRkZW4pICovXG4gIEBJbnB1dCgpXG4gIHNldCBjb2xsYXBzZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy5fcGxheWVyIHx8IHRoaXMuX2lzQW5pbWF0aW9uRG9uZSkge1xuICAgICAgdGhpcy5pc0V4cGFuZGVkID0gdmFsdWU7XG4gICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBjb2xsYXBzZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0V4cGFuZGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGlzcGxheSA9ICdibG9jayc7XG4gIHByaXZhdGUgX2ZhY3RvcnlDb2xsYXBzZUFuaW1hdGlvbjogQW5pbWF0aW9uRmFjdG9yeTtcbiAgcHJpdmF0ZSBfZmFjdG9yeUV4cGFuZEFuaW1hdGlvbjogQW5pbWF0aW9uRmFjdG9yeTtcbiAgcHJpdmF0ZSBfaXNBbmltYXRpb25Eb25lOiBib29sZWFuO1xuICBwcml2YXRlIF9wbGF5ZXI6IEFuaW1hdGlvblBsYXllcjtcbiAgcHJpdmF0ZSBfc3R5bGVzTG9hZGVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfQ09MTEFQU0VfQUNUSU9OX05BTUUgPSAnY29sbGFwc2UnO1xuICBwcml2YXRlIF9FWFBBTkRfQUNUSU9OX05BTUUgPSAnZXhwYW5kJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9lbDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIF9idWlsZGVyOiBBbmltYXRpb25CdWlsZGVyXG4gICkge1xuICAgIHRoaXMuX2ZhY3RvcnlDb2xsYXBzZUFuaW1hdGlvbiA9IF9idWlsZGVyLmJ1aWxkKGNvbGxhcHNlQW5pbWF0aW9uKTtcbiAgICB0aGlzLl9mYWN0b3J5RXhwYW5kQW5pbWF0aW9uID0gX2J1aWxkZXIuYnVpbGQoZXhwYW5kQW5pbWF0aW9uKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpOiB2b2lkIHtcbiAgICB0aGlzLl9zdHlsZXNMb2FkZWQgPSB0cnVlO1xuXG4gICAgaWYgKCF0aGlzLl9wbGF5ZXIgfHwgIXRoaXMuX2lzQW5pbWF0aW9uRG9uZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3BsYXllci5yZXNldCgpO1xuICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQsICdoZWlnaHQnLCAnKicpO1xuICB9XG5cbiAgLyoqIGFsbG93cyB0byBtYW51YWxseSB0b2dnbGUgY29udGVudCB2aXNpYmlsaXR5ICovXG4gIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0V4cGFuZGVkKSB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaG93KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIGFsbG93cyB0byBtYW51YWxseSBoaWRlIGNvbnRlbnQgKi9cbiAgaGlkZSgpOiB2b2lkIHtcbiAgICB0aGlzLmlzQ29sbGFwc2luZyA9IHRydWU7XG4gICAgdGhpcy5pc0V4cGFuZGVkID0gZmFsc2U7XG4gICAgdGhpcy5pc0NvbGxhcHNlZCA9IHRydWU7XG4gICAgdGhpcy5pc0NvbGxhcHNpbmcgPSBmYWxzZTtcblxuICAgIHRoaXMuY29sbGFwc2VzLmVtaXQodGhpcyk7XG5cbiAgICB0aGlzLl9pc0FuaW1hdGlvbkRvbmUgPSBmYWxzZTtcblxuICAgIHRoaXMuYW5pbWF0aW9uUnVuKHRoaXMuaXNBbmltYXRlZCwgdGhpcy5fQ09MTEFQU0VfQUNUSU9OX05BTUUpKCgpID0+IHtcbiAgICAgIHRoaXMuX2lzQW5pbWF0aW9uRG9uZSA9IHRydWU7XG4gICAgICB0aGlzLmNvbGxhcHNlZC5lbWl0KHRoaXMpO1xuICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUodGhpcy5fZWwubmF0aXZlRWxlbWVudCwgJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgIH0pO1xuICB9XG4gIC8qKiBhbGxvd3MgdG8gbWFudWFsbHkgc2hvdyBjb2xsYXBzZWQgY29udGVudCAqL1xuICBzaG93KCk6IHZvaWQge1xuICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQsICdkaXNwbGF5JywgdGhpcy5fZGlzcGxheSk7XG5cbiAgICB0aGlzLmlzQ29sbGFwc2luZyA9IHRydWU7XG4gICAgdGhpcy5pc0V4cGFuZGVkID0gdHJ1ZTtcbiAgICB0aGlzLmlzQ29sbGFwc2VkID0gZmFsc2U7XG4gICAgdGhpcy5pc0NvbGxhcHNpbmcgPSBmYWxzZTtcblxuICAgIHRoaXMuZXhwYW5kcy5lbWl0KHRoaXMpO1xuXG4gICAgdGhpcy5faXNBbmltYXRpb25Eb25lID0gZmFsc2U7XG5cbiAgICB0aGlzLmFuaW1hdGlvblJ1bih0aGlzLmlzQW5pbWF0ZWQsIHRoaXMuX0VYUEFORF9BQ1RJT05fTkFNRSkoKCkgPT4ge1xuICAgICAgdGhpcy5faXNBbmltYXRpb25Eb25lID0gdHJ1ZTtcbiAgICAgIHRoaXMuZXhwYW5kZWQuZW1pdCh0aGlzKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFuaW1hdGlvblJ1bihpc0FuaW1hdGVkOiBib29sZWFuLCBhY3Rpb246IHN0cmluZykge1xuICAgIGlmICghaXNBbmltYXRlZCB8fCAhdGhpcy5fc3R5bGVzTG9hZGVkKSB7XG4gICAgICByZXR1cm4gKGNhbGxiYWNrOiAoKSA9PiB2b2lkKSA9PiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQsICdvdmVyZmxvdycsICdoaWRkZW4nKTtcbiAgICB0aGlzLl9yZW5kZXJlci5hZGRDbGFzcyh0aGlzLl9lbC5uYXRpdmVFbGVtZW50LCAnY29sbGFwc2UnKTtcblxuICAgIGNvbnN0IGZhY3RvcnlBbmltYXRpb24gPSAoYWN0aW9uID09PSB0aGlzLl9FWFBBTkRfQUNUSU9OX05BTUUpXG4gICAgICA/IHRoaXMuX2ZhY3RvcnlFeHBhbmRBbmltYXRpb25cbiAgICAgIDogdGhpcy5fZmFjdG9yeUNvbGxhcHNlQW5pbWF0aW9uO1xuXG4gICAgaWYgKHRoaXMuX3BsYXllcikge1xuICAgICAgdGhpcy5fcGxheWVyLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wbGF5ZXIgPSBmYWN0b3J5QW5pbWF0aW9uLmNyZWF0ZSh0aGlzLl9lbC5uYXRpdmVFbGVtZW50KTtcbiAgICB0aGlzLl9wbGF5ZXIucGxheSgpO1xuXG4gICAgcmV0dXJuIChjYWxsYmFjazogKCkgPT4gdm9pZCkgPT4gdGhpcy5fcGxheWVyLm9uRG9uZShjYWxsYmFjayk7XG4gIH1cbn1cbiJdfQ==