fantasy-ngzorro 2.1.21 → 2.1.22

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 (38) hide show
  1. package/bundles/fantasy-ngzorro.umd.js +15 -15
  2. package/bundles/fantasy-ngzorro.umd.js.map +1 -1
  3. package/bundles/fantasy-ngzorro.umd.min.js +2 -2
  4. package/bundles/fantasy-ngzorro.umd.min.js.map +1 -1
  5. package/esm2015/hd-button/hd-button.component.js +1 -1
  6. package/esm2015/hd-button-group/hd-button-group.component.js +1 -1
  7. package/esm2015/hd-current-table/hd-current-table.component.js +1 -1
  8. package/esm2015/hd-detail-form/hd-detail-form.component.js +1 -1
  9. package/esm2015/hd-detail-lines/hd-detail-lines.component.js +1 -1
  10. package/esm2015/hd-detail-lines-page/hd-detail-lines-page.component.js +1 -1
  11. package/esm2015/hd-detail-tip/hd-detail-tip.component.js +1 -1
  12. package/esm2015/hd-filter/hd-filter.component.js +1 -1
  13. package/esm2015/hd-form/hd-form.component.js +1 -1
  14. package/esm2015/hd-form-lines/hd-form-lines.component.js +3 -3
  15. package/esm2015/hd-popconfirm/hd-popconfirm.component.js +1 -1
  16. package/esm2015/hd-status/hd-status.component.js +1 -1
  17. package/esm2015/hd-table/hd-table.component.js +1 -1
  18. package/esm2015/hd-tip/hd-tip.component.js +1 -1
  19. package/esm5/hd-button/hd-button.component.js +1 -1
  20. package/esm5/hd-button-group/hd-button-group.component.js +1 -1
  21. package/esm5/hd-current-table/hd-current-table.component.js +1 -1
  22. package/esm5/hd-detail-form/hd-detail-form.component.js +1 -1
  23. package/esm5/hd-detail-lines/hd-detail-lines.component.js +1 -1
  24. package/esm5/hd-detail-lines-page/hd-detail-lines-page.component.js +1 -1
  25. package/esm5/hd-detail-tip/hd-detail-tip.component.js +1 -1
  26. package/esm5/hd-filter/hd-filter.component.js +1 -1
  27. package/esm5/hd-form/hd-form.component.js +1 -1
  28. package/esm5/hd-form-lines/hd-form-lines.component.js +3 -3
  29. package/esm5/hd-popconfirm/hd-popconfirm.component.js +1 -1
  30. package/esm5/hd-status/hd-status.component.js +1 -1
  31. package/esm5/hd-table/hd-table.component.js +1 -1
  32. package/esm5/hd-tip/hd-tip.component.js +1 -1
  33. package/fantasy-ngzorro.metadata.json +1 -1
  34. package/fesm2015/fantasy-ngzorro.js +15 -15
  35. package/fesm2015/fantasy-ngzorro.js.map +1 -1
  36. package/fesm5/fantasy-ngzorro.js +15 -15
  37. package/fesm5/fantasy-ngzorro.js.map +1 -1
  38. package/package.json +1 -1
@@ -2573,8 +2573,8 @@ var HdFormLinesComponent = /** @class */ (function () {
2573
2573
  HdFormLinesComponent.decorators = [
2574
2574
  { type: Component, args: [{
2575
2575
  selector: "hd-form-lines",
2576
- template: "<ng-container *ngIf=\"showForm && showToolbar\">\n <hd-button-group class=\"hd-formLines-toolbar\">\n <ng-template #buttonGroupLeft>\n <!-- \u6709\u5168\u5C40\u641C\u7D22\uFF1A\u5DE6\u4FA7\u653E\u641C\u7D22\u6846 -->\n <ng-container *ngIf=\"showSearch\">\n <nz-input-group [nzSuffix]=\"suffixIconSearch\">\n <input type=\"text\" nz-input (keyup.enter)=\"searchLines()\" placeholder=\"\u8BF7\u8F93\u5165\u5185\u5BB9\u641C\u7D22\" style=\"width: 300px;\"\n [(ngModel)]=\"filterStr\" />\n </nz-input-group>\n <ng-template #suffixIconSearch>\n <i nz-icon nzType=\"search\" (click)=\"searchLines()\"></i>\n </ng-template>\n </ng-container>\n <!-- \u65E0\u5168\u5C40\u641C\u7D22\uFF1A\u5DE6\u4FA7\u653E\u81EA\u5B9A\u4E49\u6309\u94AE -->\n <ng-container *ngIf=\"!showSearch\">\n <ng-container *ngTemplateOutlet=\"formLinesLeftButton\"></ng-container>\n </ng-container>\n </ng-template>\n <ng-template #buttonGroupRight>\n <!-- \u6709\u5168\u5C40\u641C\u7D22\uFF1A\u53F3\u4FA7\u8303\u56F4\u518D\u5DE6\u53F3\u5206\u5F00 -->\n <div class=\"hd-formLines-toolbar-right\" *ngIf=\"showSearch\">\n <div class=\"hd-formLines-toolbar-right-left\">\n <ng-container *ngTemplateOutlet=\"formLinesLeftButton\"></ng-container>\n </div>\n <div class=\"hd-formLines-toolbar-right-right\">\n <ng-container *ngTemplateOutlet=\"formLinesRightButton\"></ng-container>\n </div>\n </div>\n <!-- \u65E0\u5168\u5C40\u641C\u7D22\uFF1A\u53F3\u4FA7\u53EA\u653E\u81EA\u5B9A\u4E49\u53F3\u4FA7\u6309\u94AE -->\n <ng-container *ngIf=\"!showSearch\">\n <ng-container *ngTemplateOutlet=\"formLinesRightButton\"></ng-container>\n </ng-container>\n </ng-template>\n </hd-button-group>\n <hd-space background=\"transparent\" type=\"row\" size=\"12\"></hd-space>\n</ng-container>\n\n<!-- \u52FE\u9009\u63D0\u793A\uFF1A\u5355\u72EC\u4E00\u884C\uFF0C\u653E\u5728\u8868\u5355\u4E0A\u65B9 -->\n<ng-container *ngIf=\"showForm && showCheckbox && getSelectedCount() > 0\">\n <nz-alert nzType=\"info\" [nzMessage]=\"selectionAlertTemplate\" nzShowIcon></nz-alert>\n <hd-space background=\"transparent\" type=\"row\" size=\"12\"></hd-space>\n</ng-container>\n<ng-template #selectionAlertTemplate>\n <span>\u5DF2\u9009\u62E9{{ getSelectedCount() }}\u6761\u6570\u636E</span>&nbsp;&nbsp;\n <span class=\"common-btn-group\">\n <a (click)=\"clearSelection()\">\u6E05\u7A7A</a>\n </span>\n</ng-template>\n\n<!-- <hd-button type=\"primary\" (clickAction)=\"focusDom(0, 0)\">\u805A\u7126\u7B2C\u4E00\u4E2A</hd-button> -->\n\n<form *ngIf=\"showForm\" nz-form [formGroup]=\"validateHdFormLines\" class=\"ant-advanced-search-form hd-formLines-container\"\n (keydown)=\"onKeyDown($event)\">\n <nz-table nzTemplateMode [nzFrontPagination]=\"false\" [nzLoading]=\"tableLoading\" [nzScroll]=\"scroll\"\n [nzPageSizeOptions]=\"[ 10, 50, 100, 200, 500, 1000 ]\">\n <thead>\n <tr>\n <th nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showCheckbox\">\n <label nz-checkbox\n [ngModel]=\"isAllChecked()\"\n [nzIndeterminate]=\"isIndeterminate()\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"onAllChecked($event)\"></label>\n </th>\n <th nzWidth=\"58px\" [nzLeft]=\"lineNumberLeft\" *ngIf=\"showLineNumber\">\u5E8F\u53F7</th>\n <ng-container *ngFor=\"let item of formLines\">\n <th *ngIf=\"!item.hide\" [nzAlign]=\"item.align ? item.align : 'left'\">\n <span *ngIf=\"item.require\" style=\"color: red;\">*</span>{{ item.label }}\n </th>\n </ng-container>\n <th [style.width.px]=\"operateColWidth\" nzRight=\"0\">\u64CD\u4F5C</th>\n </tr>\n </thead>\n <tbody>\n <ng-container\n *ngFor=\"let line of linesFormArray.controls.slice((paginationPageIndex - 1) * paginationPageSize, (paginationPageIndex - 1) * paginationPageSize + paginationPageSize);index as dataIndex\"\n formArrayName=\"lines\">\n <tr [formGroup]=\"line\">\n <td nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showCheckbox\">\n <label nz-checkbox\n [ngModel]=\"isLineChecked(line)\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"onLineCheckedChange(line, $event)\"></label>\n </td>\n <td nzWidth=\"58px\" [nzLeft]=\"lineNumberLeft\" *ngIf=\"showLineNumber\">\n {{ line.get('lineIndex').value }}\n </td>\n <ng-container *ngFor=\"let formItem of formLines; index as innerIndex\">\n <td *ngIf=\"!formItem.hide\" [nzAlign]=\"formItem.align ? formItem.align : 'left'\">\n <nz-form-item>\n <nz-form-control\n [nzValidateStatus]=\"getControlValidateStatus(line, formItem)\"\n [nzErrorTip]=\"formItem.label + '\u4E0D\u80FD\u4E3A\u7A7A'\">\n <ng-container [ngSwitch]=\"formItem.type\">\n <ng-container *ngSwitchCase=\"'Input'\">\n <nz-input-group [nzSuffix]=\"inputCleanTemplate\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\">\n <input #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [ngStyle]=\"getStyle(line, formItem, '100px')\" nz-input\n [ngStyle]=\"{'color': formItem?.colorOption?.name ? line.get(formItem.colorOption.name ).value : null}\"\n [id]=\"'input-' + formItem.name + line.get('lineIndex').value\"\n (click)=\"formItem.isSelect ? selectValue('#input-' + formItem.name + line.get('lineIndex').value, dataIndex , innerIndex) : null\"\n (input)=\"limitInputLength($event, line, formItem)\"\n [placeholder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n [formControlName]=\"formItem.name\" />\n </nz-input-group>\n <ng-template #inputCleanTemplate>\n <i nz-icon nz-tooltip class=\"ant-input-clear-icon\" nzTheme=\"fill\" nzType=\"close-circle\"\n *ngIf=\"line.get(formItem.name).value && !line.get(formItem.name).disabled\"\n (click)=\"inputClean(formItem ,line)\"></i>\n </ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Select'\">\n <nz-select #formInputDom (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n nzDropdownClassName=\"hd-select-table\"\n *ngIf=\"formItem.selectOption.tableColumns;else nomarlSelectTemplate\"\n [nzShowSearch]=\"formItem.selectOption.hdShowSearch != null ? formItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"formItem.selectOption.hdAllowClear != null ? formItem.selectOption.hdAllowClear : true\"\n [nzServerSearch]=\"formItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"formItem.selectOption.hdDropdownMatchSelectWidth ? formItem.selectOption.hdDropdownMatchSelectWidth : false\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\"\n (nzOpenChange)=\"onOpenChangeEvent(formItem.onOpenChangeEvent || null, $event, line, formItem.onOpenChangeEventDebounceTime)\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, line, formItem.onSearchEventEventDebounceTime)\"\n [ngStyle]=\"getStyle(line, formItem, '200px')\">\n <div class=\"hd-select-empty\"\n *ngIf=\"!(formItem.selectOption?.selectList?.length > 0 || line.get(formItem.selectOption.selectListName)?.value?.length > 0)\">\n <img\n src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI0MXB4IiB2aWV3Qm94PSIwIDAgNjQgNDEiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjUgKDY3NDY5KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDxnIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00NzIuMDAwMDAwLCAtMTMzNS4wMDAwMDApIj4KICAgICAgICAgICAgPGcgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDY0LjAwMDAwMCwgMTExNC4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxnICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0MC4wMDAwMDAsIDc4LjAwMDAwMCkiPgogICAgICAgICAgICAgICAgICAgIDxnICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzNjguMDAwMDAwLCAxNDQuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxnID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlICBmaWxsPSIjRjVGNUY1IiBjeD0iMzIiIGN5PSIzMyIgcng9IjMyIiByeT0iNyI+PC9lbGxpcHNlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg5LjAwMDAwMCwgMC4wMDAwMDApIiBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0iI0Q5RDlEOSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTQ2LDEyLjc2MDU2MDQgTDM1Ljg1NDMwNDcsMS4yNTczOTYzMyBDMzUuMzY3NDQxNCwwLjQ3MzgyNjYwNSAzNC42NTU4Nzg5LDAgMzMuOTA2NzYxNywwIEwxMi4wOTMyMzgzLDAgQzExLjM0NDEyMTEsMCAxMC42MzI1NTg2LDAuNDczOTUwMjU1IDEwLjE0NTY5NTMsMS4yNTczOTYzMyBMMi42MTQ3OTcyN2UtMTIsMTIuNzYwNTYwNCBMMCwyMiBMNDYsMjIgTDQ2LDEyLjc2MDU2MDQgWiIgID48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTMyLjYxMzI4MTMsMTUuOTMxNSBDMzIuNjEzMjgxMywxNC4zMjU4NTExIDMzLjYwNjk1MzEsMTMuMDAwMjM0IDM0LjgzOTY5OTIsMTMgTDQ2LDEzIEw0NiwzMS4xMzcxMjc3IEM0NiwzMy4yNTg5NTc0IDQ0LjY3OTM4NjcsMzUgNDMuMDUwNDI5NywzNSBMMi45NDk1NzAzMSwzNSBDMS4zMjA1MjM0NCwzNSAwLDMzLjI1ODg0MDQgMCwzMS4xMzcxMjc3IEwwLDEzIEwxMS4xNjAzMDA4LDEzIEMxMi4zOTMwNDY5LDEzIDEzLjM4NjcxODgsMTQuMzIyODA4NSAxMy4zODY3MTg4LDE1LjkyODQ1NzQgTDEzLjM4NjcxODgsMTUuOTQ5NjM4MyBDMTMuMzg2NzE4OCwxNy41NTUyODcyIDE0LjM5MTcxMDksMTguODUxMTgwOSAxNS42MjQ0NTcsMTguODUxMTgwOSBMMzAuMzc1NTQzLDE4Ljg1MTE4MDkgQzMxLjYwODI4OTEsMTguODUxMTgwOSAzMi42MTMyODEzLDE3LjU0MzM1MTEgMzIuNjEzMjgxMywxNS45Mzc3MDIxIEwzMi42MTMyODEzLDE1LjkzMTUgWiIgIGZpbGw9IiNGQUZBRkEiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+\"\n alt=\"empty\">\n <p class=\"ant-empty-description\">\u6682\u65E0\u6570\u636E</p>\n </div>\n\n <nz-option nzCustomContent\n *ngFor=\"let selectItem of (formItem.selectOption.selectList || line.get(formItem.selectOption.selectListName).value)\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\">\n <div class=\"hd-option-line\">\n <div *ngFor=\"let selectOptionTableColumn of formItem.selectOption.tableColumns\"\n [ngStyle]=\"getSelectTableColumnStyle(selectOptionTableColumn)\">\n <ng-container *ngIf=\"selectOptionTableColumn.icons;else notPictureTemplate\">\n <div class=\"hd-option-icons\">\n <ng-container *ngFor=\"let icon of selectOptionTableColumn.icons\">\n <img *ngIf=\"icon.iconName === 'hd-recommend-star' && selectItem[icon.fieldName]\"\n src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAVpJREFUOE+l07FLQkEcB/Dv7713Zg1GQ0SgW9AmTYVp1BRUokZBEI1u/QVBUBD1D0Rt0dQaPYmotXza1tKQzQ1Fk0iDHr5vPEOTUpO88e77+9zvjjtBh8HTOb8e0hu0eN8Xzz22ikonoGzHdgXcAVB16S75U/mbn/m2AK+mglqbBUAGvCIRuVCJ7HLXQCUTPQOxXi8Q4FolnYWuAH0+HaEpjrdxAyC3VSq33xKgPTWiYYUai8IjUCabw4Zw1XWNF2+OZrXoi+cLImBth4odfQAw0elCW6zdKvU2/wVkYs8ggzBlRqrcI/DrrK1wQ7DWAIToV8lsqGxHDwTY6qYbA1jpCVAux3oBSirhDPYCOL6kE/s/QB77UrnNJoDDVkCN6pI+BJH+6xINQdpKOCf1d/AEYBxgUUQC5PcLbPMDXy1lhGXx7r0G6ExklpBwI0xh2w7ID+UzL71iL/MJdzuZdDL/kXcAAAAASUVORK5CYII=\"\n style=\"width: 16px;height: 16px;\">\n <img *ngIf=\"icon.iconName === 'hd-img-star' && selectItem[icon.fieldName]\"\n src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAyhJREFUWEe1ll1o1XYYxp8nPUmUihdCV3bAirvYzUC80Xpy3KwTZNR2CdOhDkTBwe6G32XzwqpjE3Qt4pUKZQqDyQZNTp1uY8yCJG0F2d2+LlWOOkShovQkaV45lcJpTdOTHJubBPI+z/Pj//H+/0TGR66uf8sPoz8A/Kstkp38YORxFitmEVU1vm1cBPlp9ZuQXtX0jmfxygQgvxSWBRWlDECvhgrwQFuqLufG4TAtRCaAwCl+IcDXtWEi2KFb7pUFBxCBEpSMMsDWGWEiNzXLe2/BASp2cTuJH+KCRMJ3dGvsrzQQqafAtw0XpBEfIhc00/tswQD8QWM1FP45d4A8V9XJN9k5Nl4vRKoR8G3jMshdyebRPs0cOftaAaRUbAsRrRRRhuczFsF/lPATNQrL3Hr7/nz1lGvvtkwGUSEC8gLkWfMGkAfQMp9J0n8ByhS5J+QDVr+BshBlUu6q3d5v9G3jIcg3GgnJqp2C853iCIB1WU0a1F2iOO2tPnK3CLQ1aJZKLpCfddPrmtoF8uuqZn9iyfcEzVQumYtlQDO9vS8PsprHd4xvAR7I7FuHUIBvdNP9crr0lT7g24U+UNlfh1f6Esrn2ofeuVphbCPyneJuAN+lT0jokZCduum9cobM2Qn9krEGEa6+hi36jEC3aro34vASW3FoG9si8sdGRoKCY6rlnpjLIxGgYhunSPY0AiAiP+mW93EmAN8ujoJobwgAuKOb7orUAHKjY1EwHjwFkGsEoKpVJ6WVH3n/p1oDwVBhk0TK742GV/UKYOZMt5QKoGIbX5E8mgwg4wCbADQn1c1uPvP2gWqB7xjDADck7OwBVan0QFFyQaj2A9wxV60A13XT7Uw1Ar5TlDiBQP6hRHs0a3Ss9n8wuK4jYtN5Em/H6B5ppht7r4jvhEOFtYiUGQEAnhDoV033ZNJwB45xRAS9IBfX1qnhRD7uhhQLENiFQ0Ll9LSBCM7olnu43gUpTjEfiPSB3D6tUQRbcpZ7bbZHLEBYKnRFogxV505rmjzIrtG/6w2fMS0l430RHAVoULBZtdybdQFkCcuqSXUtzxqSpHsBfmUdgJhaiDQAAAAASUVORK5CYII=\"\n style=\"width: 16px;height: 16px;\">\n <span *ngIf=\"icon.iconName === 'hd-select-close' && selectItem[icon.fieldName]\"\n class=\"hd-select-close\">\n \u7981\u7528\n </span>\n <span *ngIf=\"icon.iconName === 'hd-select-purchase' && selectItem[icon.fieldName]\"\n class=\"hd-select-purchase\">\n \u534F\n </span>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #notPictureTemplate>\n <ng-container\n *ngIf=\"!isTextOverflow(selectOptionTableColumn.render ? selectOptionTableColumn.render(selectItem) : selectItem[selectOptionTableColumn.name], selectOptionTableColumn.width);else overflowTemplate\">\n <div>{{\n judgeColEmpty(selectOptionTableColumn.render ?\n selectOptionTableColumn.render(selectItem) :\n selectItem[selectOptionTableColumn.name])\n }}\n </div>\n </ng-container>\n <ng-template #overflowTemplate>\n <div class=\"hd-option-overflow\" nz-tooltip\n [nzTooltipTitle]=\"selectOptionTableColumn.render ? selectOptionTableColumn.render(selectItem) : selectItem[selectOptionTableColumn.name]\">\n {{\n judgeColEmpty(selectOptionTableColumn.render ?\n selectOptionTableColumn.render(selectItem) :\n selectItem[selectOptionTableColumn.name])\n }}\n </div>\n </ng-template>\n </ng-template>\n </div>\n </div>\n </nz-option>\n <nz-option\n *ngIf=\"formItem.selectOption.label && line.get(formItem.name) && line.get(formItem.selectOption.label)?.value && line.get(formItem.selectOption.value)?.value\"\n [nzLabel]=\"(formItem.selectOption.value === 'code' || formItem.selectOption.value === 'productCode' || formItem.selectOption.hdShowItemCode) ? ('['+ line.get(formItem.selectOption.value).value + ']' + line.get(formItem.selectOption.label).value) : line.get(formItem.selectOption.label).value\"\n [nzValue]=\"line.get(formItem.selectOption.value).value\" nzHide></nz-option>\n </nz-select>\n <ng-template #nomarlSelectTemplate>\n <nz-select #formInputDom (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [nzShowSearch]=\"formItem.selectOption.hdShowSearch != null ? formItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"formItem.selectOption.hdAllowClear != null ? formItem.selectOption.hdAllowClear : true\"\n [nzServerSearch]=\"formItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"formItem.selectOption.hdDropdownMatchSelectWidth ? formItem.selectOption.hdDropdownMatchSelectWidth : false\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\"\n (nzOpenChange)=\"onOpenChangeEvent(formItem.onOpenChangeEvent || null, $event, line, formItem.onOpenChangeEventDebounceTime)\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, line, formItem.onSearchEventEventDebounceTime)\"\n [ngStyle]=\"getStyle(line, formItem, '200px')\">\n <nz-option\n *ngFor=\"let selectItem of (formItem.selectOption.selectList || line.get(formItem.selectOption.selectListName).value)\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\">\n </nz-option>\n <nz-option\n *ngIf=\"formItem.selectOption.label && line.get(formItem.name) && line.get(formItem.selectOption.label)?.value && line.get(formItem.selectOption.value)?.value\"\n [nzLabel]=\"(formItem.selectOption.value === 'code' || formItem.selectOption.value === 'productCode' || formItem.selectOption.hdShowItemCode) ? ('['+ line.get(formItem.selectOption.value).value + ']' + line.get(formItem.selectOption.label).value) : line.get(formItem.selectOption.label).value\"\n [nzValue]=\"line.get(formItem.selectOption.value).value\" nzHide></nz-option>\n </nz-select>\n </ng-template>\n\n </ng-container>\n <ng-container *ngSwitchCase=\"'Date'\">\n <nz-date-picker #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\" *ngIf=\"formItem.showTime\"\n [ngStyle]=\"getStyle(line, formItem, '150px')\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\" [nzDisabledDate]=\"formItem.hdDisabledDate\"\n [nzShowToday]=\"formItem.hdShowToday !== false\" nzShowTime\n nzFormat=\"yyyy-MM-dd HH:mm:ss\">\n </nz-date-picker>\n <nz-date-picker #formInputDom *ngIf=\"!formItem.showTime\"\n [ngStyle]=\"getStyle(line, formItem, '150px')\"\n (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\" [nzDisabledDate]=\"formItem.hdDisabledDate\"\n [nzShowToday]=\"formItem.hdShowToday !== false\">\n </nz-date-picker>\n <div *ngIf=\"formItem?.explainOptionRight?.show\"\n [style.color]=\"formItem?.explainOptionRight?.color ? formItem.explainOptionRight.color : null\">\n &nbsp;&nbsp;{{ line.get(formItem.explainOptionRight.name).value }}\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'DateRange'\">\n <nz-range-picker #formInputDom [ngStyle]=\"getStyle(line, formItem, '200px')\"\n (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [nzDisabledDate]=\"formItem.hdDisabledDate\" [nzPlaceHolder]=\"['\u5F00\u59CB\u65E5\u671F','\u7ED3\u675F\u65E5\u671F']\"\n [formControlName]=\"formItem.name\">\n </nz-range-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"'TextArea'\">\n <textarea #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [ngStyle]=\"{'color': formItem?.colorOption?.name ? line.get(formItem.colorOption.name).value : null}\"\n [placeholder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n [maxlength]=\"formItem.maxLength || null\" rows=\"4\" nz-input\n [maxlength]=\"formItem.maxLength || null\" [formControlName]=\"formItem.name\"></textarea>\n </ng-container>\n <ng-container *ngSwitchCase=\"'InputNumber'\">\n <div style=\"display: flex;align-items: center;\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\">\n <nz-input-number #formInputDom [ngStyle]=\"getStyle(line, formItem, '100px')\"\n [maxlength]=\"formItem.maxLength || null\" [formControlName]=\"formItem.name\"\n [nzMin]=\"formItem?.inputNumber?.min || 0\" [nzMax]=\"formItem?.inputNumber?.max || 99999999\"\n [nzStep]=\"formItem?.inputNumber?.step || 1\"\n [nzPrecision]=\"formItem?.inputNumber?.precision != null ? formItem.inputNumber.precision : 2\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n [nzId]=\"'inputNumber-' + formItem.name + line.get('lineIndex').value\"\n (click)=\"formItem.isSelect ? selectValue('#inputNumber-' + formItem.name + line.get('lineIndex').value, dataIndex , innerIndex) : setActiveDomInFormLines(dataIndex , innerIndex)\">\n </nz-input-number>\n <div *ngIf=\"formItem?.explainOptionRight?.show\"\n [style.color]=\"formItem?.explainOptionRight?.color ? formItem.explainOptionRight.color : null\">\n &nbsp;&nbsp;{{ line.get(formItem.explainOptionRight.name).value }}\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'MultipleSelect'\">\n <nz-select #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\" nzMode=\"multiple\"\n [nzServerSearch]=\"formItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"formItem.selectOption.hdDropdownMatchSelectWidth ? formItem.selectOption.hdDropdownMatchSelectWidth : false\"\n [nzShowSearch]=\"formItem.selectOption.hdShowSearch != null ? formItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"formItem.selectOption.hdAllowClear != null ? formItem.selectOption.hdAllowClear : true\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\" [ngStyle]=\"getStyle(line, formItem, '200px')\"\n (nzOpenChange)=\"onOpenChangeEvent(formItem.onOpenChangeEvent || null, $event, line, formItem.onOpenChangeEventDebounceTime)\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, line, formItem.onSearchEventEventDebounceTime)\">\n <nz-option *ngFor=\"let selectItem of formItem.selectOption.selectList\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\"></nz-option>\n <ng-container\n *ngIf=\"formItem.selectOption.label && line.get(formItem.name) && line.get(formItem.selectOption.label)?.value && line.get(formItem.selectOption.value)?.value\">\n <nz-option *ngFor=\"let option of line.get(formItem.selectOption.value).value;index as i\"\n [nzLabel]=\"line.get(formItem.selectOption.label).value[i]\" [nzValue]=\"option\" nzHide>\n </nz-option>\n </ng-container>\n </nz-select>\n </ng-container>\n <ng-container *ngSwitchCase=\"'ViewDom'\">\n <span class=\"hd-formLines-viewDom\" *ngIf=\"!formItem?.hideViewDomValue\">\n {{\n (formItem.preserveNumber && line.get(formItem.name).value) ?\n LodashRound(line.get(formItem.name).value,\n formItem.preserveNumber).toFixed(formItem.preserveNumber)\n : line.get(formItem.name).value\n }}\n </span>\n <ng-container\n *ngTemplateOutlet=\"ViewDomRightTemplate;context:{formItem: formItem, formLine: line}\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Switch'\">\n <nz-switch (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [formControlName]=\"formItem.name\"></nz-switch>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Time'\">\n <nz-time-picker #formInputDom [ngStyle]=\"getStyle(line, formItem, '200px')\"\n (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [formControlName]=\"formItem.name\"></nz-time-picker>\n </ng-container>\n </ng-container>\n </nz-form-control>\n </nz-form-item>\n <div *ngIf=\"formItem?.explainOption?.show\"\n [style.color]=\"formItem?.explainOption?.color ? formItem.explainOption.color : null\">\n {{ line.get(formItem.explainOption.name).value }}\n </div>\n </td>\n </ng-container>\n <td [style.width.px]=\"operateColWidth\" nzRight=\"0\">\n <span class=\"common-btn-group\">\n <a *ngIf=\"operateButtons.includes('add')\" (click)=\"addFormLine(line)\">\u6DFB\u52A0</a>\n <a *ngIf=\"operateButtons.includes('copy')\" (click)=\"copyFormLine(line)\">\u590D\u5236</a>\n <a class=\"common-danger-btn\" *ngIf=\"operateButtons.includes('delete') && !showDeleteConfirm\"\n (click)=\"deleteFormLine(line)\">\u5220\u9664</a>\n <a class=\"common-danger-btn\" *ngIf=\"operateButtons.includes('delete') && showDeleteConfirm\" nz-popconfirm\n nzPopconfirmTitle=\"\u786E\u8BA4\u8981\u5220\u9664\u8BE5\u884C\u5417?\" nzPopconfirmPlacement=\"bottom\"\n (nzOnConfirm)=\"deleteFormLine(line)\">\u5220\u9664</a>\n </span>\n </td>\n </tr>\n </ng-container>\n <!-- \u5408\u8BA1\u533A\u57DF -->\n <tr *ngIf=\"showTotal\" class=\"hd-table-total\">\n <td *ngIf=\"showCheckbox\"></td>\n <td>\u5408\u8BA1</td>\n <ng-container *ngFor=\"let totalOption of totalOptionList\">\n <td [nzAlign]=\"totalOption.align ? totalOption.align : 'left'\">{{\n (totalOption.value || totalOption.value ===\n 0) ? (((totalOption.value % 1 === 0) && !totalOption.showDecimal) ? totalOption.value :\n LodashRound(totalOption.value, 2).toFixed(2)) : ''\n }}\n </td>\n </ng-container>\n </tr>\n </tbody>\n </nz-table>\n <nz-list\n *ngIf=\"linesFormArray.controls.slice((paginationPageIndex - 1) * paginationPageSize, (paginationPageIndex - 1) * paginationPageSize + paginationPageSize).length === 0\"\n [nzDataSource]=\"[]\"></nz-list>\n <ng-container>\n <hd-space background=\"transparent\" type=\"row\" size=\"16\"></hd-space>\n <div class=\"hd-formLines-pagination\">\n <div class=\"hd-formLines-pagination-left\">\n <div *ngIf=\"showKeyboardOperateTip\">\u652F\u6301\u952E\u76D8\u64CD\u4F5C\uFF0C\u4F7F\u7528\n <i nz-icon nzType=\"up-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <i nz-icon nzType=\"down-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <i nz-icon nzType=\"left-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <i nz-icon nzType=\"right-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <span style=\"font-size: 14px;margin-left: 4px;font-weight: bolder;\">Enter</span>\n \u952E\u5207\u6362\u8868\u5355\u9879\n </div>\n </div>\n <nz-pagination [nzSize]=\"'small'\" style=\"text-align: right;\" [nzPageIndex]=\"paginationPageIndex\"\n [nzPageSize]=\"paginationPageSize\" [nzPageSizeOptions]=\"[10, 20, 30, 40, 50]\"\n [nzTotal]=\"linesFormArray.controls.length\" nzShowSizeChanger (nzPageIndexChange)=\"pageIndexChange($event)\"\n (nzPageSizeChange)=\"pageSizeChange($event)\" [nzShowTotal]=\"totalTemplate\"></nz-pagination>\n <ng-template #totalTemplate let-total>\u5171 {{ linesFormArray.controls.length }} \u6761\u6570\u636E</ng-template>\n </div>\n\n </ng-container>\n</form>\n",
2577
- styles: ["::ng-deep .common-btn-group>a{font-size:14px;font-weight:400;color:#20b95d!important;white-space:nowrap}::ng-deep .common-btn-group .common-danger-btn:hover{color:#f05b24!important}::ng-deep .common-btn-group>a:hover{color:#20bd62!important}::ng-deep .common-btn-group>a:not(:last-child)::after{content:'';margin:0 2px}::ng-deep .common-billNumber>a{color:#3b77e3}button{box-shadow:unset;text-shadow:unset}::ng-deep .ant-form-item-label>label{color:#4b504e;font-size:14px}::ng-deep .ant-input-number-input{height:32px}::ng-deep .ant-input-number{height:32px}textarea.ant-input{height:auto;min-height:32px}::ng-deep .ant-select-selection--multiple{min-height:32px}::ng-deep .ant-select-selection__rendered>ul>li{height:26px!important;margin-top:3px!important;line-height:26px!important}::ng-deep .ant-advanced-search-form .ant-form-item{margin-bottom:0!important}::ng-deep .ant-select-selection--single{height:32px!important}::ng-deep .ant-input{height:32px}::ng-deep .ant-input[disabled]:hover{border-color:#d9d9d9!important}::ng-deep .ant-select-selection__rendered{line-height:32px!important}::ng-deep .ant-calendar-range-picker-input{text-align:left!important}::ng-deep .ant-calendar-picker{width:100%!important}::ng-deep .ant-row{margin-right:0!important;margin-left:0!important}::ng-deep .ant-col-6{padding-left:12px;padding-right:12px}::ng-deep .ant-col-12{padding-left:12px;padding-right:12px}::ng-deep .ant-col-18{padding-left:12px;padding-right:12px}::ng-deep .ant-col-24{padding-left:12px;padding-right:12px}::ng-deep .ant-alert-info{background-color:#f5f8f6;border:1px solid #cfe3d4}:host ::ng-deep th{background:#f5f8f6!important;font-weight:700!important;white-space:nowrap;font-size:14px;font-family:PingFangSC-Medium,PingFang SC;color:#2a3634;padding:8px!important;box-sizing:border-box}:host ::ng-deep td{font-weight:400;font-style:normal;font-size:14px;color:#2a3634;text-align:left;white-space:nowrap;padding:8px!important;box-sizing:border-box}::ng-deep .ant-pagination-options{display:inline-flex;align-items:center}::ng-deep .ant-time-picker{width:100%}.ant-input-number-disabled,.ant-input[disabled],.ant-select-disabled{color:#4b504e}.hd-formLines-toolbar{display:block}.hd-formLines-toolbar ::ng-deep .hd-button-group-right{flex:1;min-width:0;display:flex;justify-content:flex-end}.hd-formLines-toolbar-right{display:flex;align-items:center;justify-content:space-between;width:100%;margin-left:16px}.hd-formLines-toolbar-right-left,.hd-formLines-toolbar-right-right{display:flex;align-items:center}.hd-formLines-container ::ng-deep td{padding:4px 8px!important}.hd-formLines-container .ant-table-tbody>tr>td,.hd-formLines-container ::ng-deep .ant-table-thead>tr>th{padding:16px 8px}.hd-formLines-container ::ng-deep .hd-table-total>td{border:0!important}.hd-formLines-container ::ng-deep .ant-form-item{margin-bottom:0}.hd-formLines-container .ant-input-number{width:100%}.hd-formLines-container .hd-formLines-viewDom{font-size:14px}::ng-deep .hd-select-table .ant-select-dropdown-menu-item-disabled{background:#f5f8f6!important;border-bottom:1px solid #e8e8e8;position:-webkit-sticky;position:sticky;top:0;z-index:10;padding:0}::ng-deep .hd-select-table .ant-select-dropdown-menu-item-disabled:hover{background:#f5f8f6!important}::ng-deep .hd-option-header{display:flex;align-items:center;color:rgba(0,0,0,.85);background:#f5f8f6}::ng-deep .hd-option-header-column{padding:5px 0}.hd-option-line{display:flex;align-items:center}.hd-option-overflow{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.hd-select-empty{display:flex;align-items:center;flex-direction:column;padding:20px 0;background:#fff}::ng-deep .ant-empty-small{background:#fff!important;padding:8px 0;margin:0}.hd-formLines-pagination{display:flex;align-items:center;justify-content:space-between}.hd-formLines-pagination .hd-formLines-pagination-left{margin-left:10px;display:flex;align-items:center}.hd-option-icons{display:flex;align-items:center}.hd-select-close{display:block;height:16px;line-height:14px;text-align:center;padding:0 4px;border:1px solid #f5222d;color:#f5222d;font-size:14px}.hd-select-purchase{display:block;height:16px;line-height:14px;text-align:center;padding:0 4px;border:1px solid #20bd62;color:#20bd62;font-size:14px}"]
2576
+ template: "<ng-container *ngIf=\"showForm && showToolbar\">\n <hd-button-group class=\"hd-formLines-toolbar\">\n <ng-template #buttonGroupLeft>\n <!-- \u6709\u5168\u5C40\u641C\u7D22\uFF1A\u5DE6\u4FA7\u653E\u641C\u7D22\u6846 -->\n <ng-container *ngIf=\"showSearch\">\n <nz-input-group [nzSuffix]=\"suffixIconSearch\">\n <input type=\"text\" nz-input (keyup.enter)=\"searchLines()\" placeholder=\"\u8BF7\u8F93\u5165\u5185\u5BB9\u641C\u7D22\" style=\"width: 300px;\"\n [(ngModel)]=\"filterStr\" />\n </nz-input-group>\n <ng-template #suffixIconSearch>\n <i nz-icon nzType=\"search\" (click)=\"searchLines()\"></i>\n </ng-template>\n </ng-container>\n <!-- \u65E0\u5168\u5C40\u641C\u7D22\uFF1A\u5DE6\u4FA7\u653E\u81EA\u5B9A\u4E49\u6309\u94AE -->\n <ng-container *ngIf=\"!showSearch\">\n <ng-container *ngTemplateOutlet=\"formLinesLeftButton\"></ng-container>\n </ng-container>\n </ng-template>\n <ng-template #buttonGroupRight>\n <!-- \u6709\u5168\u5C40\u641C\u7D22\uFF1A\u53F3\u4FA7\u8303\u56F4\u518D\u5DE6\u53F3\u5206\u5F00 -->\n <div class=\"hd-formLines-toolbar-right\" *ngIf=\"showSearch\">\n <div class=\"hd-formLines-toolbar-right-left\">\n <ng-container *ngTemplateOutlet=\"formLinesLeftButton\"></ng-container>\n </div>\n <div class=\"hd-formLines-toolbar-right-right\">\n <ng-container *ngTemplateOutlet=\"formLinesRightButton\"></ng-container>\n </div>\n </div>\n <!-- \u65E0\u5168\u5C40\u641C\u7D22\uFF1A\u53F3\u4FA7\u53EA\u653E\u81EA\u5B9A\u4E49\u53F3\u4FA7\u6309\u94AE -->\n <ng-container *ngIf=\"!showSearch\">\n <ng-container *ngTemplateOutlet=\"formLinesRightButton\"></ng-container>\n </ng-container>\n </ng-template>\n </hd-button-group>\n <hd-space background=\"transparent\" type=\"row\" size=\"12\"></hd-space>\n</ng-container>\n\n<!-- \u52FE\u9009\u63D0\u793A\uFF1A\u5355\u72EC\u4E00\u884C\uFF0C\u653E\u5728\u8868\u5355\u4E0A\u65B9 -->\n<ng-container *ngIf=\"showForm && showCheckbox && getSelectedCount() > 0\">\n <nz-alert nzType=\"info\" [nzMessage]=\"selectionAlertTemplate\" nzShowIcon></nz-alert>\n <hd-space background=\"transparent\" type=\"row\" size=\"12\"></hd-space>\n</ng-container>\n<ng-template #selectionAlertTemplate>\n <span>\u5DF2\u9009\u62E9{{ getSelectedCount() }}\u6761\u6570\u636E</span>&nbsp;&nbsp;\n <span class=\"common-btn-group\">\n <a (click)=\"clearSelection()\">\u6E05\u7A7A</a>\n </span>\n</ng-template>\n\n<!-- <hd-button type=\"primary\" (clickAction)=\"focusDom(0, 0)\">\u805A\u7126\u7B2C\u4E00\u4E2A</hd-button> -->\n\n<form *ngIf=\"showForm\" nz-form [formGroup]=\"validateHdFormLines\" class=\"ant-advanced-search-form hd-formLines-container\"\n (keydown)=\"onKeyDown($event)\">\n <nz-table nzTemplateMode [nzFrontPagination]=\"false\" [nzLoading]=\"tableLoading\" [nzScroll]=\"scroll\">\n <thead>\n <tr>\n <th nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showCheckbox\">\n <label nz-checkbox\n [ngModel]=\"isAllChecked()\"\n [nzIndeterminate]=\"isIndeterminate()\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"onAllChecked($event)\"></label>\n </th>\n <th nzWidth=\"58px\" [nzLeft]=\"lineNumberLeft\" *ngIf=\"showLineNumber\">\u5E8F\u53F7</th>\n <ng-container *ngFor=\"let item of formLines\">\n <th *ngIf=\"!item.hide\" [nzAlign]=\"item.align ? item.align : 'left'\">\n <span *ngIf=\"item.require\" style=\"color: red;\">*</span>{{ item.label }}\n </th>\n </ng-container>\n <th [style.width.px]=\"operateColWidth\" nzRight=\"0\">\u64CD\u4F5C</th>\n </tr>\n </thead>\n <tbody>\n <ng-container\n *ngFor=\"let line of linesFormArray.controls.slice((paginationPageIndex - 1) * paginationPageSize, (paginationPageIndex - 1) * paginationPageSize + paginationPageSize);index as dataIndex\"\n formArrayName=\"lines\">\n <tr [formGroup]=\"line\">\n <td nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showCheckbox\">\n <label nz-checkbox\n [ngModel]=\"isLineChecked(line)\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"onLineCheckedChange(line, $event)\"></label>\n </td>\n <td nzWidth=\"58px\" [nzLeft]=\"lineNumberLeft\" *ngIf=\"showLineNumber\">\n {{ line.get('lineIndex').value }}\n </td>\n <ng-container *ngFor=\"let formItem of formLines; index as innerIndex\">\n <td *ngIf=\"!formItem.hide\" [nzAlign]=\"formItem.align ? formItem.align : 'left'\">\n <nz-form-item>\n <nz-form-control\n [nzValidateStatus]=\"getControlValidateStatus(line, formItem)\"\n [nzErrorTip]=\"formItem.label + '\u4E0D\u80FD\u4E3A\u7A7A'\">\n <ng-container [ngSwitch]=\"formItem.type\">\n <ng-container *ngSwitchCase=\"'Input'\">\n <nz-input-group [nzSuffix]=\"inputCleanTemplate\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\">\n <input #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [ngStyle]=\"getStyle(line, formItem, '100px')\" nz-input\n [ngStyle]=\"{'color': formItem?.colorOption?.name ? line.get(formItem.colorOption.name ).value : null}\"\n [id]=\"'input-' + formItem.name + line.get('lineIndex').value\"\n (click)=\"formItem.isSelect ? selectValue('#input-' + formItem.name + line.get('lineIndex').value, dataIndex , innerIndex) : null\"\n (input)=\"limitInputLength($event, line, formItem)\"\n [placeholder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n [formControlName]=\"formItem.name\" />\n </nz-input-group>\n <ng-template #inputCleanTemplate>\n <i nz-icon nz-tooltip class=\"ant-input-clear-icon\" nzTheme=\"fill\" nzType=\"close-circle\"\n *ngIf=\"line.get(formItem.name).value && !line.get(formItem.name).disabled\"\n (click)=\"inputClean(formItem ,line)\"></i>\n </ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Select'\">\n <nz-select #formInputDom (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n nzDropdownClassName=\"hd-select-table\"\n *ngIf=\"formItem.selectOption.tableColumns;else nomarlSelectTemplate\"\n [nzShowSearch]=\"formItem.selectOption.hdShowSearch != null ? formItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"formItem.selectOption.hdAllowClear != null ? formItem.selectOption.hdAllowClear : true\"\n [nzServerSearch]=\"formItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"formItem.selectOption.hdDropdownMatchSelectWidth ? formItem.selectOption.hdDropdownMatchSelectWidth : false\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\"\n (nzOpenChange)=\"onOpenChangeEvent(formItem.onOpenChangeEvent || null, $event, line, formItem.onOpenChangeEventDebounceTime)\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, line, formItem.onSearchEventEventDebounceTime)\"\n [ngStyle]=\"getStyle(line, formItem, '200px')\">\n <div class=\"hd-select-empty\"\n *ngIf=\"!(formItem.selectOption?.selectList?.length > 0 || line.get(formItem.selectOption.selectListName)?.value?.length > 0)\">\n <img\n src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI0MXB4IiB2aWV3Qm94PSIwIDAgNjQgNDEiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjUgKDY3NDY5KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDxnIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00NzIuMDAwMDAwLCAtMTMzNS4wMDAwMDApIj4KICAgICAgICAgICAgPGcgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDY0LjAwMDAwMCwgMTExNC4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxnICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0MC4wMDAwMDAsIDc4LjAwMDAwMCkiPgogICAgICAgICAgICAgICAgICAgIDxnICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzNjguMDAwMDAwLCAxNDQuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxnID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlICBmaWxsPSIjRjVGNUY1IiBjeD0iMzIiIGN5PSIzMyIgcng9IjMyIiByeT0iNyI+PC9lbGxpcHNlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg5LjAwMDAwMCwgMC4wMDAwMDApIiBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0iI0Q5RDlEOSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTQ2LDEyLjc2MDU2MDQgTDM1Ljg1NDMwNDcsMS4yNTczOTYzMyBDMzUuMzY3NDQxNCwwLjQ3MzgyNjYwNSAzNC42NTU4Nzg5LDAgMzMuOTA2NzYxNywwIEwxMi4wOTMyMzgzLDAgQzExLjM0NDEyMTEsMCAxMC42MzI1NTg2LDAuNDczOTUwMjU1IDEwLjE0NTY5NTMsMS4yNTczOTYzMyBMMi42MTQ3OTcyN2UtMTIsMTIuNzYwNTYwNCBMMCwyMiBMNDYsMjIgTDQ2LDEyLjc2MDU2MDQgWiIgID48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTMyLjYxMzI4MTMsMTUuOTMxNSBDMzIuNjEzMjgxMywxNC4zMjU4NTExIDMzLjYwNjk1MzEsMTMuMDAwMjM0IDM0LjgzOTY5OTIsMTMgTDQ2LDEzIEw0NiwzMS4xMzcxMjc3IEM0NiwzMy4yNTg5NTc0IDQ0LjY3OTM4NjcsMzUgNDMuMDUwNDI5NywzNSBMMi45NDk1NzAzMSwzNSBDMS4zMjA1MjM0NCwzNSAwLDMzLjI1ODg0MDQgMCwzMS4xMzcxMjc3IEwwLDEzIEwxMS4xNjAzMDA4LDEzIEMxMi4zOTMwNDY5LDEzIDEzLjM4NjcxODgsMTQuMzIyODA4NSAxMy4zODY3MTg4LDE1LjkyODQ1NzQgTDEzLjM4NjcxODgsMTUuOTQ5NjM4MyBDMTMuMzg2NzE4OCwxNy41NTUyODcyIDE0LjM5MTcxMDksMTguODUxMTgwOSAxNS42MjQ0NTcsMTguODUxMTgwOSBMMzAuMzc1NTQzLDE4Ljg1MTE4MDkgQzMxLjYwODI4OTEsMTguODUxMTgwOSAzMi42MTMyODEzLDE3LjU0MzM1MTEgMzIuNjEzMjgxMywxNS45Mzc3MDIxIEwzMi42MTMyODEzLDE1LjkzMTUgWiIgIGZpbGw9IiNGQUZBRkEiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+\"\n alt=\"empty\">\n <p class=\"ant-empty-description\">\u6682\u65E0\u6570\u636E</p>\n </div>\n\n <nz-option nzCustomContent\n *ngFor=\"let selectItem of (formItem.selectOption.selectList || line.get(formItem.selectOption.selectListName).value)\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\">\n <div class=\"hd-option-line\">\n <div *ngFor=\"let selectOptionTableColumn of formItem.selectOption.tableColumns\"\n [ngStyle]=\"getSelectTableColumnStyle(selectOptionTableColumn)\">\n <ng-container *ngIf=\"selectOptionTableColumn.icons;else notPictureTemplate\">\n <div class=\"hd-option-icons\">\n <ng-container *ngFor=\"let icon of selectOptionTableColumn.icons\">\n <img *ngIf=\"icon.iconName === 'hd-recommend-star' && selectItem[icon.fieldName]\"\n src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAVpJREFUOE+l07FLQkEcB/Dv7713Zg1GQ0SgW9AmTYVp1BRUokZBEI1u/QVBUBD1D0Rt0dQaPYmotXza1tKQzQ1Fk0iDHr5vPEOTUpO88e77+9zvjjtBh8HTOb8e0hu0eN8Xzz22ikonoGzHdgXcAVB16S75U/mbn/m2AK+mglqbBUAGvCIRuVCJ7HLXQCUTPQOxXi8Q4FolnYWuAH0+HaEpjrdxAyC3VSq33xKgPTWiYYUai8IjUCabw4Zw1XWNF2+OZrXoi+cLImBth4odfQAw0elCW6zdKvU2/wVkYs8ggzBlRqrcI/DrrK1wQ7DWAIToV8lsqGxHDwTY6qYbA1jpCVAux3oBSirhDPYCOL6kE/s/QB77UrnNJoDDVkCN6pI+BJH+6xINQdpKOCf1d/AEYBxgUUQC5PcLbPMDXy1lhGXx7r0G6ExklpBwI0xh2w7ID+UzL71iL/MJdzuZdDL/kXcAAAAASUVORK5CYII=\"\n style=\"width: 16px;height: 16px;\">\n <img *ngIf=\"icon.iconName === 'hd-img-star' && selectItem[icon.fieldName]\"\n src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAyhJREFUWEe1ll1o1XYYxp8nPUmUihdCV3bAirvYzUC80Xpy3KwTZNR2CdOhDkTBwe6G32XzwqpjE3Qt4pUKZQqDyQZNTp1uY8yCJG0F2d2+LlWOOkShovQkaV45lcJpTdOTHJubBPI+z/Pj//H+/0TGR66uf8sPoz8A/Kstkp38YORxFitmEVU1vm1cBPlp9ZuQXtX0jmfxygQgvxSWBRWlDECvhgrwQFuqLufG4TAtRCaAwCl+IcDXtWEi2KFb7pUFBxCBEpSMMsDWGWEiNzXLe2/BASp2cTuJH+KCRMJ3dGvsrzQQqafAtw0XpBEfIhc00/tswQD8QWM1FP45d4A8V9XJN9k5Nl4vRKoR8G3jMshdyebRPs0cOftaAaRUbAsRrRRRhuczFsF/lPATNQrL3Hr7/nz1lGvvtkwGUSEC8gLkWfMGkAfQMp9J0n8ByhS5J+QDVr+BshBlUu6q3d5v9G3jIcg3GgnJqp2C853iCIB1WU0a1F2iOO2tPnK3CLQ1aJZKLpCfddPrmtoF8uuqZn9iyfcEzVQumYtlQDO9vS8PsprHd4xvAR7I7FuHUIBvdNP9crr0lT7g24U+UNlfh1f6Esrn2ofeuVphbCPyneJuAN+lT0jokZCduum9cobM2Qn9krEGEa6+hi36jEC3aro34vASW3FoG9si8sdGRoKCY6rlnpjLIxGgYhunSPY0AiAiP+mW93EmAN8ujoJobwgAuKOb7orUAHKjY1EwHjwFkGsEoKpVJ6WVH3n/p1oDwVBhk0TK742GV/UKYOZMt5QKoGIbX5E8mgwg4wCbADQn1c1uPvP2gWqB7xjDADck7OwBVan0QFFyQaj2A9wxV60A13XT7Uw1Ar5TlDiBQP6hRHs0a3Ss9n8wuK4jYtN5Em/H6B5ppht7r4jvhEOFtYiUGQEAnhDoV033ZNJwB45xRAS9IBfX1qnhRD7uhhQLENiFQ0Ll9LSBCM7olnu43gUpTjEfiPSB3D6tUQRbcpZ7bbZHLEBYKnRFogxV505rmjzIrtG/6w2fMS0l430RHAVoULBZtdybdQFkCcuqSXUtzxqSpHsBfmUdgJhaiDQAAAAASUVORK5CYII=\"\n style=\"width: 16px;height: 16px;\">\n <span *ngIf=\"icon.iconName === 'hd-select-close' && selectItem[icon.fieldName]\"\n class=\"hd-select-close\">\n \u7981\u7528\n </span>\n <span *ngIf=\"icon.iconName === 'hd-select-purchase' && selectItem[icon.fieldName]\"\n class=\"hd-select-purchase\">\n \u534F\n </span>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #notPictureTemplate>\n <ng-container\n *ngIf=\"!isTextOverflow(selectOptionTableColumn.render ? selectOptionTableColumn.render(selectItem) : selectItem[selectOptionTableColumn.name], selectOptionTableColumn.width);else overflowTemplate\">\n <div>{{\n judgeColEmpty(selectOptionTableColumn.render ?\n selectOptionTableColumn.render(selectItem) :\n selectItem[selectOptionTableColumn.name])\n }}\n </div>\n </ng-container>\n <ng-template #overflowTemplate>\n <div class=\"hd-option-overflow\" nz-tooltip\n [nzTooltipTitle]=\"selectOptionTableColumn.render ? selectOptionTableColumn.render(selectItem) : selectItem[selectOptionTableColumn.name]\">\n {{\n judgeColEmpty(selectOptionTableColumn.render ?\n selectOptionTableColumn.render(selectItem) :\n selectItem[selectOptionTableColumn.name])\n }}\n </div>\n </ng-template>\n </ng-template>\n </div>\n </div>\n </nz-option>\n <nz-option\n *ngIf=\"formItem.selectOption.label && line.get(formItem.name) && line.get(formItem.selectOption.label)?.value && line.get(formItem.selectOption.value)?.value\"\n [nzLabel]=\"(formItem.selectOption.value === 'code' || formItem.selectOption.value === 'productCode' || formItem.selectOption.hdShowItemCode) ? ('['+ line.get(formItem.selectOption.value).value + ']' + line.get(formItem.selectOption.label).value) : line.get(formItem.selectOption.label).value\"\n [nzValue]=\"line.get(formItem.selectOption.value).value\" nzHide></nz-option>\n </nz-select>\n <ng-template #nomarlSelectTemplate>\n <nz-select #formInputDom (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [nzShowSearch]=\"formItem.selectOption.hdShowSearch != null ? formItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"formItem.selectOption.hdAllowClear != null ? formItem.selectOption.hdAllowClear : true\"\n [nzServerSearch]=\"formItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"formItem.selectOption.hdDropdownMatchSelectWidth ? formItem.selectOption.hdDropdownMatchSelectWidth : false\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\"\n (nzOpenChange)=\"onOpenChangeEvent(formItem.onOpenChangeEvent || null, $event, line, formItem.onOpenChangeEventDebounceTime)\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, line, formItem.onSearchEventEventDebounceTime)\"\n [ngStyle]=\"getStyle(line, formItem, '200px')\">\n <nz-option\n *ngFor=\"let selectItem of (formItem.selectOption.selectList || line.get(formItem.selectOption.selectListName).value)\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\">\n </nz-option>\n <nz-option\n *ngIf=\"formItem.selectOption.label && line.get(formItem.name) && line.get(formItem.selectOption.label)?.value && line.get(formItem.selectOption.value)?.value\"\n [nzLabel]=\"(formItem.selectOption.value === 'code' || formItem.selectOption.value === 'productCode' || formItem.selectOption.hdShowItemCode) ? ('['+ line.get(formItem.selectOption.value).value + ']' + line.get(formItem.selectOption.label).value) : line.get(formItem.selectOption.label).value\"\n [nzValue]=\"line.get(formItem.selectOption.value).value\" nzHide></nz-option>\n </nz-select>\n </ng-template>\n\n </ng-container>\n <ng-container *ngSwitchCase=\"'Date'\">\n <nz-date-picker #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\" *ngIf=\"formItem.showTime\"\n [ngStyle]=\"getStyle(line, formItem, '150px')\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\" [nzDisabledDate]=\"formItem.hdDisabledDate\"\n [nzShowToday]=\"formItem.hdShowToday !== false\" nzShowTime\n nzFormat=\"yyyy-MM-dd HH:mm:ss\">\n </nz-date-picker>\n <nz-date-picker #formInputDom *ngIf=\"!formItem.showTime\"\n [ngStyle]=\"getStyle(line, formItem, '150px')\"\n (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\" [nzDisabledDate]=\"formItem.hdDisabledDate\"\n [nzShowToday]=\"formItem.hdShowToday !== false\">\n </nz-date-picker>\n <div *ngIf=\"formItem?.explainOptionRight?.show\"\n [style.color]=\"formItem?.explainOptionRight?.color ? formItem.explainOptionRight.color : null\">\n &nbsp;&nbsp;{{ line.get(formItem.explainOptionRight.name).value }}\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'DateRange'\">\n <nz-range-picker #formInputDom [ngStyle]=\"getStyle(line, formItem, '200px')\"\n (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [nzDisabledDate]=\"formItem.hdDisabledDate\" [nzPlaceHolder]=\"['\u5F00\u59CB\u65E5\u671F','\u7ED3\u675F\u65E5\u671F']\"\n [formControlName]=\"formItem.name\">\n </nz-range-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"'TextArea'\">\n <textarea #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [ngStyle]=\"{'color': formItem?.colorOption?.name ? line.get(formItem.colorOption.name).value : null}\"\n [placeholder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n [maxlength]=\"formItem.maxLength || null\" rows=\"4\" nz-input\n [maxlength]=\"formItem.maxLength || null\" [formControlName]=\"formItem.name\"></textarea>\n </ng-container>\n <ng-container *ngSwitchCase=\"'InputNumber'\">\n <div style=\"display: flex;align-items: center;\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\">\n <nz-input-number #formInputDom [ngStyle]=\"getStyle(line, formItem, '100px')\"\n [maxlength]=\"formItem.maxLength || null\" [formControlName]=\"formItem.name\"\n [nzMin]=\"formItem?.inputNumber?.min || 0\" [nzMax]=\"formItem?.inputNumber?.max || 99999999\"\n [nzStep]=\"formItem?.inputNumber?.step || 1\"\n [nzPrecision]=\"formItem?.inputNumber?.precision != null ? formItem.inputNumber.precision : 2\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n [nzId]=\"'inputNumber-' + formItem.name + line.get('lineIndex').value\"\n (click)=\"formItem.isSelect ? selectValue('#inputNumber-' + formItem.name + line.get('lineIndex').value, dataIndex , innerIndex) : setActiveDomInFormLines(dataIndex , innerIndex)\">\n </nz-input-number>\n <div *ngIf=\"formItem?.explainOptionRight?.show\"\n [style.color]=\"formItem?.explainOptionRight?.color ? formItem.explainOptionRight.color : null\">\n &nbsp;&nbsp;{{ line.get(formItem.explainOptionRight.name).value }}\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'MultipleSelect'\">\n <nz-select #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\" nzMode=\"multiple\"\n [nzServerSearch]=\"formItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"formItem.selectOption.hdDropdownMatchSelectWidth ? formItem.selectOption.hdDropdownMatchSelectWidth : false\"\n [nzShowSearch]=\"formItem.selectOption.hdShowSearch != null ? formItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"formItem.selectOption.hdAllowClear != null ? formItem.selectOption.hdAllowClear : true\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\" [ngStyle]=\"getStyle(line, formItem, '200px')\"\n (nzOpenChange)=\"onOpenChangeEvent(formItem.onOpenChangeEvent || null, $event, line, formItem.onOpenChangeEventDebounceTime)\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, line, formItem.onSearchEventEventDebounceTime)\">\n <nz-option *ngFor=\"let selectItem of formItem.selectOption.selectList\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\"></nz-option>\n <ng-container\n *ngIf=\"formItem.selectOption.label && line.get(formItem.name) && line.get(formItem.selectOption.label)?.value && line.get(formItem.selectOption.value)?.value\">\n <nz-option *ngFor=\"let option of line.get(formItem.selectOption.value).value;index as i\"\n [nzLabel]=\"line.get(formItem.selectOption.label).value[i]\" [nzValue]=\"option\" nzHide>\n </nz-option>\n </ng-container>\n </nz-select>\n </ng-container>\n <ng-container *ngSwitchCase=\"'ViewDom'\">\n <span class=\"hd-formLines-viewDom\" *ngIf=\"!formItem?.hideViewDomValue\">\n {{\n (formItem.preserveNumber && line.get(formItem.name).value) ?\n LodashRound(line.get(formItem.name).value,\n formItem.preserveNumber).toFixed(formItem.preserveNumber)\n : line.get(formItem.name).value\n }}\n </span>\n <ng-container\n *ngTemplateOutlet=\"ViewDomRightTemplate;context:{formItem: formItem, formLine: line}\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Switch'\">\n <nz-switch (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [formControlName]=\"formItem.name\"></nz-switch>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Time'\">\n <nz-time-picker #formInputDom [ngStyle]=\"getStyle(line, formItem, '200px')\"\n (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [formControlName]=\"formItem.name\"></nz-time-picker>\n </ng-container>\n </ng-container>\n </nz-form-control>\n </nz-form-item>\n <div *ngIf=\"formItem?.explainOption?.show\"\n [style.color]=\"formItem?.explainOption?.color ? formItem.explainOption.color : null\">\n {{ line.get(formItem.explainOption.name).value }}\n </div>\n </td>\n </ng-container>\n <td [style.width.px]=\"operateColWidth\" nzRight=\"0\">\n <span class=\"common-btn-group\">\n <a *ngIf=\"operateButtons.includes('add')\" (click)=\"addFormLine(line)\">\u6DFB\u52A0</a>\n <a *ngIf=\"operateButtons.includes('copy')\" (click)=\"copyFormLine(line)\">\u590D\u5236</a>\n <a class=\"common-danger-btn\" *ngIf=\"operateButtons.includes('delete') && !showDeleteConfirm\"\n (click)=\"deleteFormLine(line)\">\u5220\u9664</a>\n <a class=\"common-danger-btn\" *ngIf=\"operateButtons.includes('delete') && showDeleteConfirm\" nz-popconfirm\n nzPopconfirmTitle=\"\u786E\u8BA4\u8981\u5220\u9664\u8BE5\u884C\u5417?\" nzPopconfirmPlacement=\"bottom\"\n (nzOnConfirm)=\"deleteFormLine(line)\">\u5220\u9664</a>\n </span>\n </td>\n </tr>\n </ng-container>\n <!-- \u5408\u8BA1\u533A\u57DF -->\n <tr *ngIf=\"showTotal\" class=\"hd-table-total\">\n <td *ngIf=\"showCheckbox\"></td>\n <td>\u5408\u8BA1</td>\n <ng-container *ngFor=\"let totalOption of totalOptionList\">\n <td [nzAlign]=\"totalOption.align ? totalOption.align : 'left'\">{{\n (totalOption.value || totalOption.value ===\n 0) ? (((totalOption.value % 1 === 0) && !totalOption.showDecimal) ? totalOption.value :\n LodashRound(totalOption.value, 2).toFixed(2)) : ''\n }}\n </td>\n </ng-container>\n </tr>\n </tbody>\n </nz-table>\n <nz-list\n *ngIf=\"linesFormArray.controls.slice((paginationPageIndex - 1) * paginationPageSize, (paginationPageIndex - 1) * paginationPageSize + paginationPageSize).length === 0\"\n [nzDataSource]=\"[]\"></nz-list>\n <ng-container>\n <hd-space background=\"transparent\" type=\"row\" size=\"16\"></hd-space>\n <div class=\"hd-formLines-pagination\">\n <div class=\"hd-formLines-pagination-left\">\n <div *ngIf=\"showKeyboardOperateTip\">\u652F\u6301\u952E\u76D8\u64CD\u4F5C\uFF0C\u4F7F\u7528\n <i nz-icon nzType=\"up-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <i nz-icon nzType=\"down-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <i nz-icon nzType=\"left-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <i nz-icon nzType=\"right-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <span style=\"font-size: 14px;margin-left: 4px;font-weight: bolder;\">Enter</span>\n \u952E\u5207\u6362\u8868\u5355\u9879\n </div>\n </div>\n <nz-pagination [nzSize]=\"'small'\" style=\"text-align: right;\" [nzPageIndex]=\"paginationPageIndex\"\n [nzPageSize]=\"paginationPageSize\" [nzPageSizeOptions]=\"[10, 20, 30, 40, 50]\"\n [nzTotal]=\"linesFormArray.controls.length\" nzShowSizeChanger (nzPageIndexChange)=\"pageIndexChange($event)\"\n (nzPageSizeChange)=\"pageSizeChange($event)\" [nzShowTotal]=\"totalTemplate\"></nz-pagination>\n <ng-template #totalTemplate let-total>\u5171 {{ linesFormArray.controls.length }} \u6761\u6570\u636E</ng-template>\n </div>\n\n </ng-container>\n</form>\n",
2577
+ styles: ["::ng-deep .common-btn-group>a{font-size:14px;font-weight:400;color:#20b95d!important;white-space:nowrap}::ng-deep .common-btn-group .common-danger-btn:hover{color:#f05b24!important}::ng-deep .common-btn-group>a:hover{color:#20bd62!important}::ng-deep .common-btn-group>a:not(:last-child)::after{content:'';margin:0 2px}::ng-deep .common-billNumber>a{color:#3b77e3}button{box-shadow:unset;text-shadow:unset}::ng-deep .ant-form-item-label>label{color:#4b504e;font-size:14px}::ng-deep .ant-input-number-input{height:32px}::ng-deep .ant-input-number{height:32px}textarea.ant-input{height:auto;min-height:32px}::ng-deep .ant-select-selection--multiple{min-height:32px}::ng-deep .ant-select-selection__rendered>ul>li{height:26px!important;margin-top:3px!important;line-height:26px!important}::ng-deep .ant-advanced-search-form .ant-form-item{margin-bottom:0!important}::ng-deep .ant-select-selection--single{height:32px!important}::ng-deep .ant-input{height:32px}::ng-deep .ant-input[disabled]:hover{border-color:#d9d9d9!important}::ng-deep .ant-select-selection__rendered{line-height:32px!important}::ng-deep .ant-calendar-range-picker-input{text-align:left!important}::ng-deep .ant-calendar-picker{width:100%!important}::ng-deep .ant-row{margin-right:0!important;margin-left:0!important}::ng-deep .ant-col-6{padding-left:12px;padding-right:12px}::ng-deep .ant-col-12{padding-left:12px;padding-right:12px}::ng-deep .ant-col-18{padding-left:12px;padding-right:12px}::ng-deep .ant-col-24{padding-left:12px;padding-right:12px}::ng-deep .ant-alert-info{background-color:#f5f8f6;border:1px solid #cfe3d4}:host ::ng-deep th{background:#f5f8f6!important;font-weight:700!important;white-space:nowrap;font-size:14px;font-family:PingFangSC-Medium,PingFang SC;color:#2a3634;padding:8px!important;box-sizing:border-box}:host ::ng-deep td{font-weight:400;font-style:normal;font-size:14px;color:#2a3634;text-align:left;white-space:nowrap;padding:8px!important;box-sizing:border-box}::ng-deep .ant-pagination-options{display:inline-flex;align-items:center}::ng-deep .ant-pagination-options .ant-select,::ng-deep .ant-pagination-options .ant-select-selection--single{min-width:100px}::ng-deep .ant-pagination-options-size-changer.ant-select{min-width:100px}::ng-deep .ant-time-picker{width:100%}.ant-input-number-disabled,.ant-input[disabled],.ant-select-disabled{color:#4b504e}.hd-formLines-toolbar{display:block}.hd-formLines-toolbar ::ng-deep .hd-button-group-right{flex:1;min-width:0;display:flex;justify-content:flex-end}.hd-formLines-toolbar-right{display:flex;align-items:center;justify-content:space-between;width:100%;margin-left:16px}.hd-formLines-toolbar-right-left,.hd-formLines-toolbar-right-right{display:flex;align-items:center}.hd-formLines-container ::ng-deep td{padding:4px 8px!important}.hd-formLines-container .ant-table-tbody>tr>td,.hd-formLines-container ::ng-deep .ant-table-thead>tr>th{padding:16px 8px}.hd-formLines-container ::ng-deep .hd-table-total>td{border:0!important}.hd-formLines-container ::ng-deep .ant-form-item{margin-bottom:0}.hd-formLines-container .ant-input-number{width:100%}.hd-formLines-container .hd-formLines-viewDom{font-size:14px}::ng-deep .hd-select-table .ant-select-dropdown-menu-item-disabled{background:#f5f8f6!important;border-bottom:1px solid #e8e8e8;position:-webkit-sticky;position:sticky;top:0;z-index:10;padding:0}::ng-deep .hd-select-table .ant-select-dropdown-menu-item-disabled:hover{background:#f5f8f6!important}::ng-deep .hd-option-header{display:flex;align-items:center;color:rgba(0,0,0,.85);background:#f5f8f6}::ng-deep .hd-option-header-column{padding:5px 0}.hd-option-line{display:flex;align-items:center}.hd-option-overflow{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.hd-select-empty{display:flex;align-items:center;flex-direction:column;padding:20px 0;background:#fff}::ng-deep .ant-empty-small{background:#fff!important;padding:8px 0;margin:0}.hd-formLines-pagination{display:flex;align-items:center;justify-content:space-between}.hd-formLines-pagination .hd-formLines-pagination-left{margin-left:10px;display:flex;align-items:center}.hd-option-icons{display:flex;align-items:center}.hd-select-close{display:block;height:16px;line-height:14px;text-align:center;padding:0 4px;border:1px solid #f5222d;color:#f5222d;font-size:14px}.hd-select-purchase{display:block;height:16px;line-height:14px;text-align:center;padding:0 4px;border:1px solid #20bd62;color:#20bd62;font-size:14px}"]
2578
2578
  }] }
2579
2579
  ];
2580
2580
  /** @nocollapse */
@@ -2791,4 +2791,4 @@ if (false) {
2791
2791
  */
2792
2792
  HdFormLinesComponent.prototype.cdr;
2793
2793
  }
2794
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGQtZm9ybS1saW5lcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9mYW50YXN5LW5nem9ycm8vIiwic291cmNlcyI6WyJoZC1mb3JtLWxpbmVzL2hkLWZvcm0tbGluZXMuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBRVQsV0FBVyxFQUNYLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWEsV0FBVyxFQUFhLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDL0IsT0FBTyxFQUNMLFlBQVksRUFDWixxQkFBcUIsRUFDckIsc0JBQXNCLEVBQ3RCLHNCQUFzQixFQUN0QixpQkFBaUIsRUFDakIscUJBQXFCLEdBQ3RCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUc5QyxPQUFPLEVBQVksWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7O0lBRzNELHNDQUFzQyxHQUFHLEVBQUU7QUFFakQ7SUF1RkUsOEJBQ1UsRUFBZSxFQUNmLEdBQXNCO1FBRmhDLGlCQWNDO1FBYlMsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBakZQLG1CQUFjLEdBQVksSUFBSSxDQUFDO1FBQy9CLGVBQVUsR0FBWSxJQUFJLENBQUM7UUFDMUMsd0JBQW1CLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMxQiwyQkFBc0IsR0FBWSxLQUFLLENBQUM7UUFDeEMsaUJBQVksR0FBWSxLQUFLLENBQUM7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QUE2Qzs7SUFDN0Msb0RBQ3VDOzs7OztJQUV2QyxtREFDc0M7Ozs7O0lBRXRDLG9EQUN1Qzs7SUFzeUN2QywrQ0FBK0M7Ozs7O0lBdVAvQyw4Q0FBdUQ7Ozs7O0lBMWhEckQsa0NBQXVCOzs7OztJQUN2QixtQ0FBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZHJlbixcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQge1xuICBJbnB1dEJvb2xlYW4sXG4gIE56RGF0ZVBpY2tlckNvbXBvbmVudCxcbiAgTnpJbnB1dE51bWJlckNvbXBvbmVudCxcbiAgTnpSYW5nZVBpY2tlckNvbXBvbmVudCxcbiAgTnpTZWxlY3RDb21wb25lbnQsXG4gIE56VGltZVBpY2tlckNvbXBvbmVudCxcbn0gZnJvbSBcIm5nLXpvcnJvLWFudGRcIjtcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IFRvdGFsT3B0aW9uIH0gZnJvbSBcIi4uL2hkLWRldGFpbC1saW5lcy9oZC1kZXRhaWwtbGluZXMuc2VydmljZVwiO1xuaW1wb3J0IHsgU2VsZWN0T3B0aW9uVGFibGVDb2x1bW4gfSBmcm9tIFwiLi4vbW9kZWwvY29tbW9uLXR5cGVcIjtcbmltcG9ydCB7IEZvcm1MaW5lLCBGb3JtTGluZVR5cGUgfSBmcm9tIFwiLi9oZC1mb3JtLWxpbmVzLnNlcnZpY2VcIjtcblxuLyoqIOS4jiBhbnQtc2VsZWN0IOmAiemhuemhueawtOW5s+WGhei+uei3neS4gOiHtO+8jOeUqOS6juihqOWktOS4jumAiemhueihjOWvuem9kCAqL1xuY29uc3QgU0VMRUNUX1RBQkxFX09QVElPTl9IT1JJWk9OVEFMX1BBRERJTkcgPSAxMjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImhkLWZvcm0tbGluZXNcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9oZC1mb3JtLWxpbmVzLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9oZC1mb3JtLWxpbmVzLmNvbXBvbmVudC5sZXNzXCJdLFxufSlcbmV4cG9ydCBjbGFzcyBIZEZvcm1MaW5lc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZHJlbihcImZvcm1JbnB1dERvbVwiKSBmb3JtSW5wdXREb21MaXN0ITogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBzaG93TGluZU51bWJlcjogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBhbGxvd0VtcHR5OiBib29sZWFuID0gdHJ1ZTtcbiAgQE91dHB1dCgpIGRlbGV0ZUxhc3RMaW5lRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBzaG93S2V5Ym9hcmRPcGVyYXRlVGlwOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSB0YWJsZUxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dTZWFyY2g6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIOaYr+WQpuWxleekuuihjOWLvumAieWIl++8jOeUqOS6juWklumDqOaJuemHj+aTjeS9nOWLvumAieihjCAqL1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgc2hvd0NoZWNrYm94OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGZvcm1MaW5lczogQXJyYXk8Rm9ybUxpbmU+O1xuICAvLyDpkojlr7lmb3JtTGluZXPph4zpnaLmiYDmnInnmoRuYW1l77yMXG4gIEBJbnB1dCgpIGZvcm1MaW5lc0RhdGE6IGFueTtcbiAgQElucHV0KCkgb3BlcmF0ZUJ1dHRvbnM6IEFycmF5PHN0cmluZz4gPSBbXCJhZGRcIiwgXCJkZWxldGVcIl07IC8vIOaTjeS9nOWIl+aMiemSru+8mmFkZCAvIGRlbGV0ZSAvIGNvcHlcbiAgQElucHV0KCkgc2Nyb2xsOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0geyB4OiBcIjFweFwiIH07XG4gIEBPdXRwdXQoKSBjaGFuZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgLyoqIOWLvumAieWPmOWMluaXtuaKm+WHuuW9k+WJjeWLvumAieihjCBGb3JtR3JvdXAg5YiX6KGoICovXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEZvcm1Hcm91cFtdPigpO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgc2hvd0RlbGV0ZUNvbmZpcm06IGJvb2xlYW4gPSBmYWxzZTtcbiAgcGFnaW5hdGlvblBhZ2VJbmRleDogbnVtYmVyID0gMTtcbiAgcGFnaW5hdGlvblBhZ2VTaXplOiBudW1iZXIgPSAxMDtcbiAgdmFsaWRhdGVIZEZvcm1MaW5lczogRm9ybUdyb3VwO1xuICBuZXdMaW5lOiBhbnk7XG4gIGlucHV0VmFsdWU6IHN0cmluZztcblxuICAvLyDlkIjorqHljLrln59cbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dUb3RhbDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB0b3RhbE9wdGlvbjogQXJyYXk8VG90YWxPcHRpb24+ID0gW107XG4gIEBJbnB1dCgpIGNvbHVtbnNOdW1iZXI6IG51bWJlciB8IHN0cmluZyA9IDA7XG4gIHRvdGFsT3B0aW9uTGlzdCA9IFtdO1xuXG4gIHNob3dGb3JtOiBib29sZWFuID0gZmFsc2U7XG4gIGZpbHRlclN0cjogc3RyaW5nO1xuICBzdG9yZUZvcm1MaW5lc0RhdGE6IGFueSA9IFtdOyAvLyDnvJPlrZjnmoTmgLvnmoTooajljZXmlbDmja5cbiAgZmlsdGVyU3RvcmVGb3JtTGluZXNEYXRhOiBhbnkgPSBbXTsgLy8g562b6YCJ5Ye65p2l55qE5pWw5o2u5YiX6KGoXG4gIGZpbHRlckluZGV4U3RvcmU6IEFycmF5PG51bWJlcj4gPSBbXTsgLy8g562b6YCJ5Ye65p2l55qE5pWw5o2u5Zyo5Y6f5aeL5YiX6KGo5Lit55qE5LiL5qCHXG4gIGlzRmlsdGVyRGF0YTogYm9vbGVhbiA9IGZhbHNlOyAvLyDmmK/lkKbmmK/lt7Lnu4/nrZvpgInov4fnmoTmlbDmja5cbiAgZm9ybVZhbGlkOiBib29sZWFuID0gZmFsc2U7IC8vIOihqOWNleW9k+WJjeeahOeKtuaAgVxuICAvKiog5Yu+6YCJ55qE6KGMIGlk77yI6Leo6aG144CB5pCc57Si6YeN5bu65ZCO5LuN5L+d55WZ77yJICovXG4gIHByaXZhdGUgc2VsZWN0ZWRSb3dJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBzZWFyY2hTdWJqZWN0ID0gbmV3IFN1YmplY3Q8eyBmbjogYW55OyBldmVudDogYW55OyBsaW5lOiBhbnkgfT4oKTtcbiAgcHJpdmF0ZSBkZWJvdW5jZVRpbWVvdXQ6IG51bWJlciA9IDA7IC8vIOm7mOiupOmYsuaKluaXtumXtFxuXG4gIHByaXZhdGUgc2VhcmNoU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZm9ybUlucHV0RG9tTGlzdFN1YjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgb3BlbkNoYW5nZVN1YmplY3QgPSBuZXcgU3ViamVjdDx7IGZuOiBhbnk7IGV2ZW50OiBhbnk7IGxpbmU6IGFueSB9PigpO1xuICBwcml2YXRlIG9wZW5DaGFuZ2VEZWJvdW5jZVRpbWVvdXQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgb3BlbkNoYW5nZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuXG4gIC8vIOW9k+WJjemhteeahGRvbeS6jOe7tOaVsOe7hFxuICBjb2xsZWN0RG9tTGlzdDogQXJyYXk8XG4gICAgQXJyYXk8XG4gICAgICB8IEVsZW1lbnRSZWZcbiAgICAgIHwgTnpTZWxlY3RDb21wb25lbnRcbiAgICAgIHwgTnpJbnB1dE51bWJlckNvbXBvbmVudFxuICAgICAgfCBOekRhdGVQaWNrZXJDb21wb25lbnRcbiAgICAgIHwgTnpSYW5nZVBpY2tlckNvbXBvbmVudFxuICAgICAgfCBOelRpbWVQaWNrZXJDb21wb25lbnRcbiAgICA+XG4gID4gPSBbXTtcbiAgLy8g5b2T5YmN6IGa54Sm55qEZG9t5YWD57Sg5Z2Q5qCHXG4gIGFjdGl2ZURvbVg6IG51bWJlciA9IG51bGw7XG4gIGFjdGl2ZURvbVk6IG51bWJlciA9IG51bGw7XG4gIGFjdGl2ZURvbTpcbiAgICB8IEVsZW1lbnRSZWZcbiAgICB8IE56U2VsZWN0Q29tcG9uZW50XG4gICAgfCBOeklucHV0TnVtYmVyQ29tcG9uZW50XG4gICAgfCBOekRhdGVQaWNrZXJDb21wb25lbnRcbiAgICB8IE56UmFuZ2VQaWNrZXJDb21wb25lbnRcbiAgICB8IE56VGltZVBpY2tlckNvbXBvbmVudCA9IG51bGw7XG4gIGFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBAQ29udGVudENoaWxkKFwiVmlld0RvbVJpZ2h0VGVtcGxhdGVcIiwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIFZpZXdEb21SaWdodFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAvKiog5bel5YW35qCP5bem5L6n6Ieq5a6a5LmJ5oyJ6ZKu77yM55So5rOV5ZCMIGhkLXRhYmxlIOeahCB0YWJsZUxlZnRCdXR0b24gKi9cbiAgQENvbnRlbnRDaGlsZChcImZvcm1MaW5lc0xlZnRCdXR0b25cIiwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGZvcm1MaW5lc0xlZnRCdXR0b246IFRlbXBsYXRlUmVmPGFueT47XG4gIC8qKiDlt6XlhbfmoI/lj7Pkvqfoh6rlrprkuYnmjInpkq7vvIznlKjms5XlkIwgaGQtdGFibGUg55qEIHRhYmxlUmlnaHRCdXR0b24gKi9cbiAgQENvbnRlbnRDaGlsZChcImZvcm1MaW5lc1JpZ2h0QnV0dG9uXCIsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBmb3JtTGluZXNSaWdodEJ1dHRvbjogVGVtcGxhdGVSZWY8YW55PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICkge1xuICAgIHRoaXMuc2VhcmNoU3Vic2NyaXB0aW9uID0gdGhpcy5zZWFyY2hTdWJqZWN0XG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUodGhpcy5kZWJvdW5jZVRpbWVvdXQpKVxuICAgICAgLnN1YnNjcmliZSgoeyBmbiwgZXZlbnQsIGxpbmUgfSkgPT4gdGhpcy50cmlnZ2VyRXZlbnQoZm4sIGV2ZW50LCBsaW5lKSk7XG4gICAgdGhpcy5vcGVuQ2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy5vcGVuQ2hhbmdlU3ViamVjdFxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKHRoaXMub3BlbkNoYW5nZURlYm91bmNlVGltZW91dCkpXG4gICAgICAuc3Vic2NyaWJlKCh7IGZuLCBldmVudCwgbGluZSB9KSA9PiB7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgIHRoaXMudHJpZ2dlckV2ZW50KGZuLCBldmVudCwgbGluZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgLy8g57yT5a2Y5LiA5LiL5oC755qE6KGo5Y2V5pWw5o2uXG4gICAgdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEgPSB0aGlzLmZvcm1MaW5lc0RhdGE7XG4gICAgdGhpcy5pbml0KCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5jb2xsZWN0RG9tRGF0YSgpO1xuICAgIHRoaXMuZm9ybUlucHV0RG9tTGlzdFN1YiA9IHRoaXMuZm9ybUlucHV0RG9tTGlzdC5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmNvbGxlY3REb21EYXRhKCk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5zZWFyY2hTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc2VhcmNoU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wZW5DaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMub3BlbkNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5mb3JtSW5wdXREb21MaXN0U3ViKSB7XG4gICAgICB0aGlzLmZvcm1JbnB1dERvbUxpc3RTdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgZm9ybUxpbmVzTGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aDtcbiAgfVxuXG4gIGdldCBvcGVyYXRlQ29sV2lkdGgoKSB7XG4gICAgY29uc3QgY291bnQgPSAodGhpcy5vcGVyYXRlQnV0dG9ucyB8fCBbXSkuZmlsdGVyKChidG4pID0+XG4gICAgICBbXCJhZGRcIiwgXCJjb3B5XCIsIFwiZGVsZXRlXCJdLmluY2x1ZGVzKGJ0biksXG4gICAgKS5sZW5ndGg7XG4gICAgcmV0dXJuIE1hdGgubWF4KGNvdW50ICogNDAsIDgwKTtcbiAgfVxuXG4gIC8qKiBhbGxvd0VtcHR5IOS4lOaTjeS9nOWIl+S7heacieWIoOmZpOaXtu+8muWFgeiuuCAwIOihjO+8jOWIneWni+WMluS4juWIoOiHs+epuumDveS4jeiHquWKqOihpeepuuihjCAqL1xuICBnZXQgaXNUcnVseUVtcHR5QWxsb3dlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBidXR0b25zID0gKHRoaXMub3BlcmF0ZUJ1dHRvbnMgfHwgW10pLmZpbHRlcigoYnRuKSA9PlxuICAgICAgW1wiYWRkXCIsIFwiY29weVwiLCBcImRlbGV0ZVwiXS5pbmNsdWRlcyhidG4pLFxuICAgICk7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuYWxsb3dFbXB0eSAmJlxuICAgICAgYnV0dG9ucy5sZW5ndGggPT09IDEgJiZcbiAgICAgIGJ1dHRvbnNbMF0gPT09IFwiZGVsZXRlXCJcbiAgICApO1xuICB9XG5cbiAgLyoqIOWLvumAieWIl+WbuuWumuaXtu+8jOW6j+WPt+WIl+eahCBsZWZ0IOWBj+enuyAqL1xuICBnZXQgbGluZU51bWJlckxlZnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0NoZWNrYm94ID8gXCI0MHB4XCIgOiBcIjBweFwiO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZVJvd0lkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBoZF9yb3dfJHtEYXRlLm5vdygpfV8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDkpfWA7XG4gIH1cblxuICBwcml2YXRlIGdldFJvd0lkKGxpbmU6IEZvcm1Hcm91cCk6IHN0cmluZyB7XG4gICAgaWYgKCFsaW5lIHx8ICFsaW5lLmdldChcIl9oZFJvd0lkXCIpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGxpbmUuZ2V0KFwiX2hkUm93SWRcIikudmFsdWU7XG4gIH1cblxuICAvKiog5b2T5YmN6aG155qE6KGM77yI55So5LqO6KGo5aS05YWo6YCJ77yM5LuF5L2c55So5LqO5b2T5YmN6aG177yM6Leo6aG15Yu+6YCJ5LuN5L+d55WZ77yJICovXG4gIHByaXZhdGUgZ2V0Q3VycmVudFBhZ2VMaW5lcygpOiBGb3JtR3JvdXBbXSB7XG4gICAgY29uc3Qgc3RhcnQgPSAodGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4IC0gMSkgKiB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZTtcbiAgICBjb25zdCBlbmQgPSBzdGFydCArIHRoaXMucGFnaW5hdGlvblBhZ2VTaXplO1xuICAgIHJldHVybiAodGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scyBhcyBGb3JtR3JvdXBbXSkuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gIH1cblxuICBpc0xpbmVDaGVja2VkKGxpbmU6IEZvcm1Hcm91cCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlkID0gdGhpcy5nZXRSb3dJZChsaW5lKTtcbiAgICByZXR1cm4gISFpZCAmJiB0aGlzLnNlbGVjdGVkUm93SWRzLmhhcyhpZCk7XG4gIH1cblxuICBpc0FsbENoZWNrZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGFnZUxpbmVzID0gdGhpcy5nZXRDdXJyZW50UGFnZUxpbmVzKCk7XG4gICAgcmV0dXJuIChcbiAgICAgIHBhZ2VMaW5lcy5sZW5ndGggPiAwICYmXG4gICAgICBwYWdlTGluZXMuZXZlcnkoKGxpbmUpID0+IHRoaXMuaXNMaW5lQ2hlY2tlZChsaW5lKSlcbiAgICApO1xuICB9XG5cbiAgaXNJbmRldGVybWluYXRlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhZ2VMaW5lcyA9IHRoaXMuZ2V0Q3VycmVudFBhZ2VMaW5lcygpO1xuICAgIGNvbnN0IGNoZWNrZWRDb3VudCA9IHBhZ2VMaW5lcy5maWx0ZXIoKGxpbmUpID0+XG4gICAgICB0aGlzLmlzTGluZUNoZWNrZWQobGluZSksXG4gICAgKS5sZW5ndGg7XG4gICAgcmV0dXJuIGNoZWNrZWRDb3VudCA+IDAgJiYgY2hlY2tlZENvdW50IDwgcGFnZUxpbmVzLmxlbmd0aDtcbiAgfVxuXG4gIG9uQWxsQ2hlY2tlZChjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5nZXRDdXJyZW50UGFnZUxpbmVzKCkuZm9yRWFjaCgobGluZSkgPT4ge1xuICAgICAgY29uc3QgaWQgPSB0aGlzLmdldFJvd0lkKGxpbmUpO1xuICAgICAgaWYgKCFpZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkUm93SWRzLmFkZChpZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlbGVjdGVkUm93SWRzLmRlbGV0ZShpZCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gIH1cblxuICBvbkxpbmVDaGVja2VkQ2hhbmdlKGxpbmU6IEZvcm1Hcm91cCwgY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGlkID0gdGhpcy5nZXRSb3dJZChsaW5lKTtcbiAgICBpZiAoIWlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjaGVja2VkKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUm93SWRzLmFkZChpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dJZHMuZGVsZXRlKGlkKTtcbiAgICB9XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRTZWxlY3Rpb25DaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzLmdldFNlbGVjdGVkTGluZXMoKSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUxpbmVGcm9tU2VsZWN0aW9uKGxpbmU6IEZvcm1Hcm91cCk6IHZvaWQge1xuICAgIGNvbnN0IGlkID0gdGhpcy5nZXRSb3dJZChsaW5lKTtcbiAgICBpZiAoaWQgJiYgdGhpcy5zZWxlY3RlZFJvd0lkcy5oYXMoaWQpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUm93SWRzLmRlbGV0ZShpZCk7XG4gICAgICB0aGlzLmVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5VmFsdWVzVG9MaW5lKFxuICAgIGxpbmU6IEZvcm1Hcm91cCxcbiAgICB2YWx1ZXM6IHsgW2ZpZWxkOiBzdHJpbmddOiBhbnkgfSxcbiAgICBlbWl0RXZlbnQ6IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIE9iamVjdC5rZXlzKHZhbHVlcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBsZXQgY29udHJvbCA9IGxpbmUuZ2V0KGtleSk7XG4gICAgICBpZiAoIWNvbnRyb2wpIHtcbiAgICAgICAgbGluZS5hZGRDb250cm9sKGtleSwgdGhpcy5mYi5jb250cm9sKHZhbHVlc1trZXldKSk7XG4gICAgICAgIGNvbnRyb2wgPSBsaW5lLmdldChrZXkpO1xuICAgICAgfVxuICAgICAgLy8g6Z2Z6buY6LWL5YC877yM6YG/5YWNIHZhbHVlQ2hhbmdlcyAvIERPTSBtYXhsZW5ndGgg5Zue5YaZ5oqK5qCh6aqM5oCB5omT5LmxXG4gICAgICBjb250cm9sLnNldFZhbHVlKHZhbHVlc1trZXldLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICBjb250cm9sLm1hcmtBc1ByaXN0aW5lKHsgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICBjb250cm9sLm1hcmtBc1VudG91Y2hlZCh7IG9ubHlTZWxmOiB0cnVlIH0pO1xuICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIGlmIChlbWl0RXZlbnQpIHtcbiAgICAgICAgY29uc3QgZm9ybUl0ZW0gPSB0aGlzLmZvcm1MaW5lcy5maW5kKChpdGVtKSA9PiBpdGVtLm5hbWUgPT09IGtleSk7XG4gICAgICAgIGlmIChmb3JtSXRlbSAmJiBmb3JtSXRlbS5vbkNoYW5nZUV2ZW50KSB7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoZm9ybUl0ZW0ub25DaGFuZ2VFdmVudCwgdmFsdWVzW2tleV0sIGxpbmUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIOS7heWcqOeUqOaIt+S6pOS6kuWQjuOAgeS4lOW9k+WJjeWAvOehruWunuS4uuepuueahCByZXF1aXJlZCDplJnor6/ml7blsZXnpLrnuqLmoYbvvIxcbiAgICog6YG/5YWN5om56YeP6LWL5YC85pe2IG5nLXpvcnJvIOaui+eVmeOAjOS4jeiDveS4uuepuuOAjeaPkOekulxuICAgKi9cbiAgZ2V0Q29udHJvbFZhbGlkYXRlU3RhdHVzKGxpbmU6IEZvcm1Hcm91cCwgZm9ybUl0ZW06IEZvcm1MaW5lKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb250cm9sID0gbGluZS5nZXQoZm9ybUl0ZW0ubmFtZSk7XG4gICAgaWYgKCFjb250cm9sIHx8IGNvbnRyb2wuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBjb25zdCBlbXB0eSA9XG4gICAgICBjb250cm9sLnZhbHVlID09PSBudWxsIHx8XG4gICAgICBjb250cm9sLnZhbHVlID09PSB1bmRlZmluZWQgfHxcbiAgICAgIGNvbnRyb2wudmFsdWUgPT09IFwiXCI7XG4gICAgaWYgKFxuICAgICAgKGNvbnRyb2wuZGlydHkgfHwgY29udHJvbC50b3VjaGVkKSAmJlxuICAgICAgZW1wdHkgJiZcbiAgICAgIGNvbnRyb2wuaGFzRXJyb3IoXCJyZXF1aXJlZFwiKVxuICAgICkge1xuICAgICAgcmV0dXJuIFwiZXJyb3JcIjtcbiAgICB9XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cblxuICAvKiog55So5oi36L6T5YWl5pe25oyJIG1heExlbmd0aCDmiKrmlq3vvIjkuI3kvb/nlKjljp/nlJ8gbWF4bGVuZ3Ro77yM6YG/5YWN5bmy5omw56iL5bqP5YyW6LWL5YC877yJICovXG4gIGxpbWl0SW5wdXRMZW5ndGgoZXZlbnQ6IEV2ZW50LCBsaW5lOiBGb3JtR3JvdXAsIGZvcm1JdGVtOiBGb3JtTGluZSk6IHZvaWQge1xuICAgIGlmICghZm9ybUl0ZW0gfHwgIWZvcm1JdGVtLm1heExlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGlmIChpbnB1dCAmJiBpbnB1dC52YWx1ZSAmJiBpbnB1dC52YWx1ZS5sZW5ndGggPiBmb3JtSXRlbS5tYXhMZW5ndGgpIHtcbiAgICAgIGNvbnN0IG5leHQgPSBpbnB1dC52YWx1ZS5zbGljZSgwLCBmb3JtSXRlbS5tYXhMZW5ndGgpO1xuICAgICAgaW5wdXQudmFsdWUgPSBuZXh0O1xuICAgICAgY29uc3QgY29udHJvbCA9IGxpbmUuZ2V0KGZvcm1JdGVtLm5hbWUpO1xuICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgY29udHJvbC5zZXRWYWx1ZShuZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiog6I635Y+W5b2T5YmN5Yu+6YCJ5LiU5bey5oyC6L2955qE6KGMIEZvcm1Hcm91cO+8iOW9k+WJjeetm+mAiee7k+aenOWGhe+8iSAqL1xuICBwdWJsaWMgZ2V0U2VsZWN0ZWRMaW5lcygpOiBGb3JtR3JvdXBbXSB7XG4gICAgcmV0dXJuICh0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzIGFzIEZvcm1Hcm91cFtdKS5maWx0ZXIoKGxpbmUpID0+XG4gICAgICB0aGlzLmlzTGluZUNoZWNrZWQobGluZSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blhajpg6jli77pgInooYzmlbDmja7vvIjlkKvot6jpobXjgIHmkJzntKLlkI7mnKrlsZXnpLrkvYbku43li77pgInnmoTooYzvvIlcbiAgICovXG4gIHB1YmxpYyBnZXRTZWxlY3RlZExpbmVzRGF0YSgpOiBhbnlbXSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgY29uc3QgbW91bnRlZEJ5SWQgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgICh0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzIGFzIEZvcm1Hcm91cFtdKS5mb3JFYWNoKChsaW5lKSA9PiB7XG4gICAgICBjb25zdCBpZCA9IHRoaXMuZ2V0Um93SWQobGluZSk7XG4gICAgICBpZiAoaWQgJiYgdGhpcy5zZWxlY3RlZFJvd0lkcy5oYXMoaWQpKSB7XG4gICAgICAgIG1vdW50ZWRCeUlkLnNldChpZCwgbGluZS5nZXRSYXdWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgICh0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YSB8fCBbXSkuZm9yRWFjaCgoZGF0YSkgPT4ge1xuICAgICAgY29uc3QgaWQgPSBkYXRhICYmIGRhdGEuX2hkUm93SWQ7XG4gICAgICBpZiAoaWQgJiYgdGhpcy5zZWxlY3RlZFJvd0lkcy5oYXMoaWQpKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKG1vdW50ZWRCeUlkLmhhcyhpZCkgPyBtb3VudGVkQnlJZC5nZXQoaWQpIDogeyAuLi5kYXRhIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8g5YWc5bqV77ya5Yia5paw5aKe44CB5bCa5pyq6L+bIHN0b3JlIOeahOWLvumAieihjFxuICAgIHRoaXMuc2VsZWN0ZWRSb3dJZHMuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgIXJlc3VsdC5zb21lKChpdGVtKSA9PiBpdGVtICYmIGl0ZW0uX2hkUm93SWQgPT09IGlkKSAmJlxuICAgICAgICBtb3VudGVkQnlJZC5oYXMoaWQpXG4gICAgICApIHtcbiAgICAgICAgcmVzdWx0LnB1c2gobW91bnRlZEJ5SWQuZ2V0KGlkKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiDmibnph4/loavlhYXli77pgInooYzlrZfmrrXvvIjmlK/mjIHot6jpobXjgIHmkJzntKLlkI7mnKrlsZXnpLrkvYbku43li77pgInnmoTooYzvvIlcbiAgICogQHBhcmFtIHZhbHVlcyDopoHlhpnlhaXnmoTlrZfmrrXvvIzlpoIgeyByZW1hcms6ICfmibnph4/lpIfms6gnLCBwcmljZTogMTAgfVxuICAgKiBAcGFyYW0gZW1pdEV2ZW50IOaYr+WQpuinpuWPkSB2YWx1ZUNoYW5nZXMgLyBvbkNoYW5nZUV2ZW5077yM6buY6K6kIHRydWVcbiAgICogQHJldHVybnMg5a6e6ZmF5aGr5YWF55qE6KGM5pWwXG4gICAqL1xuICBwdWJsaWMgYmF0Y2hGaWxsU2VsZWN0ZWQoXG4gICAgdmFsdWVzOiB7IFtmaWVsZDogc3RyaW5nXTogYW55IH0sXG4gICAgZW1pdEV2ZW50OiBib29sZWFuID0gdHJ1ZSxcbiAgKTogbnVtYmVyIHtcbiAgICBpZiAoIXZhbHVlcyB8fCB0aGlzLnNlbGVjdGVkUm93SWRzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCBtb3VudGVkQnlJZCA9IG5ldyBNYXA8c3RyaW5nLCBGb3JtR3JvdXA+KCk7XG4gICAgKHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMgYXMgRm9ybUdyb3VwW10pLmZvckVhY2goKGxpbmUpID0+IHtcbiAgICAgIGNvbnN0IGlkID0gdGhpcy5nZXRSb3dJZChsaW5lKTtcbiAgICAgIGlmIChpZCkge1xuICAgICAgICBtb3VudGVkQnlJZC5zZXQoaWQsIGxpbmUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICB0aGlzLnNlbGVjdGVkUm93SWRzLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICBjb25zdCBsaW5lID0gbW91bnRlZEJ5SWQuZ2V0KGlkKTtcbiAgICAgIGlmIChsaW5lKSB7XG4gICAgICAgIHRoaXMuYXBwbHlWYWx1ZXNUb0xpbmUobGluZSwgdmFsdWVzLCBlbWl0RXZlbnQpO1xuICAgICAgICBjb3VudCsrO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyDlvZPliY3nrZvpgIkv6aG16Z2i5pyq5oyC6L2977ya55u05o6l5pS55oC75pWw5o2u77yM6YCA5Ye65pCc57Si5ZCO5Y+v6KeBXG4gICAgICBjb25zdCBzdG9yZUl0ZW0gPSAodGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEgfHwgW10pLmZpbmQoXG4gICAgICAgIChkYXRhKSA9PiBkYXRhICYmIGRhdGEuX2hkUm93SWQgPT09IGlkLFxuICAgICAgKTtcbiAgICAgIGlmIChzdG9yZUl0ZW0pIHtcbiAgICAgICAgT2JqZWN0LmtleXModmFsdWVzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICBzdG9yZUl0ZW1ba2V5XSA9IHZhbHVlc1trZXldO1xuICAgICAgICB9KTtcbiAgICAgICAgY291bnQrKztcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY291bnQ7XG4gIH1cblxuICAvKiog5riF56m65Yu+6YCJICovXG4gIHB1YmxpYyBjbGVhclNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZFJvd0lkcy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRSb3dJZHMuY2xlYXIoKTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgfVxuXG4gIC8qKiDlvZPliY3li77pgInmlbDph4/vvIjlkKvot6jpobXjgIHmkJzntKLkv53nlZnvvIkgKi9cbiAgcHVibGljIGdldFNlbGVjdGVkQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFJvd0lkcy5zaXplO1xuICB9XG5cbiAgLyoqIOaYr+WQpuWxleekuumhtumDqOW3peWFt+agjyAqL1xuICBnZXQgc2hvd1Rvb2xiYXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhdGhpcy5zaG93U2VhcmNoIHx8XG4gICAgICAhIXRoaXMuc2hvd0NoZWNrYm94IHx8XG4gICAgICAhIXRoaXMuZm9ybUxpbmVzTGVmdEJ1dHRvbiB8fFxuICAgICAgISF0aGlzLmZvcm1MaW5lc1JpZ2h0QnV0dG9uXG4gICAgKTtcbiAgfVxuXG4gIHNldEFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3Blbih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuYWN0aXZlU2VsZWN0ZWRDb21wb25lbnRPcGVuID0gdmFsdWU7XG4gICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29uc3QgZG9tTGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICAgICAgXCIuYW50LXNlbGVjdC1kcm9wZG93bi5oZC1zZWxlY3QtdGFibGVcIixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGRvbUxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGRvbSA9IGRvbUxpc3RbMF07XG4gICAgICAgICAgZG9tXG4gICAgICAgICAgICAucXVlcnlTZWxlY3RvckFsbChcIi5oZC1vcHRpb24taGVhZGVyXCIpXG4gICAgICAgICAgICAuZm9yRWFjaCgoaGVhZGVyKSA9PiBoZWFkZXIucmVtb3ZlKCkpO1xuICAgICAgICAgIGNvbnN0IG9sZEluZGV4ID0gdGhpcy5nZXRPbGREb21JbmRleCh0aGlzLmFjdGl2ZURvbVksIHRoaXMuZm9ybUxpbmVzKTtcbiAgICAgICAgICBkb20uaW5zZXJ0QmVmb3JlKFxuICAgICAgICAgICAgdGhpcy5jcmVhdGVET01TdHJ1Y3R1cmUoXG4gICAgICAgICAgICAgIHRoaXMuZm9ybUxpbmVzW29sZEluZGV4XSxcbiAgICAgICAgICAgICAgdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5zbGljZShcbiAgICAgICAgICAgICAgICAodGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4IC0gMSkgKiB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZSxcbiAgICAgICAgICAgICAgICAodGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4IC0gMSkgKiB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZSArXG4gICAgICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZSxcbiAgICAgICAgICAgICAgKVt0aGlzLmFjdGl2ZURvbVhdLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGRvbS5maXJzdENoaWxkLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0sIDApO1xuICAgIH1cbiAgfVxuXG4gIGdldFNlbGVjdFRhYmxlQ29sdW1uU3R5bGUoY29sdW1uOiBTZWxlY3RPcHRpb25UYWJsZUNvbHVtbik6IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmc7XG4gIH0ge1xuICAgIGlmICghY29sdW1uIHx8ICFjb2x1bW4ud2lkdGgpIHtcbiAgICAgIHJldHVybiB7IHdpZHRoOiBcInVuc2V0XCIgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgd2lkdGg6IGAke2NvbHVtbi53aWR0aH1weGAgfTtcbiAgfVxuXG4gIGNyZWF0ZURPTVN0cnVjdHVyZShmb3JtSXRlbSwgbGluZSkge1xuICAgIC8vIOWIm+W7uuWklumDqCBkaXZcbiAgICBjb25zdCBoZE9wdGlvbkhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgaGRPcHRpb25IZWFkZXIuY2xhc3NOYW1lID0gXCJoZC1vcHRpb24taGVhZGVyXCI7XG4gICAgaGRPcHRpb25IZWFkZXIuc3R5bGUucGFkZGluZ0xlZnQgPSBgJHtTRUxFQ1RfVEFCTEVfT1BUSU9OX0hPUklaT05UQUxfUEFERElOR31weGA7XG4gICAgaGRPcHRpb25IZWFkZXIuc3R5bGUucGFkZGluZ1JpZ2h0ID0gYCR7U0VMRUNUX1RBQkxFX09QVElPTl9IT1JJWk9OVEFMX1BBRERJTkd9cHhgO1xuXG4gICAgLy8g5qOA5p+l5p2h5Lu277yM56Gu5a6a5piv5ZCm6KaB5Yib5bu65a2Q5YWD57SgXG4gICAgLy8gY29uc3Qgc2VsZWN0TGlzdExlbmd0aCA9IChmb3JtSXRlbSAmJiBmb3JtSXRlbS5zZWxlY3RPcHRpb24gJiYgZm9ybUl0ZW0uc2VsZWN0T3B0aW9uLnNlbGVjdExpc3QgJiYgZm9ybUl0ZW0uc2VsZWN0T3B0aW9uLnNlbGVjdExpc3QubGVuZ3RoKSB8fCAwO1xuICAgIC8vIGlmXG4gICAgLy8gY29uc3QgbGluZVZhbHVlTGVuZ3RoID0gKGxpbmUuZ2V0KGZvcm1JdGVtLnNlbGVjdE9wdGlvbi5zZWxlY3RMaXN0TmFtZSkgJiYgbGluZS5nZXQoZm9ybUl0ZW0uc2VsZWN0T3B0aW9uLnNlbGVjdExpc3ROYW1lKS52YWx1ZSAmJiBsaW5lLmdldChmb3JtSXRlbS5zZWxlY3RPcHRpb24uc2VsZWN0TGlzdE5hbWUpLnZhbHVlLmxlbmd0aCkgfHwgMDtcblxuICAgIC8vIGlmIChzZWxlY3RMaXN0TGVuZ3RoID4gMCB8fCBsaW5lVmFsdWVMZW5ndGggPiAwKSB7XG4gICAgLy8g6YGN5Y6GIHRhYmxlQ29sdW1ucyDliJvlu7rlhoXpg6jliJcgZGl2XG4gICAgZm9ybUl0ZW0uc2VsZWN0T3B0aW9uLnRhYmxlQ29sdW1ucy5mb3JFYWNoKChzZWxlY3RPcHRpb25UYWJsZUNvbHVtbikgPT4ge1xuICAgICAgY29uc3QgY29sdW1uRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGNvbHVtbkRpdi5jbGFzc05hbWUgPSBcImhkLW9wdGlvbi1oZWFkZXItY29sdW1uXCI7XG5cbiAgICAgIGNvbnN0IHdpZHRoU3R5bGUgPSB0aGlzLmdldFNlbGVjdFRhYmxlQ29sdW1uU3R5bGUoXG4gICAgICAgIHNlbGVjdE9wdGlvblRhYmxlQ29sdW1uLFxuICAgICAgKTtcbiAgICAgIGNvbHVtbkRpdi5zdHlsZS53aWR0aCA9IHdpZHRoU3R5bGUud2lkdGg7XG5cbiAgICAgIC8vIOa3u+WKoOWIl+agh+etvuWGheWuuVxuICAgICAgaWYgKHNlbGVjdE9wdGlvblRhYmxlQ29sdW1uLmxhYmVsKSB7XG4gICAgICAgIGNvbnN0IGxhYmVsVGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFxuICAgICAgICAgIHNlbGVjdE9wdGlvblRhYmxlQ29sdW1uLmxhYmVsLFxuICAgICAgICApO1xuICAgICAgICBjb2x1bW5EaXYuYXBwZW5kQ2hpbGQobGFiZWxUZXh0KTtcbiAgICAgIH1cblxuICAgICAgLy8g5re75Yqg5YiXIGRpdiDliLDlpJbpg6ggZGl2XG4gICAgICBoZE9wdGlvbkhlYWRlci5hcHBlbmRDaGlsZChjb2x1bW5EaXYpO1xuICAgIH0pO1xuICAgIC8vIH1cblxuICAgIHJldHVybiBoZE9wdGlvbkhlYWRlcjtcbiAgfVxuXG4gIGNvbGxlY3REb21EYXRhKCkge1xuICAgIHRoaXMuY29sbGVjdERvbUxpc3QgPSBbXTtcbiAgICBjb25zdCBwYWdlRG9tTGlzdCA9IHRoaXMuZm9ybUlucHV0RG9tTGlzdC50b0FycmF5KCk7XG4gICAgLy8gU3RlcCAxOiDojrflj5blvZPliY3pobXnmoTmlbDmja7ph49cbiAgICBjb25zdCBzdGFydEluZGV4ID0gKHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCAtIDEpICogdGhpcy5wYWdpbmF0aW9uUGFnZVNpemU7XG4gICAgY29uc3QgZW5kSW5kZXggPSB0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXggKiB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZTtcbiAgICBjb25zdCBhZGp1c3RlZEVuZEluZGV4ID1cbiAgICAgIGVuZEluZGV4ID4gdGhpcy5mb3JtTGluZXNMZW5ndGggPyB0aGlzLmZvcm1MaW5lc0xlbmd0aCA6IGVuZEluZGV4O1xuICAgIGNvbnN0IHBhZ2VMaW5lc0xlbmd0aCA9IGFkanVzdGVkRW5kSW5kZXggLSBzdGFydEluZGV4O1xuXG4gICAgY29uc3QgaW50ZXJ2YWwgPSBwYWdlRG9tTGlzdC5sZW5ndGggLyBwYWdlTGluZXNMZW5ndGg7XG4gICAgLy8gU3RlcCAyOiDmi4bliIZmb3JtSW5wdXREb21MaXN0XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYWdlTGluZXNMZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5jb2xsZWN0RG9tTGlzdC5wdXNoKHBhZ2VEb21MaXN0LnNwbGljZSgwLCBpbnRlcnZhbCkpO1xuICAgIH1cbiAgICB0aGlzLmRpc2FibGVJbnB1dE51bWJlcktleWJvYXJkU3RlcCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIG5nLXpvcnJvIDgg5ZyoIGlucHV0IOeahCBvbktleURvd24g6YeM55So5LiK5LiL6ZSu6LCDIHVwKCkvZG93bigpIOaUuSBzdGVw44CCXG4gICAqIOWPquimhuebliBvbktleURvd27vvIjkuI3liqggdXAvZG93bu+8ie+8jOmUruebmOaWueWQkemUruS6pOe7meihqOWNlei3s+i9rO+8jCsvLSDmjInpkq7ku43lj6/nlKjjgIJcbiAgICovXG4gIHByaXZhdGUgZGlzYWJsZUlucHV0TnVtYmVyS2V5Ym9hcmRTdGVwKCk6IHZvaWQge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvbGxlY3REb21MaXN0W2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGNvbnN0IGRvbSA9IHRoaXMuY29sbGVjdERvbUxpc3RbaV1bal07XG4gICAgICAgIGlmIChkb20gaW5zdGFuY2VvZiBOeklucHV0TnVtYmVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgZG9tLm9uS2V5RG93biA9IChlOiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSAzOCB8fCBlLmtleUNvZGUgPT09IDQwKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDEzKSB7XG4gICAgICAgICAgICAgIGRvbS5zZXRWYWxpZGF0ZVZhbHVlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIOiBmueEpuS4i+S4gOS4qmRvbVxuICBqdW1wVG9OZXh0SW5wdXQoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICBpZiAoXG4gICAgICB4ID09PSBudWxsIHx8XG4gICAgICB5ID09PSBudWxsIHx8XG4gICAgICAhdGhpcy5jb2xsZWN0RG9tTGlzdCB8fFxuICAgICAgdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGggPT09IDBcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8g5aaC5p6c5piv5pyA5ZCO5LiA5Liq5Y+v6L6T5YWl5YWD57Sg77yM5paw5aKe6KGMXG4gICAgaWYgKFxuICAgICAgISh0aGlzLmFjdGl2ZURvbSBpbnN0YW5jZW9mIE56U2VsZWN0Q29tcG9uZW50KSAmJlxuICAgICAgeCA9PT0gdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGggLSAxICYmXG4gICAgICB5ID09PSB0aGlzLmNvbGxlY3REb21MaXN0WzBdLmxlbmd0aCAtIDFcbiAgICApIHtcbiAgICAgIHRoaXMuYWRkTmV3TGluZUFuZEZvY3VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh5ID09PSB0aGlzLmNvbGxlY3REb21MaXN0WzBdLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCLmiafooYzov4fnqIsxXCIpO1xuICAgICAgICAvLyDlpoLmnpzmmK/mnIDlkI7kuIDliJfvvIzliJnot7PovazliLDkuIvkuIDooYznrKzkuIDkuKrovpPlhaXmoYZcbiAgICAgICAgdGhpcy5mb2N1c0RvbSh4ICsgMSwgMCwgXCJyaWdodFwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi5omn6KGM6L+H56iLMlwiKTtcbiAgICAgICAgLy8g5aaC5p6c5LiN5piv5pyA5ZCO5LiA5YiX77yM5YiZ6Lez6L2s5Yiw5b2T5YmN6KGM5LiL5LiA5Liq6L6T5YWl5qGGXG4gICAgICAgIHRoaXMuZm9jdXNEb20oeCwgeSArIDEsIFwicmlnaHRcIik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWinuWKoOaWsOihjOW5tuS4lOiBmueEpuWIsOesrOS4gOS4quWFg+e0oO+8jFxuICAgKiDov5nph4zopoHms6jmhI/vvIzlpoLmnpzlrZjlnKjnv7vpobXmg4XlhrXvvIzpnIDopoHlpITnkIZcbiAgICovXG4gIGFkZE5ld0xpbmVBbmRGb2N1cygpIHtcbiAgICAvLyDlvZPliY3ooYzkuLrlvZPliY3pobXmnIDlkI7kuIDooYznmoTml7blgJnvvIzliKTmlq3kuIvkuIDpobXmmK/lkKbmnInmlbDmja5cbiAgICAvLyAx44CB5aaC5p6c5pyJ77ya57+76aG1K+iBmueEpuesrOS4gOihjOesrOS4gOS4quWFg+e0oFxuICAgIC8vIDLjgIHlpoLmnpzmsqHmnInvvJrmlrDlop7ooYwr57+76aG1K+iBmueEpuesrOS4gOihjOesrOS4gOS4quWFg+e0oFxuICAgIGlmICh0aGlzLmFjdGl2ZURvbVggPT09IHRoaXMucGFnaW5hdGlvblBhZ2VTaXplIC0gMSkge1xuICAgICAgLy8g5Yik5pat5LiL5LiA6aG15piv5ZCm5pyJ5pWw5o2uXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCA8XG4gICAgICAgIE1hdGguY2VpbCh0aGlzLmZvcm1MaW5lc0xlbmd0aCAvIHRoaXMucGFnaW5hdGlvblBhZ2VTaXplKVxuICAgICAgKSB7XG4gICAgICAgIC8vIOe/u+mhtSvogZrnhKbnrKzkuIDooYznrKzkuIDkuKrlhYPntKBcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4Kys7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY29sbGVjdERvbURhdGEoKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIuaJp+ihjOi/h+eoizNcIik7XG4gICAgICAgICAgdGhpcy5mb2N1c0RvbSgwLCAwLCBcInJpZ2h0XCIpO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOaWsOWinuihjCvnv7vpobUr6IGa54Sm56ys5LiA6KGM56ys5LiA5Liq5YWD57SgXG4gICAgICAgIHRoaXMuYWRkRm9ybUxpbmUoKTtcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4Kys7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY29sbGVjdERvbURhdGEoKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIuaJp+ihjOi/h+eoizRcIik7XG4gICAgICAgICAgdGhpcy5mb2N1c0RvbSgwLCAwKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRkRm9ybUxpbmUoKTtcbiAgICB9XG4gIH1cblxuICAvLyDogZrnhKbliLDkuIrkuIDkuKpkb21cbiAganVtcFRvUHJldklucHV0KHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gICAgaWYgKFxuICAgICAgeCA9PT0gbnVsbCB8fFxuICAgICAgeSA9PT0gbnVsbCB8fFxuICAgICAgIXRoaXMuY29sbGVjdERvbUxpc3QgfHxcbiAgICAgIHRoaXMuY29sbGVjdERvbUxpc3QubGVuZ3RoID09PSAwXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh4ID09PSAwICYmIHkgPT09IDApIHtcbiAgICAgIC8vIOWmguaenOaYr+esrOS4gOS4quWPr+i+k+WFpeWFg+e0oO+8jCDliKTmlq3mmK/lkKbmnInkuIrkuIDpobXvvIwg5aaC5p6c5pyJ77yM5YiZ57+76aG1K+iBmueEpuWIsOS4iuS4gOmhteacgOWQjuS4gOS4quWFg+e0oFxuICAgICAgaWYgKHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCA+IDEpIHtcbiAgICAgICAgLy8g57+76aG1K+iBmueEpuWIsOS4iuS4gOmhteacgOWQjuS4gOS4quWFg+e0oFxuICAgICAgICB0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXgtLTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jb2xsZWN0RG9tRGF0YSgpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwi5omn6KGM6L+H56iLNVwiKTtcbiAgICAgICAgICB0aGlzLmZvY3VzRG9tKFxuICAgICAgICAgICAgdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGggLSAxLFxuICAgICAgICAgICAgdGhpcy5jb2xsZWN0RG9tTGlzdFswXS5sZW5ndGggLSAxLFxuICAgICAgICAgICk7XG4gICAgICAgIH0sIDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoeSA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIuaJp+ihjOi/h+eoizZcIik7XG4gICAgICAgIC8vIOWmguaenOaYr+esrOS4gOWIl++8jOWImei3s+i9rOWIsOS4iuS4gOihjOacgOWQjuS4gOS4qui+k+WFpeahhlxuICAgICAgICB0aGlzLmZvY3VzRG9tKHggLSAxLCB0aGlzLmNvbGxlY3REb21MaXN0WzBdLmxlbmd0aCAtIDEsIFwibGVmdFwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi5omn6KGM6L+H56iLN1wiKTtcbiAgICAgICAgLy8g5aaC5p6c5LiN5piv56ys5LiA5YiX77yM5YiZ6Lez6L2s5Yiw5b2T5YmN6KGM5LiK5LiA5Liq6L6T5YWl5qGGXG4gICAgICAgIHRoaXMuZm9jdXNEb20oeCwgeSAtIDEsIFwibGVmdFwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6IGa54Sm5Yiw5p+Q5LiqZG9tXG4gICAqIEBwYXJhbSB4IOWdkOagh3hcbiAgICogQHBhcmFtIHkg5Z2Q5qCHeVxuICAgKiBAcGFyYW0ganVtcERpcmVjdGlvbiDot7PovazmlrnlkJFcbiAgICovXG4gIGZvY3VzRG9tKHg6IG51bWJlciwgeTogbnVtYmVyLCBqdW1wRGlyZWN0aW9uOiBzdHJpbmcgPSBcInJpZ2h0XCIpIHtcbiAgICBpZiAoXG4gICAgICB4ID09PSBudWxsIHx8XG4gICAgICB5ID09PSBudWxsIHx8XG4gICAgICAhdGhpcy5jb2xsZWN0RG9tTGlzdCB8fFxuICAgICAgdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGggPT09IDBcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8g5YWI5riF6Zmk5LiA5LiL5b2T5YmN55qE54Sm54K5XG4gICAgdGhpcy5jbGVhbkZvY3VzRG9tKHRoaXMuYWN0aXZlRG9tWCwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgICBpZiAodGhpcy5jb2xsZWN0RG9tTGlzdFt4XSAmJiB0aGlzLmNvbGxlY3REb21MaXN0W3hdW3ldKSB7XG4gICAgICBjb25zdCBkb20gPSB0aGlzLmNvbGxlY3REb21MaXN0W3hdW3ldO1xuICAgICAgLy8g6ZyA6KaB5Yik5pat5LiL5LiA5LiqZm9jdXPnmoRkb23mmK/lkKbmmK/npoHnlKjnirbmgIHvvIzlpoLmnpzmmK/npoHnlKjnirbmgIHpnIDopoHot7Pov4dcbiAgICAgIGlmIChkb20gaW5zdGFuY2VvZiBOelNlbGVjdENvbXBvbmVudCkge1xuICAgICAgICBpZiAoZG9tLm56RGlzYWJsZWQpIHtcbiAgICAgICAgICBpZiAoanVtcERpcmVjdGlvbiA9PT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgICB0aGlzLmp1bXBUb05leHRJbnB1dCh4LCB5KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGp1bXBEaXJlY3Rpb24gPT09IFwibGVmdFwiKSB7XG4gICAgICAgICAgICB0aGlzLmp1bXBUb1ByZXZJbnB1dCh4LCB5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGRvbS5uelNlbGVjdFRvcENvbnRyb2xDb21wb25lbnQuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoXG4gICAgICAgICAgeyBiZWhhdmlvcjogXCJzbW9vdGhcIiwgYmxvY2s6IFwiY2VudGVyXCIsIGlubGluZTogXCJjZW50ZXJcIiB9LFxuICAgICAgICApO1xuICAgICAgICAvLyDov5nph4zlpJrpgInmoYbpnIDopoHpop3lpJblpITnkIbkuIvvvIzlm6DkuLrlkJHkuIvnmoTml7blgJnkvJrop6blj5HlhoXpg6hJbnB1dOeahOiBmueEpu+8jOaKiuS4i+S4gOS4qmRvbeeahGZvY3Vz5pS+5Yiw5a6P5Lu75Yqh5Lit77yM5bu26L+f5aSE55CG44CCXG4gICAgICAgIGlmIChkb20ubnpTZWxlY3RTZXJ2aWNlLm1vZGUgPT09IFwibXVsdGlwbGVcIikge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgZG9tLmZvY3VzKCk7XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZG9tLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZG9tIGluc3RhbmNlb2YgTnpJbnB1dE51bWJlckNvbXBvbmVudCkge1xuICAgICAgICBpZiAoZG9tLm56RGlzYWJsZWQpIHtcbiAgICAgICAgICBpZiAoanVtcERpcmVjdGlvbiA9PT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgICB0aGlzLmp1bXBUb05leHRJbnB1dCh4LCB5KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGp1bXBEaXJlY3Rpb24gPT09IFwibGVmdFwiKSB7XG4gICAgICAgICAgICB0aGlzLmp1bXBUb1ByZXZJbnB1dCh4LCB5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlucHV0RG9tOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkb20ubnpJZCk7XG4gICAgICAgIGlucHV0RG9tLmZvY3VzKCk7XG4gICAgICAgIGlucHV0RG9tLnNjcm9sbEludG9WaWV3KHtcbiAgICAgICAgICBiZWhhdmlvcjogXCJzbW9vdGhcIixcbiAgICAgICAgICBibG9jazogXCJjZW50ZXJcIixcbiAgICAgICAgICBpbmxpbmU6IFwiY2VudGVyXCIsXG4gICAgICAgIH0pO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpbnB1dERvbS5zZWxlY3QoKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9IGVsc2UgaWYgKGRvbSBpbnN0YW5jZW9mIEVsZW1lbnRSZWYpIHtcbiAgICAgICAgaWYgKGRvbS5uYXRpdmVFbGVtZW50LmRpc2FibGVkKSB7XG4gICAgICAgICAgaWYgKGp1bXBEaXJlY3Rpb24gPT09IFwicmlnaHRcIikge1xuICAgICAgICAgICAgdGhpcy5qdW1wVG9OZXh0SW5wdXQoeCwgeSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChqdW1wRGlyZWN0aW9uID09PSBcImxlZnRcIikge1xuICAgICAgICAgICAgdGhpcy5qdW1wVG9QcmV2SW5wdXQoeCwgeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkb20ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICBkb20ubmF0aXZlRWxlbWVudC5zY3JvbGxJbnRvVmlldyh7XG4gICAgICAgICAgYmVoYXZpb3I6IFwic21vb3RoXCIsXG4gICAgICAgICAgYmxvY2s6IFwiY2VudGVyXCIsXG4gICAgICAgICAgaW5saW5lOiBcImNlbnRlclwiLFxuICAgICAgICB9KTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgZG9tLm5hdGl2ZUVsZW1lbnQuc2VsZWN0KCk7XG4gICAgICAgIH0sIDApO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgZG9tIGluc3RhbmNlb2YgTnpEYXRlUGlja2VyQ29tcG9uZW50IHx8XG4gICAgICAgIGRvbSBpbnN0YW5jZW9mIE56UmFuZ2VQaWNrZXJDb21wb25lbnQgfHxcbiAgICAgICAgZG9tIGluc3RhbmNlb2YgTnpUaW1lUGlja2VyQ29tcG9uZW50XG4gICAgICApIHtcbiAgICAgICAgLy8gVE9ETzrlnKhuZ3pvcnJvOC41LnjniYjmnKzvvIzml7bpl7Tnm7jlhbPnmoTpgInmi6nlmajmsqHmnInmmrTpnLLlh7pvcGVu5pa55rOV77yM5pqC5pe25YWI5LiN5aSE55CG44CC77yIMTAueOWPiuS7peS4iueJiOacrOaPkOS+m+S6hm9wZW7mlrnms5XvvIlcbiAgICAgICAgaWYgKGp1bXBEaXJlY3Rpb24gPT09IFwicmlnaHRcIikge1xuICAgICAgICAgIHRoaXMuanVtcFRvTmV4dElucHV0KHgsIHkpO1xuICAgICAgICB9IGVsc2UgaWYgKGp1bXBEaXJlY3Rpb24gPT09IFwibGVmdFwiKSB7XG4gICAgICAgICAgdGhpcy5qdW1wVG9QcmV2SW5wdXQoeCwgeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRBY3RpdmVEb20oeCwgeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOayoeaciWRvbeeahOWcuuaZr+S4i++8jOmcgOimgeWIpOaWreaYr+W3pui/mOaYr+WPs++8jFxuICAgIH1cbiAgfVxuXG4gIGNsZWFuRm9jdXNEb20oeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICBpZiAoXG4gICAgICB4ID09PSBudWxsIHx8XG4gICAgICB5ID09PSBudWxsIHx8XG4gICAgICAhdGhpcy5jb2xsZWN0RG9tTGlzdCB8fFxuICAgICAgdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGggPT09IDBcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29sbGVjdERvbUxpc3RbeF0gJiYgdGhpcy5jb2xsZWN0RG9tTGlzdFt4XVt5XSkge1xuICAgICAgY29uc3QgZG9tID0gdGhpcy5jb2xsZWN0RG9tTGlzdFt4XVt5XTtcbiAgICAgIGlmIChkb20gaW5zdGFuY2VvZiBOelNlbGVjdENvbXBvbmVudCkge1xuICAgICAgICBkb20uYmx1cigpO1xuICAgICAgICBkb20ubnpPcGVuID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKGRvbSBpbnN0YW5jZW9mIE56SW5wdXROdW1iZXJDb21wb25lbnQpIHtcbiAgICAgICAgZG9tLmJsdXIoKTtcbiAgICAgIH0gZWxzZSBpZiAoZG9tIGluc3RhbmNlb2YgRWxlbWVudFJlZikge1xuICAgICAgICBkb20ubmF0aXZlRWxlbWVudC5ibHVyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldEFjdGl2ZURvbSh4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgIHRoaXMuYWN0aXZlRG9tWCA9IHg7XG4gICAgdGhpcy5hY3RpdmVEb21ZID0geTtcbiAgICB0aGlzLmFjdGl2ZURvbSA9IHRoaXMuY29sbGVjdERvbUxpc3RbdGhpcy5hY3RpdmVEb21YXVt0aGlzLmFjdGl2ZURvbVldO1xuICAgIGlmICh0aGlzLmFjdGl2ZURvbSBpbnN0YW5jZW9mIE56U2VsZWN0Q29tcG9uZW50KSB7XG4gICAgICB0aGlzLnNldEFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3Blbih0aGlzLmFjdGl2ZURvbS5vcGVuKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5qC55o2u6KGM5Y+35ZKM5YiX5Y+35ZCN56ew6I635Y+W5b2T5YmN6IGa54Sm55qEZG9t5L2N572uXG4gICAqIEBwYXJhbSByb3dOdW1iZXIg6KGM5Y+3XG4gICAqIEBwYXJhbSBjb2xOdW1iZXIg5YiX5Y+3XG4gICAqL1xuICBzZXRBY3RpdmVEb21JbkZvcm1MaW5lcyhyb3dOdW1iZXI6IG51bWJlciwgY29sTnVtYmVyOiBudW1iZXIpIHtcbiAgICB0aGlzLmFjdGl2ZURvbVggPSByb3dOdW1iZXI7XG4gICAgdGhpcy5hY3RpdmVEb21ZID0gdGhpcy5nZXREb21JbmRleChjb2xOdW1iZXIsIHRoaXMuZm9ybUxpbmVzKTtcbiAgICB0aGlzLnNldEFjdGl2ZURvbSh0aGlzLmFjdGl2ZURvbVgsIHRoaXMuYWN0aXZlRG9tWSk7XG4gIH1cblxuICAvKipcbiAgICog6ZSu55uY54K55Ye75LqL5Lu2XG4gICAqIEBwYXJhbSBldmVudCDplK7nm5jkuovku7ZcbiAgICogQHJldHVybnNcbiAgICovXG4gIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmICh0aGlzLmFjdGl2ZURvbVggPT09IG51bGwgfHwgdGhpcy5hY3RpdmVEb21ZID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlIFwiQXJyb3dVcFwiOlxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5hY3RpdmVEb20gaW5zdGFuY2VvZiBOelNlbGVjdENvbXBvbmVudCAmJlxuICAgICAgICAgIHRoaXMuYWN0aXZlU2VsZWN0ZWRDb21wb25lbnRPcGVuXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hY3RpdmVEb21YICE9PSAwKSB7XG4gICAgICAgICAgdGhpcy5mb2N1c0RvbSh0aGlzLmFjdGl2ZURvbVggLSAxLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkFycm93RG93blwiOlxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5hY3RpdmVEb20gaW5zdGFuY2VvZiBOelNlbGVjdENvbXBvbmVudCAmJlxuICAgICAgICAgIHRoaXMuYWN0aXZlU2VsZWN0ZWRDb21wb25lbnRPcGVuXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyDliKTmlq3mmK/lkKblnKjmnIDlkI7kuIDooYzvvIzliqDooYxcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlRG9tWCA9PT0gdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgdGhpcy5jbGVhbkZvY3VzRG9tKHRoaXMuYWN0aXZlRG9tWCwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgICAgICAgICB0aGlzLmFkZE5ld0xpbmVBbmRGb2N1cygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZm9jdXNEb20odGhpcy5hY3RpdmVEb21YICsgMSwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJBcnJvd0xlZnRcIjpcbiAgICAgICAgdGhpcy5qdW1wVG9QcmV2SW5wdXQodGhpcy5hY3RpdmVEb21YLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJBcnJvd1JpZ2h0XCI6XG4gICAgICAgIHRoaXMuanVtcFRvTmV4dElucHV0KHRoaXMuYWN0aXZlRG9tWCwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiRW50ZXJcIjpcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlRG9tIGluc3RhbmNlb2YgTnpTZWxlY3RDb21wb25lbnQpIHtcbiAgICAgICAgICB0aGlzLnNldEFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3Blbih0aGlzLmFjdGl2ZURvbS5vcGVuKTtcbiAgICAgICAgICBpZiAodGhpcy5hY3RpdmVTZWxlY3RlZENvbXBvbmVudE9wZW4gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzRG9tKHRoaXMuYWN0aXZlRG9tWCwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5hY3RpdmVEb21YID09PSB0aGlzLmNvbGxlY3REb21MaXN0Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICB0aGlzLmFkZE5ld0xpbmVBbmRGb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkVzY2FwZVwiOlxuICAgICAgICBpZiAodGhpcy5hY3RpdmVEb20gaW5zdGFuY2VvZiBOelNlbGVjdENvbXBvbmVudCkge1xuICAgICAgICAgIGNvbnN0IG5vd0FjdGl2ZURvbSA9IHRoaXMuYWN0aXZlRG9tIGFzIE56U2VsZWN0Q29tcG9uZW50O1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVTZWxlY3RlZENvbXBvbmVudE9wZW4obm93QWN0aXZlRG9tLm9wZW4pO1xuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlU2VsZWN0ZWRDb21wb25lbnRPcGVuID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICBpZiAobm93QWN0aXZlRG9tLm56U2VsZWN0U2VydmljZS5tb2RlID09PSBcIm11bHRpcGxlXCIpIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNEb20odGhpcy5hY3RpdmVEb21YLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNEb20odGhpcy5hY3RpdmVEb21YLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyDlpoLmnpzlvZPliY3ogZrnhKbnmoTmmK/pgInmi6nmoYbvvIzkuJTplK7lhaUwLTlhLXpBLVrvvIzliJnlvLnlh7pcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuYWN0aXZlRG9tIGluc3RhbmNlb2YgTnpTZWxlY3RDb21wb25lbnQgJiZcbiAgICAgICAgICB0aGlzLmFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3BlbiA9PT0gZmFsc2UgJiZcbiAgICAgICAgICAvXlswLTlhLXpBLVpdJC8udGVzdChldmVudC5rZXkpXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGRvbSA9IHRoaXMuYWN0aXZlRG9tO1xuICAgICAgICAgIGRvbS5uek9wZW4gPSB0cnVlO1xuICAgICAgICAgIHRoaXMuc2V0QWN0aXZlU2VsZWN0ZWRDb21wb25lbnRPcGVuKHRydWUpO1xuICAgICAgICAgIC8vIC8vIFRPRE866L+Z6YeM5pqC5pe25rOo6YeK77yM5LiN6IO955u05o6l5bim5YWl6ZSu5YWl5YC877yM6L+Z5qC35Lya5a+86Ie06L6T5YWl5Lit5paH55qE5pe25YCZ5bim5YWl6Iux5paH5a2X56ym77yM5LiN56ym5ZCI6aKE5pyfXG4gICAgICAgICAgLy8gZG9tLm56U2VsZWN0VG9wQ29udHJvbENvbXBvbmVudC5pbnB1dFZhbHVlID0gZXZlbnQua2V5O1xuICAgICAgICAgIC8vIC8vIOiOt+WPliBpbnB1dCDlhYPntKBcbiAgICAgICAgICAvLyBjb25zdCBpbnB1dEVsZW1lbnQgPSBkb20ubnpTZWxlY3RUb3BDb250cm9sQ29tcG9uZW50LmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIC8vICAgLy8g6Kem5Y+R6L6T5YWl5LqL5Lu277yM5Lul56Gu5L+dIEFuZ3VsYXIg5qOA5rWL5Yiw5YC855qE5Y+Y5YyWXG4gICAgICAgICAgLy8gICBjb25zdCBldmVudElucHV0ID0gbmV3IEV2ZW50KCdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSB9KTtcbiAgICAgICAgICAvLyAgIGlucHV0RWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50SW5wdXQpO1xuICAgICAgICAgIC8vIH0sIDApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja7lnKjliJ3lp4tkb23kuIvmoIflkozmlbDmja7pm4Yg6I635Y+W5ZyoY29sbGVjdERvbUxpc3TkuK3nmoTkuIvmoIdcbiAgICogQHBhcmFtIGluZGV4IOWIneWni+S4i+agh1xuICAgKiBAcGFyYW0gbGlzdCDogIHmlbDmja7pm4ZcbiAgICogQHJldHVybnNcbiAgICovXG4gIHByaXZhdGUgZ2V0RG9tSW5kZXgoaW5kZXg6IG51bWJlciwgbGlzdDogQXJyYXk8Rm9ybUxpbmU+KTogbnVtYmVyIHtcbiAgICBjb25zdCB0eXBlTGlzdCA9IFtcbiAgICAgIFwiSW5wdXRcIixcbiAgICAgIFwiU2VsZWN0XCIsXG4gICAgICBcIkRhdGVcIixcbiAgICAgIFwiRGF0ZVJhbmdlXCIsXG4gICAgICBcIlRleHRBcmVhXCIsXG4gICAgICBcIklucHV0TnVtYmVyXCIsXG4gICAgICBcIk11bHRpcGxlU2VsZWN0XCIsXG4gICAgXTtcbiAgICBsZXQgZmlsdGVyTGlzdCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGkgPT09IGluZGV4KSB7XG4gICAgICAgIHJldHVybiBmaWx0ZXJMaXN0Lmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIC8vIOS4juaooeadv+S4gOiHtO+8mmhpZGUg55qE5YiX5LiN5riy5p+TICNmb3JtSW5wdXREb23vvIzkuI3orqHlhaUgY29sbGVjdERvbUxpc3Qg55qE5YiX5LiL5qCHXG4gICAgICBpZiAodHlwZUxpc3QuaW5jbHVkZXMobGlzdFtpXS50eXBlKSAmJiAhbGlzdFtpXS5oaWRlKSB7XG4gICAgICAgIGZpbHRlckxpc3QucHVzaChsaXN0W2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICog5qC55o2u5ZyoY29sbGVjdERvbUxpc3TkuK3nmoTkuIvmoIflkozmlbDmja7pm4Yg6I635Y+W5Yid5aeLZG9t5LiL5qCHXG4gICAqIEBwYXJhbSBpbmRleCDmlrDkuIvmoIdcbiAgICogQHBhcmFtIGxpc3Qg6ICB5pWw5o2u6ZuGXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwcml2YXRlIGdldE9sZERvbUluZGV4KGluZGV4OiBudW1iZXIsIGxpc3Q6IEFycmF5PEZvcm1MaW5lPik6IG51bWJlciB7XG4gICAgY29uc29sZS5sb2coXCJpbmRleFwiLCBpbmRleCk7XG4gICAgY29uc29sZS5sb2coXCJsaXN0XCIsIGxpc3QpO1xuICAgIGNvbnN0IHR5cGVMaXN0ID0gW1xuICAgICAgXCJJbnB1dFwiLFxuICAgICAgXCJTZWxlY3RcIixcbiAgICAgIFwiRGF0ZVwiLFxuICAgICAgXCJEYXRlUmFuZ2VcIixcbiAgICAgIFwiVGV4dEFyZWFcIixcbiAgICAgIFwiSW5wdXROdW1iZXJcIixcbiAgICAgIFwiTXVsdGlwbGVTZWxlY3RcIixcbiAgICBdO1xuICAgIGxldCBmaWx0ZXJMaXN0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodHlwZUxpc3QuaW5jbHVkZXMobGlzdFtpXS50eXBlKSAmJiAhbGlzdFtpXS5oaWRlKSB7XG4gICAgICAgIGZpbHRlckxpc3QucHVzaChsaXN0W2ldKTtcbiAgICAgICAgaWYgKGZpbHRlckxpc3QubGVuZ3RoID09PSBpbmRleCArIDEpIHtcbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGdldCBsaW5lc0Zvcm1BcnJheSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnZhbGlkYXRlSGRGb3JtTGluZXMuZ2V0KFwibGluZXNcIikgYXMgRm9ybUFycmF5O1xuICB9XG5cbiAgZ2V0IExvZGFzaFJvdW5kKCkge1xuICAgIHJldHVybiByb3VuZDtcbiAgfVxuXG4gIC8vIOaatOmcsueahOaWueazle+8jOeUqOS6juiOt+WPluaJgOacieaVsOaNrueahHZhbGlk54q25oCBXG4gIHB1YmxpYyBnZXRWYWxpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtVmFsaWQ7XG4gIH1cblxuICBvblNlYXJjaEV2ZW50KFxuICAgIGZuOiBhbnksXG4gICAgZXZlbnQ6IGFueSxcbiAgICBsaW5lOiBhbnksXG4gICAgb25TZWFyY2hFdmVudERlYm91bmNlVGltZTogYW55LFxuICApIHtcbiAgICBpZiAoIWZuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRlYm91bmNlTXMgPVxuICAgICAgb25TZWFyY2hFdmVudERlYm91bmNlVGltZSAhPSBudWxsID8gb25TZWFyY2hFdmVudERlYm91bmNlVGltZSA6IDA7XG4gICAgLy8g5pyq6YWN572u5oiW5Li6IDDvvJrlkIzmraXop6blj5HvvIzkuI3otbAgZGVib3VuY2VUaW1l77yI6YG/5YWN5byC5q2l77yJXG4gICAgaWYgKCFkZWJvdW5jZU1zKSB7XG4gICAgICB0aGlzLnRyaWdnZXJFdmVudChmbiwgZXZlbnQsIGxpbmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRlYm91bmNlVGltZW91dCA9IGRlYm91bmNlTXM7XG4gICAgICBpZiAodGhpcy5zZWFyY2hTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5zZWFyY2hTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VhcmNoU3Vic2NyaXB0aW9uID0gdGhpcy5zZWFyY2hTdWJqZWN0XG4gICAgICAgIC5waXBlKGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlVGltZW91dCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKHsgZm4sIGV2ZW50LCBsaW5lIH0pID0+IHRoaXMudHJpZ2dlckV2ZW50KGZuLCBldmVudCwgbGluZSkpO1xuICAgICAgdGhpcy5zZWFyY2hTdWJqZWN0Lm5leHQoeyBmbiwgZXZlbnQsIGxpbmUgfSk7XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zZXRBY3RpdmVTZWxlY3RlZENvbXBvbmVudE9wZW4odHJ1ZSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBvbk9wZW5DaGFuZ2VFdmVudChcbiAgICBmbjogYW55LFxuICAgIG9wZW46IGJvb2xlYW4sXG4gICAgbGluZTogYW55LFxuICAgIG9uT3BlbkNoYW5nZUV2ZW50RGVib3VuY2VUaW1lOiBhbnksXG4gICkge1xuICAgIGlmICghZm4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGVib3VuY2VNcyA9XG4gICAgICBvbk9wZW5DaGFuZ2VFdmVudERlYm91bmNlVGltZSAhPSBudWxsXG4gICAgICAgID8gb25PcGVuQ2hhbmdlRXZlbnREZWJvdW5jZVRpbWVcbiAgICAgICAgOiAwO1xuICAgIC8vIOacqumFjee9ruaIluS4uiAw77ya5ZCM5q2l6Kem5Y+R77yM5LiN6LWwIGRlYm91bmNlVGltZe+8iOmBv+WFjeW8guatpe+8iVxuICAgIGlmICghZGVib3VuY2VNcykge1xuICAgICAgaWYgKG9wZW4pIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoZm4sIG9wZW4sIGxpbmUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9wZW5DaGFuZ2VEZWJvdW5jZVRpbWVvdXQgPSBkZWJvdW5jZU1zO1xuICAgIGlmICh0aGlzLm9wZW5DaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMub3BlbkNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLm9wZW5DaGFuZ2VTdWJzY3JpcHRpb24gPSB0aGlzLm9wZW5DaGFuZ2VTdWJqZWN0XG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUodGhpcy5vcGVuQ2hhbmdlRGVib3VuY2VUaW1lb3V0KSlcbiAgICAgIC5zdWJzY3JpYmUoKHsgZm4sIGV2ZW50LCBsaW5lIH0pID0+IHtcbiAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoZm4sIGV2ZW50LCBsaW5lKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgdGhpcy5vcGVuQ2hhbmdlU3ViamVjdC5uZXh0KHsgZm4sIGV2ZW50OiBvcGVuLCBsaW5lIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBmbiDniLbnu4Tku7blh73mlbBcbiAgICogQHBhcmFtIGV2ZW50IOS6i+S7tuWAvFxuICAgKiBAcGFyYW0gbGluZSDop6blj5HnmoTooYxcbiAgICovXG4gIHRyaWdnZXJFdmVudChmbjogYW55LCBldmVudDogYW55LCBsaW5lOiBhbnkpIHtcbiAgICBpZiAoZm4pIHtcbiAgICAgIGZuKGV2ZW50LCBsaW5lKTtcbiAgICB9XG4gIH1cblxuICBpbm5lckdldFZhbGlkKCkge1xuICAgIGxldCB0bXBWYWxpZGF0ZUhkRm9ybUxpbmVzID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBsaW5lczogdGhpcy5mYi5hcnJheShbXSksXG4gICAgfSk7XG4gICAgdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEuZm9yRWFjaCgoZm9ybUxpbmVzRGF0YUl0ZW0pID0+IHtcbiAgICAgIGxldCBmb3JtR3JvdXBPYmo6IGFueSA9IHt9O1xuICAgICAgdGhpcy5mb3JtTGluZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAvLyDmlrDlop7ooYwg5Yid5aeL5pWw5o2u6YO95Li6bnVsbFxuICAgICAgICBmb3JtR3JvdXBPYmpbaXRlbS5uYW1lXSA9IHRoaXMuZmIuY29udHJvbChcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5qdWRnZVZhbHVlSXNOb3RFbXB0eShmb3JtTGluZXNEYXRhSXRlbVtpdGVtLm5hbWVdKVxuICAgICAgICAgICAgICA/IGZvcm1MaW5lc0RhdGFJdGVtW2l0ZW0ubmFtZV1cbiAgICAgICAgICAgICAgOiBpdGVtLnZhbHVlIHx8IG51bGwsXG4gICAgICAgICAgICBkaXNhYmxlZDogaXRlbS5kaXNhYmxlZCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGl0ZW0ucmVxdWlyZSA/IFtWYWxpZGF0b3JzLnJlcXVpcmVkXSA6IFtdLFxuICAgICAgICApO1xuICAgICAgICBpZiAoaXRlbS5zZWxlY3RPcHRpb24gJiYgaXRlbS5zZWxlY3RPcHRpb24ubGFiZWwpIHtcbiAgICAgICAgICBmb3JtR3JvdXBPYmpbaXRlbS5zZWxlY3RPcHRpb24ubGFiZWxdID0gdGhpcy5mYi5jb250cm9sKFxuICAgICAgICAgICAgZm9ybUxpbmVzRGF0YUl0ZW1baXRlbS5zZWxlY3RPcHRpb24ubGFiZWxdIHx8IG51bGwsXG4gICAgICAgICAgICBbXSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGZvcm1Hcm91cE9iai5saW5lSW5kZXggPSB0aGlzLmZiLmNvbnRyb2woXG4gICAgICAgICh0bXBWYWxpZGF0ZUhkRm9ybUxpbmVzLmdldChcImxpbmVzXCIpIGFzIEZvcm1BcnJheSkuY29udHJvbHMubGVuZ3RoICsgMSxcbiAgICAgICAgW10sXG4gICAgICApO1xuICAgICAgbGV0IGZvcm1Hcm91cFRtcCA9IHRoaXMuZmIuZ3JvdXAoZm9ybUdyb3VwT2JqKTtcbiAgICAgIHRoaXMuZm9ybUxpbmVzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKGl0ZW0ub25DaGFuZ2VFdmVudCkge1xuICAgICAgICAgIGNvbnN0IGRlYm91bmNlTXMgPVxuICAgICAgICAgICAgaXRlbS5vbkNoYW5nZUV2ZW50RGVib3VuY2VUaW1lICE9IG51bGxcbiAgICAgICAgICAgICAgPyBpdGVtLm9uQ2hhbmdlRXZlbnREZWJvdW5jZVRpbWVcbiAgICAgICAgICAgICAgOiAwO1xuICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtR3JvdXBUbXAuZ2V0KGl0ZW0ubmFtZSk7XG4gICAgICAgICAgLy8g5pyq6YWN572u5oiW5Li6IDDvvJrlkIzmraXorqLpmIXvvIzkuI3otbAgZGVib3VuY2VUaW1lXG4gICAgICAgICAgaWYgKGRlYm91bmNlTXMgPiAwKSB7XG4gICAgICAgICAgICBjb250cm9sLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoZGVib3VuY2VNcykpXG4gICAgICAgICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoaXRlbS5vbkNoYW5nZUV2ZW50LCB2YWx1ZSwgZm9ybUdyb3VwVG1wKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoaXRlbS5vbkNoYW5nZUV2ZW50LCB2YWx1ZSwgZm9ybUdyb3VwVG1wKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAodG1wVmFsaWRhdGVIZEZvcm1MaW5lcy5nZXQoXCJsaW5lc1wiKSBhcyBGb3JtQXJyYXkpLmluc2VydChcbiAgICAgICAgKHRtcFZhbGlkYXRlSGRGb3JtTGluZXMuZ2V0KFwibGluZXNcIikgYXMgRm9ybUFycmF5KS5jb250cm9scy5sZW5ndGgsXG4gICAgICAgIGZvcm1Hcm91cFRtcCxcbiAgICAgICk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRtcFZhbGlkYXRlSGRGb3JtTGluZXMudmFsaWQ7XG4gIH1cblxuICAvLyDmmrTpnLLnmoTmlrnms5XvvIznlKjkuo7ojrflj5bmiYDmnInmlbDmja5cbiAgcHVibGljIGdldExpbmVzKCkge1xuICAgIGxldCBhbGxMaW5lcyA9IFtdO1xuICAgIHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhLmZvckVhY2goKGZvcm1MaW5lc0RhdGFJdGVtKSA9PiB7XG4gICAgICBsZXQgZm9ybUdyb3VwT2JqOiBhbnkgPSB7fTtcbiAgICAgIHRoaXMuZm9ybUxpbmVzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgLy8g5paw5aKe6KGMIOWIneWni+aVsOaNrumDveS4um51bGxcbiAgICAgICAgZm9ybUdyb3VwT2JqW2l0ZW0ubmFtZV0gPSBmb3JtTGluZXNEYXRhSXRlbVtpdGVtLm5hbWVdO1xuICAgICAgfSk7XG4gICAgICBmb3JtR3JvdXBPYmoubGluZUluZGV4ID0gZm9ybUxpbmVzRGF0YUl0ZW0ubGluZUluZGV4O1xuICAgICAgYWxsTGluZXMucHVzaChmb3JtR3JvdXBPYmopO1xuICAgIH0pO1xuICAgIHJldHVybiBhbGxMaW5lcztcbiAgfVxuXG4gIC8vIOWFqOWxgOaAp+eahOaQnOe0ou+8iOa2teeblumhtemdouS4iuaJgOacieeahOWPr+inhuaWh+Wtl++8iVxuICBzZWFyY2hMaW5lcygpIHtcbiAgICBpZiAodGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEubGVuZ3RoIDwgMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRhYmxlTG9hZGluZyA9IHRydWU7XG4gICAgLy8g5aaC5p6c5rKh5pyJ6L6T5YWl5pCc57Si5a2X56ym5Liy77yM5YiZ5pi+56S657yT5a2Y5YaF55qE5omA5pyJ5pWw5o2uXG4gICAgaWYgKCF0aGlzLmZpbHRlclN0cikge1xuICAgICAgdGhpcy5pc0ZpbHRlckRhdGEgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2V0U3RvcmVEYXRhKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZpbHRlclZhbHVlID0gdGhpcy5maWx0ZXJTdHIudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgdGhpcy5pc0ZpbHRlckRhdGEgPSB0cnVlO1xuICAgIHRoaXMuZmlsdGVySW5kZXhTdG9yZSA9IFtdO1xuXG4gICAgLy8g5qC55o2u5pCc57Si5a2X56ym5Liy6L+H5ruk5pWw5o2uXG4gICAgY29uc3QgZmlsdGVyZWREYXRhID0gdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEuZmlsdGVyKFxuICAgICAgKGRhdGE6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5mb3JtTGluZXMpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAoaXRlbS5oaWRlICYmIGl0ZW0uY2FuU2VhcmNoKSB8fFxuICAgICAgICAgICAgKCFpdGVtLmhpZGUgJiYgaXRlbS5uYW1lICE9PSBcInV1aWRcIilcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiaXRlbVwiLCBpdGVtLm5hbWUpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkYXRhW2l0ZW0ubmFtZV1cbiAgICAgICAgICAgICAgPyBkYXRhW2l0ZW0ubmFtZV0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgIDogXCJcIjtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5maWx0ZXJJbmRleFN0b3JlLnB1c2goaW5kZXgpO1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSxcbiAgICApO1xuICAgIC8vIOe8k+WtmOS4gOS4i+etm+mAieWQjueahOihqOWNleaVsOaNrlxuICAgIHRoaXMuZmlsdGVyU3RvcmVGb3JtTGluZXNEYXRhID0gZmlsdGVyZWREYXRhO1xuICAgIC8vIOWkhOeQhuetm+mAieWlveeahOaVsOaNriDnhLblkI7ph43mlrDmuLLmn5NcbiAgICB0aGlzLmZvcm1MaW5lc0RhdGEgPSBmaWx0ZXJlZERhdGE7XG4gICAgdGhpcy5pbml0KHRydWUpO1xuICB9XG5cbiAgc2V0U3RvcmVEYXRhKCkge1xuICAgIHRoaXMuZm9ybUxpbmVzRGF0YSA9IHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhO1xuICAgIHRoaXMuaW5pdCh0cnVlKTtcbiAgfVxuXG4gIGdldFN0eWxlKGxpbmU6IEZvcm1Hcm91cCwgZm9ybUl0ZW06IGFueSwgd2lkdGg6IHN0cmluZykge1xuICAgIGxldCBzdHlsZU9iaiA9IHtcbiAgICAgIFwibWluLXdpZHRoXCI6IHdpZHRoLFxuICAgIH07XG4gICAgaWYgKGZvcm1JdGVtLnN0eWxlKSB7XG4gICAgICBzdHlsZU9iaiA9IHsgLi4uc3R5bGVPYmosIC4uLmZvcm1JdGVtLnN0eWxlIH07XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGZvcm1JdGVtLmNvbG9yT3B0aW9uICYmXG4gICAgICBmb3JtSXRlbS5jb2xvck9wdGlvbi5uYW1lICYmXG4gICAgICBsaW5lLmdldChmb3JtSXRlbS5jb2xvck9wdGlvbi5uYW1lKS52YWx1ZVxuICAgICkge1xuICAgICAgc3R5bGVPYmogPSB7XG4gICAgICAgIC4uLnN0eWxlT2JqLFxuICAgICAgICAuLi57IGNvbG9yOiBsaW5lLmdldChmb3JtSXRlbS5jb2xvck9wdGlvbi5uYW1lKS52YWx1ZSB9LFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHN0eWxlT2JqO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChcbiAgICAgIGNoYW5nZXNbXCJmb3JtTGluZXNEYXRhXCJdICYmXG4gICAgICBKU09OLnN0cmluZ2lmeShjaGFuZ2VzW1wiZm9ybUxpbmVzRGF0YVwiXS5jdXJyZW50VmFsdWUpICE9PVxuICAgICAgICBKU09OLnN0cmluZ2lmeShjaGFuZ2VzW1wiZm9ybUxpbmVzRGF0YVwiXS5wcmV2aW91c1ZhbHVlKVxuICAgICkge1xuICAgICAgaWYgKHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhICYmIHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YSA9IHRoaXMuZm9ybUxpbmVzRGF0YTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW5pdCgpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzW1widG90YWxPcHRpb25cIl0gJiZcbiAgICAgIEpTT04uc3RyaW5naWZ5KGNoYW5nZXNbXCJ0b3RhbE9wdGlvblwiXS5jdXJyZW50VmFsdWUpICE9PVxuICAgICAgICBKU09OLnN0cmluZ2lmeShjaGFuZ2VzW1widG90YWxPcHRpb25cIl0ucHJldmlvdXNWYWx1ZSlcbiAgICApIHtcbiAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWwoKTtcbiAgICB9XG4gIH1cblxuICBjYWxjdWxhdGVUb3RhbCgpIHtcbiAgICAvLyDov5nph4zlpITnkIblkIjorqHmlbDmja5cbiAgICBpZiAodGhpcy5zaG93VG90YWwpIHtcbiAgICAgIHRoaXMudG90YWxPcHRpb25MaXN0ID0gbmV3IEFycmF5KE51bWJlcih0aGlzLmNvbHVtbnNOdW1iZXIpIC0gMSkuZmlsbChcIlwiKTtcbiAgICAgIHRoaXMudG90YWxPcHRpb24uZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5pbnNlcnRJbmRleCAmJiAoaXRlbS5pbnNlcnRWYWx1ZSB8fCBpdGVtLmluc2VydFZhbHVlID09PSAwKSkge1xuICAgICAgICAgIHRoaXMudG90YWxPcHRpb25MaXN0W2l0ZW0uaW5zZXJ0SW5kZXggLSAxXSA9IHtcbiAgICAgICAgICAgIHZhbHVlOiBpdGVtLmluc2VydFZhbHVlLFxuICAgICAgICAgICAgYWxpZ246IGl0ZW0uYWxpZ24gfHwgXCJsZWZ0XCIsXG4gICAgICAgICAgICBzaG93RGVjaW1hbDogaXRlbS5zaG93RGVjaW1hbCB8fCBmYWxzZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXQoaXNFZGl0OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXggPSAxO1xuICAgIC8vIOW8guW4uOaNleiOt1xuICAgIGlmICghdGhpcy5jaGVja0xpc3QodGhpcy5mb3JtTGluZXMpKSB7XG4gICAgICB0aGlzLnRhYmxlTG9hZGluZyA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNyZWF0ZUZvcm0oKTtcbiAgICAvLyDlpoLmnpzmsqHmnIlmb3JtTGluZXNEYXRh77yM5YiZ6K6k5Li65piv5paw5aKeXG4gICAgaWYgKFxuICAgICAgIWlzRWRpdCAmJlxuICAgICAgKCF0aGlzLmZvcm1MaW5lc0RhdGEgfHxcbiAgICAgICAgKHRoaXMuZm9ybUxpbmVzRGF0YSAmJiB0aGlzLmZvcm1MaW5lc0RhdGEubGVuZ3RoID09PSAwKSlcbiAgICApIHtcbiAgICAgIHRoaXMudGFibGVMb2FkaW5nID0gZmFsc2U7XG4gICAgICAvLyBhbGxvd0VtcHR5IOS4lOS7heWIoOmZpOaMiemSru+8muS4jeiHquWKqOihpeepuuihjFxuICAgICAgaWYgKCF0aGlzLmlzVHJ1bHlFbXB0eUFsbG93ZWQpIHtcbiAgICAgICAgdGhpcy5hZGRGb3JtTGluZShudWxsLCBmYWxzZSk7XG4gICAgICB9XG4gICAgICB0aGlzLnNob3dGb3JtID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g57yW6L6R6YC76L6RXG4gICAgICB0aGlzLmFkZEZvcm1MaW5lV2l0aERhdGEoKTtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZUhkRm9ybUxpbmVzLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKGRhdGEpID0+XG4gICAgICB0aGlzLm9uSGRGb3JtVmFsdWVDaGFuZ2VkKGRhdGEpLFxuICAgICk7XG4gICAgdGhpcy5vbkhkRm9ybVZhbHVlQ2hhbmdlZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIm+W7uuihqOWNlVxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVGb3JtKCkge1xuICAgIHRoaXMudmFsaWRhdGVIZEZvcm1MaW5lcyA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgbGluZXM6IHRoaXMuZmIuYXJyYXkoW10pLFxuICAgIH0pO1xuICAgIHRoaXMubmV3TGluZSA9IHRoaXMubmV3TGluZUl0ZW0oKTtcbiAgfVxuXG4gIGRlbGF5SnVtcFRvTmV4dElucHV0KCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5qdW1wVG9OZXh0SW5wdXQodGhpcy5hY3RpdmVEb21YLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIOWumuS5ieepuueahG5ld0xpbmVJdGVtIOe7k+aehFxuICAgKi9cbiAgcHJpdmF0ZSBuZXdMaW5lSXRlbSgpOiBGb3JtR3JvdXAge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZUxpbmVGcm9tVmFsdWVzKG51bGwsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIOagueaNruihjOaVsOaNruWIm+W7uiBGb3JtR3JvdXDvvIjlkKvpmpDol4/lrZfmrrXjgIFzZWxlY3Qg55qEIGxhYmVsIOetiemZhOWxnuWtl+aute+8iVxuICAgKiBAcGFyYW0gZm9ybUxpbmVzRGF0YUl0ZW0g6KGM5pWw5o2u77yM56m66KGM5LygIG51bGxcbiAgICogQHBhcmFtIGlzRW1wdHlMaW5lIOaYr+WQpuepuuihjO+8iOW9seWTjeW/heWhq+agoemqjOinhOWIme+8jOS4juWOhuWPsumAu+i+keS/neaMgeS4gOiHtO+8iVxuICAgKiBAcGFyYW0gcmVnZW5lcmF0ZVJvd0lkIOaYr+WQpuW8uuWItueUn+aIkOaWsOihjCBpZO+8iOWkjeWItuihjOaXtuS9v+eUqO+8iVxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVMaW5lRnJvbVZhbHVlcyhcbiAgICBmb3JtTGluZXNEYXRhSXRlbTogYW55LFxuICAgIGlzRW1wdHlMaW5lOiBib29sZWFuID0gZmFsc2UsXG4gICAgcmVnZW5lcmF0ZVJvd0lkOiBib29sZWFuID0gZmFsc2UsXG4gICk6IEZvcm1Hcm91cCB7XG4gICAgbGV0IGZvcm1Hcm91cE9iajogYW55ID0ge307XG4gICAgdGhpcy5mb3JtTGluZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgZm9ybUdyb3VwT2JqW2l0ZW0ubmFtZV0gPSB0aGlzLmZiLmNvbnRyb2woXG4gICAgICAgIHtcbiAgICAgICAgICB2YWx1ZTpcbiAgICAgICAgICAgIGZvcm1MaW5lc0RhdGFJdGVtICE9IG51bGxcbiAgICAgICAgICAgICAgPyBmb3JtTGluZXNEYXRhSXRlbVtpdGVtLm5hbWVdXG4gICAgICAgICAgICAgIDogaXRlbS52YWx1ZSxcbiAgICAgICAgICBkaXNhYmxlZDogaXRlbS5kaXNhYmxlZCxcbiAgICAgICAgfSxcbiAgICAgICAgaXNFbXB0eUxpbmVcbiAgICAgICAgICA/IGl0ZW0ucmVxdWlyZSAmJiAhaXRlbS5oaWRlXG4gICAgICAgICAgICA/IFtWYWxpZGF0b3JzLnJlcXVpcmVkXVxuICAgICAgICAgICAgOiBbXVxuICAgICAgICAgIDogaXRlbS5yZXF1aXJlXG4gICAgICAgICAgICA/IFtWYWxpZGF0b3JzLnJlcXVpcmVkXVxuICAgICAgICAgICAgOiBbXSxcbiAgICAgICk7XG4gICAgICBpZiAoaXRlbS5zZWxlY3RPcHRpb24gJiYgaXRlbS5zZWxlY3RPcHRpb24ubGFiZWwpIHtcbiAgICAgICAgZm9ybUdyb3VwT2JqW2l0ZW0uc2VsZWN0T3B0aW9uLmxhYmVsXSA9IHRoaXMuZmIuY29udHJvbChcbiAgICAgICAgICBmb3JtTGluZXNEYXRhSXRlbSAhPSBudWxsXG4gICAgICAgICAgICA/IGZvcm1MaW5lc0RhdGFJdGVtW2l0ZW0uc2VsZWN0T3B0aW9uLmxhYmVsXSB8fCBudWxsXG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgW10sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyDnqLPlrprooYwgaWTvvJrmkJzntKLph43lu7rooajljZXlkI7nlKjkuo7kv53nlZnli77pgIlcbiAgICBjb25zdCByb3dJZCA9XG4gICAgICAhcmVnZW5lcmF0ZVJvd0lkICYmIGZvcm1MaW5lc0RhdGFJdGVtICYmIGZvcm1MaW5lc0RhdGFJdGVtLl9oZFJvd0lkXG4gICAgICAgID8gZm9ybUxpbmVzRGF0YUl0ZW0uX2hkUm93SWRcbiAgICAgICAgOiB0aGlzLmdlbmVyYXRlUm93SWQoKTtcbiAgICBmb3JtR3JvdXBPYmouX2hkUm93SWQgPSB0aGlzLmZiLmNvbnRyb2wocm93SWQpO1xuICAgIGlmIChmb3JtTGluZXNEYXRhSXRlbSAmJiAhZm9ybUxpbmVzRGF0YUl0ZW0uX2hkUm93SWQpIHtcbiAgICAgIGZvcm1MaW5lc0RhdGFJdGVtLl9oZFJvd0lkID0gcm93SWQ7XG4gICAgfVxuXG4gICAgLy8g5aSN5Yi25rqQ6KGM5LiK5aSa5L2Z55qE5a2X5q6177yI6ZqQ6JeP6ZmE5bGe5a2X5q6144CBc2VsZWN0TGlzdE5hbWUg562J77yJXG4gICAgaWYgKGZvcm1MaW5lc0RhdGFJdGVtKSB7XG4gICAgICBPYmplY3Qua2V5cyhmb3JtTGluZXNEYXRhSXRlbSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBrZXkgPT09IFwibGluZUluZGV4XCIgfHxcbiAgICAgICAgICBrZXkgPT09IFwiaXNIZEZvcm1MaW5lU2VhcmNoQWRkXCIgfHxcbiAgICAgICAgICBrZXkgPT09IFwiX2hkUm93SWRcIlxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmb3JtR3JvdXBPYmpba2V5XSkge1xuICAgICAgICAgIGZvcm1Hcm91cE9ialtrZXldID0gdGhpcy5mYi5jb250cm9sKGZvcm1MaW5lc0RhdGFJdGVtW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmb3JtR3JvdXBPYmoubGluZUluZGV4ID0gdGhpcy5mYi5jb250cm9sKFxuICAgICAgdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5sZW5ndGggKyAxLFxuICAgICAgW10sXG4gICAgKTtcbiAgICBmb3JtR3JvdXBPYmouaXNIZEZvcm1MaW5lU2VhcmNoQWRkID0gdGhpcy5mYi5jb250cm9sKHRoaXMuaXNGaWx0ZXJEYXRhLCBbXSk7XG4gICAgbGV0IGZvcm1Hcm91cFN1Ym1pdCA9IHRoaXMuZmIuZ3JvdXAoZm9ybUdyb3VwT2JqKTtcbiAgICB0aGlzLmZvcm1MaW5lcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBpZiAoaXRlbS5vbkNoYW5nZUV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGRlYm91bmNlTXMgPVxuICAgICAgICAgIGl0ZW0ub25DaGFuZ2VFdmVudERlYm91bmNlVGltZSAhPSBudWxsXG4gICAgICAgICAgICA/IGl0ZW0ub25DaGFuZ2VFdmVudERlYm91bmNlVGltZVxuICAgICAgICAgICAgOiAwO1xuICAgICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwU3VibWl0LmdldChpdGVtLm5hbWUpO1xuICAgICAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtLnR5cGUgPT09IEZvcm1MaW5lVHlwZS5TZWxlY3QgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsYXlKdW1wVG9OZXh0SW5wdXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoaXRlbS5vbkNoYW5nZUV2ZW50LCB2YWx1ZSwgZm9ybUdyb3VwU3VibWl0KTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8g5pyq6YWN572u5oiW5Li6IDDvvJrlkIzmraXorqLpmIXvvIzkuI3otbAgZGVib3VuY2VUaW1lXG4gICAgICAgIGlmIChkZWJvdW5jZU1zID4gMCkge1xuICAgICAgICAgIGNvbnRyb2wudmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoZGVib3VuY2VNcykpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGhhbmRsZUNoYW5nZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKGhhbmRsZUNoYW5nZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZm9ybUdyb3VwU3VibWl0O1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVMaW5lTnVtYmVyKCkge1xuICAgIHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgIGl0ZW0uZ2V0KFwibGluZUluZGV4XCIpLnNldFZhbHVlKGluZGV4ICsgMSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOe8lui+keeahOaXtuWAmeaVsOaNruWkhOeQhlxuICAgKi9cbiAgYWRkRm9ybUxpbmVXaXRoRGF0YSgpIHtcbiAgICB0aGlzLmZvcm1MaW5lc0RhdGEuZm9yRWFjaCgoZm9ybUxpbmVzRGF0YUl0ZW0pID0+IHtcbiAgICAgIHRoaXMubGluZXNGb3JtQXJyYXkuaW5zZXJ0KFxuICAgICAgICB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aCxcbiAgICAgICAgdGhpcy5jcmVhdGVMaW5lRnJvbVZhbHVlcyhmb3JtTGluZXNEYXRhSXRlbSksXG4gICAgICApO1xuICAgIH0pO1xuICAgIHRoaXMuY2FsY3VsYXRlTGluZU51bWJlcigpO1xuICAgIHRoaXMudGFibGVMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5zaG93Rm9ybSA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICog5Zyo5oyH5a6a6KGM5LiL5pa55paw5aKe56m66KGM77yb5LiN5LygIGFmdGVyTGluZSDliJnov73liqDliLDmnKvlsL5cbiAgICogQHBhcmFtIGFmdGVyTGluZSDlvZPliY3ooYwgRm9ybUdyb3Vw77yI5LiN6KaB5LygIGxpbmVJbmRleO+8jOmBv+WFjeW6j+WPt+WBj+enu+WvvOiHtOaPkumUmeS9jee9ru+8iVxuICAgKi9cbiAgYWRkRm9ybUxpbmUoYWZ0ZXJMaW5lPzogRm9ybUdyb3VwIHwgbnVsbCwgaXNGb2N1czogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBjb25zdCBpbnNlcnRBdCA9IHRoaXMuZ2V0SW5zZXJ0SW5kZXhBZnRlcihhZnRlckxpbmUpO1xuICAgIHRoaXMubGluZXNGb3JtQXJyYXkuaW5zZXJ0KGluc2VydEF0LCB0aGlzLm5ld0xpbmVJdGVtKCkpO1xuICAgIHRoaXMuY2FsY3VsYXRlTGluZU51bWJlcigpO1xuICAgIC8vIOi3s+WIsOaWsOWinuihjOaJgOWcqOmhte+8jOmBv+WFjemhteeggeW8guW4uOaXtueci+S4jeWIsOaVsOaNrlxuICAgIHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCA9XG4gICAgICBNYXRoLmZsb29yKGluc2VydEF0IC8gdGhpcy5wYWdpbmF0aW9uUGFnZVNpemUpICsgMTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY29sbGVjdERvbURhdGEoKTtcbiAgICAgIGlmIChpc0ZvY3VzKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlRG9tWCA9IHRoaXMudG9QYWdlTG9jYWxSb3dJbmRleChpbnNlcnRBdCk7XG4gICAgICAgIHRoaXMuYWN0aXZlRG9tWSA9IDA7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi5omn6KGM6L+H56iLMTNcIik7XG4gICAgICAgIHRoaXMuZm9jdXNEb20odGhpcy5hY3RpdmVEb21YLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgICAgfVxuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIOWkjeWItuW9k+WJjeihjO+8muWcqOW9k+WJjeihjOS4i+aWueaWsOWinuS4gOihjO+8jOWkjeWItuaJgOacieWtl+auteWAvO+8iOWQq+makOiXj+Wtl+aute+8iVxuICAgKi9cbiAgY29weUZvcm1MaW5lKGxpbmU6IEZvcm1Hcm91cCkge1xuICAgIGNvbnN0IHNvdXJjZUluZGV4ID0gdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5pbmRleE9mKGxpbmUpO1xuICAgIGlmIChzb3VyY2VJbmRleCA8IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gZ2V0UmF3VmFsdWUg5YyF5ZCrIGRpc2FibGVkIOWtl+aute+8m+WkjeWItuihjOS9v+eUqOaWsOeahCBfaGRSb3dJZFxuICAgIGNvbnN0IHNvdXJjZVZhbHVlcyA9IGxpbmUuZ2V0UmF3VmFsdWUoKTtcbiAgICBjb25zdCBpbnNlcnRBdCA9IHNvdXJjZUluZGV4ICsgMTtcbiAgICB0aGlzLmxpbmVzRm9ybUFycmF5Lmluc2VydChcbiAgICAgIGluc2VydEF0LFxuICAgICAgdGhpcy5jcmVhdGVMaW5lRnJvbVZhbHVlcyhzb3VyY2VWYWx1ZXMsIGZhbHNlLCB0cnVlKSxcbiAgICApO1xuICAgIHRoaXMuY2FsY3VsYXRlTGluZU51bWJlcigpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jb2xsZWN0RG9tRGF0YSgpO1xuICAgICAgdGhpcy5hY3RpdmVEb21YID0gdGhpcy50b1BhZ2VMb2NhbFJvd0luZGV4KGluc2VydEF0KTtcbiAgICAgIHRoaXMuYWN0aXZlRG9tWSA9IDA7XG4gICAgICB0aGlzLmZvY3VzRG9tKHRoaXMuYWN0aXZlRG9tWCwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIEBPdXRwdXQoKSBkZWxldGVMaW5lRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLyoqXG4gICAqIOWIoOmZpOihjFxuICAgKiBAcGFyYW0gbGluZU9ySW5kZXgg6KGMIEZvcm1Hcm91cO+8jOaIliAxLWJhc2VkIOeahCBsaW5lSW5kZXjvvIjlhbzlrrkgcmVzZXRGb3Jt77yJXG4gICAqL1xuICBkZWxldGVGb3JtTGluZShsaW5lT3JJbmRleDogRm9ybUdyb3VwIHwgbnVtYmVyKSB7XG4gICAgbGV0IHJlbW92ZUF0ID0gLTE7XG4gICAgaWYgKHR5cGVvZiBsaW5lT3JJbmRleCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgcmVtb3ZlQXQgPSBsaW5lT3JJbmRleCAtIDE7XG4gICAgfSBlbHNlIGlmIChsaW5lT3JJbmRleCkge1xuICAgICAgcmVtb3ZlQXQgPSB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmluZGV4T2YobGluZU9ySW5kZXgpO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIFwiaW5kZXhcIixcbiAgICAgIHR5cGVvZiBsaW5lT3JJbmRleCA9PT0gXCJudW1iZXJcIiA/IGxpbmVPckluZGV4IDogcmVtb3ZlQXQsXG4gICAgKTtcbiAgICBpZiAocmVtb3ZlQXQgPCAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIOacgOWQjuS4gOadoeaVsOaNrueahOaXtuWAmeimgeWIpOaWreS4gOS4i1xuICAgIGlmICh0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aCA9PT0gMSAmJiAhdGhpcy5hbGxvd0VtcHR5KSB7XG4gICAgICBpZiAodGhpcy5kZWxldGVMYXN0TGluZUV2ZW50KSB7XG4gICAgICAgIHRoaXMuZGVsZXRlTGFzdExpbmVFdmVudC5lbWl0KCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlbW92ZWRMaW5lID0gdGhpcy5saW5lc0Zvcm1BcnJheS5hdChyZW1vdmVBdCkgYXMgRm9ybUdyb3VwO1xuICAgIHRoaXMubGluZXNGb3JtQXJyYXkucmVtb3ZlQXQocmVtb3ZlQXQpO1xuICAgIHRoaXMucmVtb3ZlTGluZUZyb21TZWxlY3Rpb24ocmVtb3ZlZExpbmUpO1xuICAgIGlmIChcbiAgICAgICF0aGlzLmlzRmlsdGVyRGF0YSAmJlxuICAgICAgdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scyAmJlxuICAgICAgdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5sZW5ndGggPT09IDAgJiZcbiAgICAgICF0aGlzLmlzVHJ1bHlFbXB0eUFsbG93ZWRcbiAgICApIHtcbiAgICAgIHRoaXMuYWRkRm9ybUxpbmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g5b2T5YmN6aG15bey5peg5pWw5o2u5pe25Zue6YCA6aG156CB77yM5LiU6aG156CB5pyA5bCP5Li6IDHvvIjpgb/lhY3liKDnqbrlkI7lj5jmiJAgMCDlr7zoh7Tlho3mt7vliqDnnIvkuI3op4HvvIlcbiAgICAgIGNvbnN0IG1heFBhZ2UgPSBNYXRoLm1heChcbiAgICAgICAgMSxcbiAgICAgICAgTWF0aC5jZWlsKFxuICAgICAgICAgIHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoIC8gdGhpcy5wYWdpbmF0aW9uUGFnZVNpemUsXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgaWYgKHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCA+IG1heFBhZ2UpIHtcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4ID0gbWF4UGFnZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2FsY3VsYXRlTGluZU51bWJlcigpO1xuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY29sbGVjdERvbURhdGEoKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKiDlnKjmjIflrprooYzlkI7mlrnnmoTmj5LlhaXkuIvmoIfvvJvml6DooYzliJnov73liqDliLDmnKvlsL4gKi9cbiAgcHJpdmF0ZSBnZXRJbnNlcnRJbmRleEFmdGVyKGFmdGVyTGluZT86IEZvcm1Hcm91cCB8IG51bGwpOiBudW1iZXIge1xuICAgIGlmICghYWZ0ZXJMaW5lKSB7XG4gICAgICByZXR1cm4gdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5sZW5ndGg7XG4gICAgfVxuICAgIGNvbnN0IGlkeCA9IHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMuaW5kZXhPZihhZnRlckxpbmUpO1xuICAgIHJldHVybiBpZHggPj0gMCA/IGlkeCArIDEgOiB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aDtcbiAgfVxuXG4gIC8qKiDlhajlsYDooYzkuIvmoIfovazlvZPliY3pobXlhoXnmoTooYzkuIvmoIfvvIjkvpvogZrnhKbnlKjvvIkgKi9cbiAgcHJpdmF0ZSB0b1BhZ2VMb2NhbFJvd0luZGV4KGdsb2JhbEluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiAoXG4gICAgICBnbG9iYWxJbmRleCAtICh0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXggLSAxKSAqIHRoaXMucGFnaW5hdGlvblBhZ2VTaXplXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBwYWdlSW5kZXhDaGFuZ2UoZXZlbnQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCA9IGV2ZW50O1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jb2xsZWN0RG9tRGF0YSgpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcHVibGljIHBhZ2VTaXplQ2hhbmdlKGV2ZW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZSA9IGV2ZW50O1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jb2xsZWN0RG9tRGF0YSgpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkhkRm9ybVZhbHVlQ2hhbmdlZChkYXRhPzogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNGaWx0ZXJEYXRhKSB7XG4gICAgICBpZiAoZGF0YSAmJiBkYXRhLmxpbmVzICYmIHRoaXMuZmlsdGVySW5kZXhTdG9yZS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgY29uc3QgbGluZXMgPSBkYXRhLmxpbmVzO1xuICAgICAgICBpZiAobGluZXMubGVuZ3RoID09PSB0aGlzLmZpbHRlckluZGV4U3RvcmUubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5maWx0ZXJJbmRleFN0b3JlLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YVtpdGVtXSA9IHtcbiAgICAgICAgICAgICAgLi4udGhpcy5maWx0ZXJTdG9yZUZvcm1MaW5lc0RhdGFbaW5kZXhdLFxuICAgICAgICAgICAgICAuLi5saW5lc1tpbmRleF0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGxpbmVzLmxlbmd0aCA+IHRoaXMuZmlsdGVySW5kZXhTdG9yZS5sZW5ndGgpIHtcbiAgICAgICAgICAvLyDmnInmlrDlop7mlbDmja7nmoTmg4XlhrVcbiAgICAgICAgICAvLyBzdGVwIDE6IOWFiOaJvuaWsOWinueahGluZGV45LiL5qCHXG4gICAgICAgICAgY29uc3QgZ2V0Tm93TGluZXMgPSB0aGlzLnZhbGlkYXRlSGRGb3JtTGluZXMuZ2V0UmF3VmFsdWUoKS5saW5lcztcbiAgICAgICAgICBsZXQgYWRkSW5kZXggPSAtMTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdldE5vd0xpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZ2V0Tm93TGluZXNbaV0uaXNIZEZvcm1MaW5lU2VhcmNoQWRkKSB7XG4gICAgICAgICAgICAgIGFkZEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhZGRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhLnNwbGljZShcbiAgICAgICAgICAgICAgdGhpcy5maWx0ZXJJbmRleFN0b3JlW2FkZEluZGV4IC0gMV0gKyAxLFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICBnZXROb3dMaW5lc1thZGRJbmRleF0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmZpbHRlckluZGV4U3RvcmUucHVzaCh0aGlzLmZpbHRlckluZGV4U3RvcmVbYWRkSW5kZXggLSAxXSArIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIOacieWIoOmZpOaVsOaNrueahOaDheWGtVxuICAgICAgICAgIC8vIHN0ZXAgMTrlhYjmib7liLDliKDpmaTnmoRpbmRleOS4i+agh1xuICAgICAgICAgIGxldCBkZWxldGVkSW5kZXggPSAtMTtcbiAgICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICAgIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGRlbGV0ZWRJbmRleCA9IDA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgaWYgKGxpbmVzW2ldLmxpbmVJbmRleCAtIGNvdW50ID4gMSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZWRJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGRlbGV0ZWRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIC8vIHN0ZXAgMjog5Yig6Zmk5oC75pWw5o2u5Lit55qE5a+55bqU5pWw5o2uLCDmiorkuIvmoIfmlbDnu4TlkoxsaW5lc+mVv+W6puWvuem9kO+8jOWQjOaXtuaKiuS4i+agh+aVsOe7hOWcqGRlbGV0ZWRJbmRleOWQjumdoueahOWAvOWFqOmDvS0xXG4gICAgICAgICAgICB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YSA9IHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhLmZpbHRlcihcbiAgICAgICAgICAgICAgKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4ICE9PSB0aGlzLmZpbHRlckluZGV4U3RvcmVbZGVsZXRlZEluZGV4XTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmZpbHRlckluZGV4U3RvcmUuc3BsaWNlKGRlbGV0ZWRJbmRleCwgMSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZmlsdGVySW5kZXhTdG9yZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBpZiAoaSA+PSBkZWxldGVkSW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckluZGV4U3RvcmVbaV0tLTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBzdGVwIDI6IOayoeacieaJvuWIsGRlbGV0ZWRJbmRleOivtOaYjuWIoOmZpOaTjeS9nOWcqOacgOWQjuS4gOihjFxuICAgICAgICAgICAgY29uc3QgZmlsdGVySW5kZXggPVxuICAgICAgICAgICAgICB0aGlzLmZpbHRlckluZGV4U3RvcmVbdGhpcy5maWx0ZXJJbmRleFN0b3JlLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEgPSB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YS5maWx0ZXIoXG4gICAgICAgICAgICAgIChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbmRleCAhPT0gZmlsdGVySW5kZXg7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJJbmRleFN0b3JlLnBvcCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5saW5lcykge1xuICAgICAgICAgIHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhID0gZGF0YS5saW5lcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZGF0YSAmJiBkYXRhLmxpbmVzKSB7XG4gICAgICAgIHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhID0gZGF0YS5saW5lcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDmgLvooajljZVcbiAgICBpZiAoIXRoaXMuaXNGaWx0ZXJEYXRhKSB7XG4gICAgICB0aGlzLmZvcm1WYWxpZCA9IHRoaXMudmFsaWRhdGVIZEZvcm1MaW5lcy52YWxpZDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuZm9ybVZhbGlkKSB7XG4gICAgICAgIC8vIOWmguaenOaVtOS9k+ihqOWNleaYr3RydWXvvIzkuI3nrqHlrZDooajljZXmmK/ku4DkuYjvvIzpg73lj5jmiJDlrZDooajljZXnmoTnirbmgIFcbiAgICAgICAgdGhpcy5mb3JtVmFsaWQgPSB0aGlzLnZhbGlkYXRlSGRGb3JtTGluZXMudmFsaWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDlpoLmnpzmlbTkvZPooajljZXmmK9mYWxzZe+8mjHjgIHlrZDooajljZXkuLp0cnVl77yM6ZyA6KaB6YeN566X77ybMuOAgeWtkOihqOWNleS4umZhbHNl77yM55So5a2Q6KGo5Y2V54q25oCBXG4gICAgICAgIGlmICh0aGlzLnZhbGlkYXRlSGRGb3JtTGluZXMudmFsaWQpIHtcbiAgICAgICAgICB0aGlzLmZvcm1WYWxpZCA9IHRoaXMuaW5uZXJHZXRWYWxpZCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZm9ybVZhbGlkID0gdGhpcy52YWxpZGF0ZUhkRm9ybUxpbmVzLnZhbGlkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHRoaXMuY2FsY3VsYXRlTGluZU51bWJlcigpO1xuICAgIHRoaXMuY2hhbmdlRXZlbnQuZW1pdCh0aGlzLnZhbGlkYXRlSGRGb3JtTGluZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0xpc3QobGlzdDogQXJyYXk8Rm9ybUxpbmU+KTogYm9vbGVhbiB7XG4gICAgaWYgKCFsaXN0IHx8IChsaXN0ICYmIGxpc3QubGVuZ3RoID09PSAwKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgbmFtZUxpc3QgPSBbXTtcbiAgICBsZXQgc2VsZWN0T3B0aW9uQ2hlY2tMaXN0ID0gW107XG4gICAgbGlzdC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAvLyDmoKHpqozljZXpobnpgInmi6nlmahcbiAgICAgIC8vIGlmIChpdGVtLnR5cGUgPT09IEZvcm1MaW5lVHlwZS5TZWxlY3QgJiYgKCFpdGVtLnNlbGVjdExpc3QgfHwgKGl0ZW0uc2VsZWN0TGlzdCAmJiBpdGVtLnNlbGVjdExpc3QubGVuZ3RoID09PSAwKSkpIHtcbiAgICAgIC8vICAgdGhyb3cgJ2Zvcm1MaW5lc+e7hOS7tuaVsOaNruagvOW8j+S4jeinhOiMg++8jOWtmOWcqOWNlemhuemAieaLqeWZqOayoeacieS8oOWFpemAiemhuSEnXG4gICAgICAvLyB9XG4gICAgICBuYW1lTGlzdC5wdXNoKGl0ZW0ubmFtZSk7XG5cbiAgICAgIC8vIOagoemqjOaciW9uU2VhcmNo55qE5a2X5q6155qEc2VsZWN0T3B0aW9u55qEdmFsdWXjgIFsYWJlbOaYr+WQpuWcqGZvcm1MaW5l6YeM6Z2i6YO95a6a5LmJ5LqGXG4gICAgICBpZiAoaXRlbS5vblNlYXJjaEV2ZW50ICYmIGl0ZW0uc2VsZWN0T3B0aW9uKSB7XG4gICAgICAgIHNlbGVjdE9wdGlvbkNoZWNrTGlzdCA9IFtdO1xuICAgICAgICBsaXN0LmZvckVhY2goKGlubmVySXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGlubmVySXRlbS5uYW1lID09PSBpdGVtLnNlbGVjdE9wdGlvbi52YWx1ZSB8fFxuICAgICAgICAgICAgaW5uZXJJdGVtLm5hbWUgPT09IGl0ZW0uc2VsZWN0T3B0aW9uLmxhYmVsXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBzZWxlY3RPcHRpb25DaGVja0xpc3QucHVzaChpbm5lckl0ZW0ubmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHNlbGVjdE9wdGlvbkNoZWNrTGlzdC5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgdGhyb3cgYGZvcm1MaW5lc+e7hOS7tuaVsOaNruagvOW8j+S4jeinhOiMg++8jOWtl+autSR7aXRlbS5uYW1lfeeahHNlbGVjdE9wdGlvbueahHZhbHVl44CBbGFiZWzlrZfmrrXmnKrog73lnKhmb3JtTGluZXPkuK3mib7liLDlr7nlupTlrZfmrrXvvIFgO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8g5qCh6aqMbmFtZeaYr+WQpumHjeWkjVxuICAgIGlmIChbLi4ubmV3IFNldChuYW1lTGlzdCldLmxlbmd0aCAhPT0gbGlzdC5sZW5ndGgpIHtcbiAgICAgIHRocm93IFwiZm9ybUxpbmVz57uE5Lu25pWw5o2u5qC85byP5LiN6KeE6IyD77yM5a2Y5Zyo6YeN5aSNbmFtZeWAvCFcIjtcbiAgICB9XG4gICAgLy8gLi4ubW9yZSBjaGVja1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHN1Ym1pdEZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5jaGFuZ2VFdmVudC5lbWl0KHRoaXMudmFsaWRhdGVIZEZvcm1MaW5lcy5nZXRSYXdWYWx1ZSgpKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldEZvcm0oKTogdm9pZCB7XG4gICAgLy8g5Yig6ZmkXG4gICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgIGZvciAobGV0IGkgPSB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHRoaXMuZGVsZXRlRm9ybUxpbmUoaSk7XG4gICAgfVxuICAgIHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCA9IDE7XG4gIH1cblxuICBwdWJsaWMgaW5wdXRDbGVhbihmb3JtSXRlbTogYW55LCBsaW5lOiBhbnkpOiB2b2lkIHtcbiAgICBsaW5lLmdldChmb3JtSXRlbS5uYW1lKS5zZXRWYWx1ZShudWxsKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RWYWx1ZShpZDogc3RyaW5nLCByb3dOdW1iZXI6IG51bWJlciwgY29sTnVtYmVyOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dERvbTogYW55ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihpZCk7XG4gICAgaW5wdXREb20uc2VsZWN0KCk7XG4gICAgdGhpcy5zZXRBY3RpdmVEb21JbkZvcm1MaW5lcyhyb3dOdW1iZXIsIGNvbE51bWJlcik7XG4gIH1cblxuICBwcml2YXRlIHRleHRXaWR0aENhY2hlOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG5cbiAgaXNUZXh0T3ZlcmZsb3codGV4dDogc3RyaW5nLCBtYXhXaWR0aDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2FjaGVkV2lkdGggPSB0aGlzLnRleHRXaWR0aENhY2hlW3RleHRdO1xuICAgIGlmIChjYWNoZWRXaWR0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkV2lkdGggKyAxNSA+PSBtYXhXaWR0aDtcbiAgICB9XG5cbiAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgc3Bhbi5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgICBzcGFuLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgIHNwYW4uc3R5bGUud2hpdGVTcGFjZSA9IFwibm93cmFwXCI7XG4gICAgc3Bhbi5zdHlsZS5mb250U2l6ZSA9IFwiMTRweFwiO1xuICAgIHNwYW4uc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7IC8vIOWwhuagt+W8j+S/ruaUueS4uiBpbmxpbmUtYmxvY2tcbiAgICBzcGFuLmlubmVyVGV4dCA9IHRleHQ7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzcGFuKTtcbiAgICBjb25zdCBpc092ZXJmbG93ID0gc3Bhbi5vZmZzZXRXaWR0aCArIDE1ID49IG1heFdpZHRoO1xuICAgIHRoaXMudGV4dFdpZHRoQ2FjaGVbdGV4dF0gPSBzcGFuLm9mZnNldFdpZHRoO1xuICAgIHNwYW4uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc3Bhbik7XG4gICAgcmV0dXJuIGlzT3ZlcmZsb3c7XG4gIH1cblxuICBqdWRnZUNvbEVtcHR5KHN0cjogYW55KSB7XG4gICAgaWYgKHN0ciB8fCBzdHIgPT09IDApIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcIjznqbo+XCI7XG4gICAgfVxuICB9XG5cbiAganVkZ2VWYWx1ZUlzTm90RW1wdHkoc3RyOiBhbnkpIHtcbiAgICBpZiAoc3RyID09PSBudWxsICYmIHN0ciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxufVxuIl19
2794
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGQtZm9ybS1saW5lcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9mYW50YXN5LW5nem9ycm8vIiwic291cmNlcyI6WyJoZC1mb3JtLWxpbmVzL2hkLWZvcm0tbGluZXMuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBRVQsV0FBVyxFQUNYLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWEsV0FBVyxFQUFhLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDL0IsT0FBTyxFQUNMLFlBQVksRUFDWixxQkFBcUIsRUFDckIsc0JBQXNCLEVBQ3RCLHNCQUFzQixFQUN0QixpQkFBaUIsRUFDakIscUJBQXFCLEdBQ3RCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUc5QyxPQUFPLEVBQVksWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7O0lBRzNELHNDQUFzQyxHQUFHLEVBQUU7QUFFakQ7SUF1RkUsOEJBQ1UsRUFBZSxFQUNmLEdBQXNCO1FBRmhDLGlCQWNDO1FBYlMsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBakZQLG1CQUFjLEdBQVksSUFBSSxDQUFDO1FBQy9CLGVBQVUsR0FBWSxJQUFJLENBQUM7UUFDMUMsd0JBQW1CLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMxQiwyQkFBc0IsR0FBWSxLQUFLLENBQUM7UUFDeEMsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIsZUFBVSxHQUFZLEtBQUssQ0FBQzs7OztRQUU1QixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUk5QyxtQkFBYyxHQUFrQixDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLDRCQUE0Qjs7UUFDL0UsV0FBTSxHQUE4QixFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUNoRCxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7Ozs7UUFFakMsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBZSxDQUFDO1FBQ25DLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQUM1RCx3QkFBbUIsR0FBVyxDQUFDLENBQUM7UUFDaEMsdUJBQWtCLEdBQVcsRUFBRSxDQUFDOztRQU1QLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0MsZ0JBQVcsR0FBdUIsRUFBRSxDQUFDO1FBQ3JDLGtCQUFhLEdBQW9CLENBQUMsQ0FBQztRQUM1QyxvQkFBZSxHQUFHLEVBQUUsQ0FBQztRQUVyQixhQUFRLEdBQVksS0FBSyxDQUFDO1FBRTFCLHVCQUFrQixHQUFRLEVBQUUsQ0FBQyxDQUFDLFlBQVk7O1FBQzFDLDZCQUF3QixHQUFRLEVBQUUsQ0FBQyxDQUFDLFlBQVk7O1FBQ2hELHFCQUFnQixHQUFrQixFQUFFLENBQUMsQ0FBQyxtQkFBbUI7O1FBQ3pELGlCQUFZLEdBQVksS0FBSyxDQUFDLENBQUMsY0FBYzs7UUFDN0MsY0FBUyxHQUFZLEtBQUssQ0FBQyxDQUFDLFVBQVU7Ozs7O1FBRTlCLG1CQUFjLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUNuQyxrQkFBYSxHQUFHLElBQUksT0FBTyxFQUFzQyxDQUFDO1FBQ2xFLG9CQUFlLEdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUt0QyxzQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBc0MsQ0FBQztRQUN0RSw4QkFBeUIsR0FBVyxDQUFDLENBQUM7O1FBSTlDLG1CQUFjLEdBU1YsRUFBRSxDQUFDOztRQUVQLGVBQVUsR0FBVyxJQUFJLENBQUM7UUFDMUIsZUFBVSxHQUFXLElBQUksQ0FBQztRQUMxQixjQUFTLEdBTW1CLElBQUksQ0FBQztRQUNqQyxnQ0FBMkIsR0FBWSxLQUFLLENBQUM7UUE4eUNuQyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUF1UHZDLG1CQUFjLEdBQThCLEVBQUUsQ0FBQztRQXZoRHJELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsYUFBYTthQUN6QyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQzthQUN4QyxTQUFTOzs7O1FBQUMsVUFBQyxFQUFtQjtnQkFBakIsVUFBRSxFQUFFLGdCQUFLLEVBQUUsY0FBSTtZQUFPLE9BQUEsS0FBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQztRQUFsQyxDQUFrQyxFQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxpQkFBaUI7YUFDakQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQzthQUNsRCxTQUFTOzs7O1FBQUMsVUFBQyxFQUFtQjtnQkFBakIsVUFBRSxFQUFFLGdCQUFLLEVBQUUsY0FBSTtZQUMzQixJQUFJLEtBQUssRUFBRTtnQkFDVCxLQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDcEM7UUFDSCxDQUFDLEVBQUMsQ0FBQztJQUNQLENBQUM7Ozs7SUFFRCx1Q0FBUTs7O0lBQVI7UUFDRSxhQUFhO1FBQ2IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDN0MsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQzs7OztJQUVELDhDQUFlOzs7SUFBZjtRQUFBLGlCQUtDO1FBSkMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFNBQVM7OztRQUFDO1lBQ2pFLEtBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN4QixDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7SUFFRCwwQ0FBVzs7O0lBQVg7UUFDRSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUMzQixJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDdkM7UUFDRCxJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtZQUMvQixJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDM0M7UUFDRCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUM1QixJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDeEM7SUFDSCxDQUFDO0lBRUQsc0JBQUksaURBQWU7Ozs7UUFBbkI7WUFDRSxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUM3QyxDQUFDOzs7T0FBQTtJQUVELHNCQUFJLGlEQUFlOzs7O1FBQW5COztnQkFDUSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU07Ozs7WUFBQyxVQUFDLEdBQUc7Z0JBQ25ELE9BQUEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFBdkMsQ0FBdUMsRUFDeEMsQ0FBQyxNQUFNO1lBQ1IsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbEMsQ0FBQzs7O09BQUE7SUFHRCxzQkFBSSxxREFBbUI7UUFEdkIsaURBQWlEOzs7OztRQUNqRDs7Z0JBQ1EsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNOzs7O1lBQUMsVUFBQyxHQUFHO2dCQUNyRCxPQUFBLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQXZDLENBQXVDLEVBQ3hDO1lBQ0QsT0FBTyxDQUNMLElBQUksQ0FBQyxVQUFVO2dCQUNmLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFDcEIsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsQ0FDeEIsQ0FBQztRQUNKLENBQUM7OztPQUFBO0lBR0Qsc0JBQUksZ0RBQWM7UUFEbEIsMEJBQTBCOzs7OztRQUMxQjtZQUNFLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDNUMsQ0FBQzs7O09BQUE7Ozs7O0lBRU8sNENBQWE7Ozs7SUFBckI7UUFDRSxPQUFPLFlBQVUsSUFBSSxDQUFDLEdBQUcsRUFBRSxTQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUcsQ0FBQztJQUMxRSxDQUFDOzs7Ozs7SUFFTyx1Q0FBUTs7Ozs7SUFBaEIsVUFBaUIsSUFBZTtRQUM5QixJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNsQyxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNwQyxDQUFDO0lBRUQsb0NBQW9DOzs7Ozs7SUFDNUIsa0RBQW1COzs7OztJQUEzQjs7WUFDUSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQjs7WUFDaEUsR0FBRyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsa0JBQWtCO1FBQzNDLE9BQU8sQ0FBQyxtQkFBQSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBZSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN6RSxDQUFDOzs7OztJQUVELDRDQUFhOzs7O0lBQWIsVUFBYyxJQUFlOztZQUNyQixFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDOUIsT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLENBQUM7Ozs7SUFFRCwyQ0FBWTs7O0lBQVo7UUFBQSxpQkFNQzs7WUFMTyxTQUFTLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFO1FBQzVDLE9BQU8sQ0FDTCxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDcEIsU0FBUyxDQUFDLEtBQUs7Ozs7WUFBQyxVQUFDLElBQUksSUFBSyxPQUFBLEtBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQXhCLENBQXdCLEVBQUMsQ0FDcEQsQ0FBQztJQUNKLENBQUM7Ozs7SUFFRCw4Q0FBZTs7O0lBQWY7UUFBQSxpQkFNQzs7WUFMTyxTQUFTLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFOztZQUN0QyxZQUFZLEdBQUcsU0FBUyxDQUFDLE1BQU07Ozs7UUFBQyxVQUFDLElBQUk7WUFDekMsT0FBQSxLQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztRQUF4QixDQUF3QixFQUN6QixDQUFDLE1BQU07UUFDUixPQUFPLFlBQVksR0FBRyxDQUFDLElBQUksWUFBWSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7SUFDN0QsQ0FBQzs7Ozs7SUFFRCwyQ0FBWTs7OztJQUFaLFVBQWEsT0FBZ0I7UUFBN0IsaUJBYUM7UUFaQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxPQUFPOzs7O1FBQUMsVUFBQyxJQUFJOztnQkFDaEMsRUFBRSxHQUFHLEtBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQzlCLElBQUksQ0FBQyxFQUFFLEVBQUU7Z0JBQ1AsT0FBTzthQUNSO1lBQ0QsSUFBSSxPQUFPLEVBQUU7Z0JBQ1gsS0FBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDN0I7aUJBQU07Z0JBQ0wsS0FBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDaEM7UUFDSCxDQUFDLEVBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7Ozs7OztJQUVELGtEQUFtQjs7Ozs7SUFBbkIsVUFBb0IsSUFBZSxFQUFFLE9BQWdCOztZQUM3QyxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDOUIsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNQLE9BQU87U0FDUjtRQUNELElBQUksT0FBTyxFQUFFO1lBQ1gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDN0I7YUFBTTtZQUNMLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ2hDO1FBQ0QsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0IsQ0FBQzs7Ozs7SUFFTyxrREFBbUI7Ozs7SUFBM0I7UUFDRSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQzs7Ozs7O0lBRU8sc0RBQXVCOzs7OztJQUEvQixVQUFnQyxJQUFlOztZQUN2QyxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDOUIsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDckMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7U0FDNUI7SUFDSCxDQUFDOzs7Ozs7OztJQUVPLGdEQUFpQjs7Ozs7OztJQUF6QixVQUNFLElBQWUsRUFDZixNQUFnQyxFQUNoQyxTQUFrQjtRQUhwQixpQkF3QkM7UUFuQkMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPOzs7O1FBQUMsVUFBQyxHQUFHOztnQkFDMUIsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQzNCLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsS0FBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkQsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDekI7WUFDRCxnREFBZ0Q7WUFDaEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUNwRCxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDM0MsT0FBTyxDQUFDLGVBQWUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzVDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ3JELElBQUksU0FBUyxFQUFFOztvQkFDUCxRQUFRLEdBQUcsS0FBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJOzs7O2dCQUFDLFVBQUMsSUFBSSxJQUFLLE9BQUEsSUFBSSxDQUFDLElBQUksS0FBSyxHQUFHLEVBQWpCLENBQWlCLEVBQUM7Z0JBQ2pFLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxhQUFhLEVBQUU7b0JBQ3RDLEtBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7aUJBQzlEO2FBQ0Y7UUFDSCxDQUFDLEVBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7T0FHRzs7Ozs7Ozs7SUFDSCx1REFBd0I7Ozs7Ozs7SUFBeEIsVUFBeUIsSUFBZSxFQUFFLFFBQWtCOztZQUNwRCxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRTtZQUNoQyxPQUFPLEVBQUUsQ0FBQztTQUNYOztZQUNLLEtBQUssR0FDVCxPQUFPLENBQUMsS0FBSyxLQUFLLElBQUk7WUFDdEIsT0FBTyxDQUFDLEtBQUssS0FBSyxTQUFTO1lBQzNCLE9BQU8sQ0FBQyxLQUFLLEtBQUssRUFBRTtRQUN0QixJQUNFLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQ2xDLEtBQUs7WUFDTCxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUM1QjtZQUNBLE9BQU8sT0FBTyxDQUFDO1NBQ2hCO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQscURBQXFEOzs7Ozs7OztJQUNyRCwrQ0FBZ0I7Ozs7Ozs7SUFBaEIsVUFBaUIsS0FBWSxFQUFFLElBQWUsRUFBRSxRQUFrQjtRQUNoRSxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRTtZQUNwQyxPQUFPO1NBQ1I7O1lBQ0ssS0FBSyxHQUFHLG1CQUFBLEtBQUssQ0FBQyxNQUFNLEVBQW9CO1FBQzlDLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLFNBQVMsRUFBRTs7Z0JBQzdELElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQztZQUNyRCxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQzs7Z0JBQ2IsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUN2QyxJQUFJLE9BQU8sRUFBRTtnQkFDWCxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3hCO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsc0NBQXNDOzs7OztJQUMvQiwrQ0FBZ0I7Ozs7SUFBdkI7UUFBQSxpQkFJQztRQUhDLE9BQU8sQ0FBQyxtQkFBQSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBZSxDQUFDLENBQUMsTUFBTTs7OztRQUFDLFVBQUMsSUFBSTtZQUMvRCxPQUFBLEtBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO1FBQXhCLENBQXdCLEVBQ3pCLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7Ozs7O0lBQ0ksbURBQW9COzs7O0lBQTNCO1FBQUEsaUJBMkJDOztZQTFCTyxNQUFNLEdBQUcsRUFBRTs7WUFDWCxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQWU7UUFDMUMsQ0FBQyxtQkFBQSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBZSxDQUFDLENBQUMsT0FBTzs7OztRQUFDLFVBQUMsSUFBSTs7Z0JBQ25ELEVBQUUsR0FBRyxLQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUM5QixJQUFJLEVBQUUsSUFBSSxLQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRTtnQkFDckMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7YUFDekM7UUFDSCxDQUFDLEVBQUMsQ0FBQztRQUVILENBQUMsSUFBSSxDQUFDLGtCQUFrQixJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU87Ozs7UUFBQyxVQUFDLElBQUk7O2dCQUNyQyxFQUFFLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRO1lBQ2hDLElBQUksRUFBRSxJQUFJLEtBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUNyQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxzQkFBTSxJQUFJLENBQUUsQ0FBQyxDQUFDO2FBQ3RFO1FBQ0gsQ0FBQyxFQUFDLENBQUM7UUFFSCx3QkFBd0I7UUFDeEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPOzs7O1FBQUMsVUFBQyxFQUFFO1lBQzdCLElBQ0UsQ0FBQyxNQUFNLENBQUMsSUFBSTs7OztZQUFDLFVBQUMsSUFBSSxJQUFLLE9BQUEsSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssRUFBRSxFQUE1QixDQUE0QixFQUFDO2dCQUNwRCxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUNuQjtnQkFDQSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNsQztRQUNILENBQUMsRUFBQyxDQUFDO1FBQ0gsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7OztPQUtHOzs7Ozs7O0lBQ0ksZ0RBQWlCOzs7Ozs7SUFBeEIsVUFDRSxNQUFnQyxFQUNoQyxTQUF5QjtRQUYzQixpQkFtQ0M7UUFqQ0MsMEJBQUEsRUFBQSxnQkFBeUI7UUFFekIsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7WUFDN0MsT0FBTyxDQUFDLENBQUM7U0FDVjs7WUFDSyxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQXFCO1FBQ2hELENBQUMsbUJBQUEsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQWUsQ0FBQyxDQUFDLE9BQU87Ozs7UUFBQyxVQUFDLElBQUk7O2dCQUNuRCxFQUFFLEdBQUcsS0FBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDOUIsSUFBSSxFQUFFLEVBQUU7Z0JBQ04sV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDM0I7UUFDSCxDQUFDLEVBQUMsQ0FBQzs7WUFFQyxLQUFLLEdBQUcsQ0FBQztRQUNiLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTzs7OztRQUFDLFVBQUMsRUFBRTs7Z0JBQ3ZCLElBQUksR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNoQyxJQUFJLElBQUksRUFBRTtnQkFDUixLQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDaEQsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsT0FBTzthQUNSOzs7Z0JBRUssU0FBUyxHQUFHLENBQUMsS0FBSSxDQUFDLGtCQUFrQixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUk7Ozs7WUFDcEQsVUFBQyxJQUFJLElBQUssT0FBQSxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxFQUFFLEVBQTVCLENBQTRCLEVBQ3ZDO1lBQ0QsSUFBSSxTQUFTLEVBQUU7Z0JBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPOzs7O2dCQUFDLFVBQUMsR0FBRztvQkFDOUIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDL0IsQ0FBQyxFQUFDLENBQUM7Z0JBQ0gsS0FBSyxFQUFFLENBQUM7YUFDVDtRQUNILENBQUMsRUFBQyxDQUFDO1FBQ0gsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsV0FBVzs7Ozs7SUFDSiw2Q0FBYzs7OztJQUFyQjtRQUNFLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1lBQ2xDLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELHVCQUF1Qjs7Ozs7SUFDaEIsK0NBQWdCOzs7O0lBQXZCO1FBQ0UsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztJQUNsQyxDQUFDO0lBR0Qsc0JBQUksNkNBQVc7UUFEZixnQkFBZ0I7Ozs7O1FBQ2hCO1lBQ0UsT0FBTyxDQUNMLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVTtnQkFDakIsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZO2dCQUNuQixDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQjtnQkFDMUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FDNUIsQ0FBQztRQUNKLENBQUM7OztPQUFBOzs7OztJQUVELDZEQUE4Qjs7OztJQUE5QixVQUErQixLQUFjO1FBQTdDLGlCQTJCQztRQTFCQyxJQUFJLENBQUMsMkJBQTJCLEdBQUcsS0FBSyxDQUFDO1FBQ3pDLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtZQUNsQixVQUFVOzs7WUFBQzs7b0JBQ0gsT0FBTyxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FDdkMsc0NBQXNDLENBQ3ZDO2dCQUNELElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7O3dCQUNoQixHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQztvQkFDdEIsR0FBRzt5QkFDQSxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQzt5QkFDckMsT0FBTzs7OztvQkFBQyxVQUFDLE1BQU0sSUFBSyxPQUFBLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBZixDQUFlLEVBQUMsQ0FBQzs7d0JBQ2xDLFFBQVEsR0FBRyxLQUFJLENBQUMsY0FBYyxDQUFDLEtBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSSxDQUFDLFNBQVMsQ0FBQztvQkFDckUsR0FBRyxDQUFDLFlBQVksQ0FDZCxLQUFJLENBQUMsa0JBQWtCLENBQ3JCLEtBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQ3hCLEtBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FDaEMsQ0FBQyxLQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSSxDQUFDLGtCQUFrQixFQUN4RCxDQUFDLEtBQUksQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFJLENBQUMsa0JBQWtCO3dCQUN0RCxLQUFJLENBQUMsa0JBQWtCLENBQzFCLENBQUMsS0FBSSxDQUFDLFVBQVUsQ0FBQyxDQUNuQixFQUNELEdBQUcsQ0FBQyxVQUFVLENBQ2YsQ0FBQztpQkFDSDtZQUNILENBQUMsR0FBRSxDQUFDLENBQUMsQ0FBQztTQUNQO0lBQ0gsQ0FBQzs7Ozs7SUFFRCx3REFBeUI7Ozs7SUFBekIsVUFBMEIsTUFBK0I7UUFHdkQsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDNUIsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztTQUMzQjtRQUNELE9BQU8sRUFBRSxLQUFLLEVBQUssTUFBTSxDQUFDLEtBQUssT0FBSSxFQUFFLENBQUM7SUFDeEMsQ0FBQzs7Ozs7O0lBRUQsaURBQWtCOzs7OztJQUFsQixVQUFtQixRQUFRLEVBQUUsSUFBSTtRQUFqQyxpQkFxQ0M7OztZQW5DTyxjQUFjLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7UUFDcEQsY0FBYyxDQUFDLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQztRQUM5QyxjQUFjLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBTSxzQ0FBc0MsT0FBSSxDQUFDO1FBQ2pGLGNBQWMsQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFNLHNDQUFzQyxPQUFJLENBQUM7UUFFbEYsa0JBQWtCO1FBQ2xCLG9KQUFvSjtRQUNwSixLQUFLO1FBQ0wsd01BQXdNO1FBRXhNLHFEQUFxRDtRQUNyRCw0QkFBNEI7UUFDNUIsUUFBUSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsT0FBTzs7OztRQUFDLFVBQUMsdUJBQXVCOztnQkFDM0QsU0FBUyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO1lBQy9DLFNBQVMsQ0FBQyxTQUFTLEdBQUcseUJBQXlCLENBQUM7O2dCQUUxQyxVQUFVLEdBQUcsS0FBSSxDQUFDLHlCQUF5QixDQUMvQyx1QkFBdUIsQ0FDeEI7WUFDRCxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO1lBRXpDLFVBQVU7WUFDVixJQUFJLHVCQUF1QixDQUFDLEtBQUssRUFBRTs7b0JBQzNCLFNBQVMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUN2Qyx1QkFBdUIsQ0FBQyxLQUFLLENBQzlCO2dCQUNELFNBQVMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDbEM7WUFFRCxrQkFBa0I7WUFDbEIsY0FBYyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4QyxDQUFDLEVBQUMsQ0FBQztRQUNILElBQUk7UUFFSixPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDOzs7O0lBRUQsNkNBQWM7OztJQUFkO1FBQ0UsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7O1lBQ25CLFdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFOzs7WUFFN0MsVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0I7O1lBQ3JFLFFBQVEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGtCQUFrQjs7WUFDN0QsZ0JBQWdCLEdBQ3BCLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxRQUFROztZQUM3RCxlQUFlLEdBQUcsZ0JBQWdCLEdBQUcsVUFBVTs7WUFFL0MsUUFBUSxHQUFHLFdBQVcsQ0FBQyxNQUFNLEdBQUcsZUFBZTtRQUNyRCw2QkFBNkI7UUFDN0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGVBQWUsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1NBQzNEO1FBQ0QsSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7T0FHRzs7Ozs7OztJQUNLLDZEQUE4Qjs7Ozs7O0lBQXRDO1FBQ0UsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29DQUMxQyxDQUFDOztvQkFDRixHQUFHLEdBQUcsT0FBSyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLEdBQUcsWUFBWSxzQkFBc0IsRUFBRTtvQkFDekMsR0FBRyxDQUFDLFNBQVM7Ozs7b0JBQUcsVUFBQyxDQUFnQjt3QkFDL0IsSUFBSSxDQUFDLENBQUMsT0FBTyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxLQUFLLEVBQUUsRUFBRTs0QkFDeEMsT0FBTzt5QkFDUjt3QkFDRCxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssRUFBRSxFQUFFOzRCQUNwQixHQUFHLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzt5QkFDeEI7b0JBQ0gsQ0FBQyxDQUFBLENBQUM7aUJBQ0g7OztZQVhILEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7d0JBQTdDLENBQUM7YUFZVDtTQUNGO0lBQ0gsQ0FBQztJQUVELFdBQVc7Ozs7Ozs7SUFDWCw4Q0FBZTs7Ozs7OztJQUFmLFVBQWdCLENBQVMsRUFBRSxDQUFTO1FBQ2xDLElBQ0UsQ0FBQyxLQUFLLElBQUk7WUFDVixDQUFDLEtBQUssSUFBSTtZQUNWLENBQUMsSUFBSSxDQUFDLGNBQWM7WUFDcEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUNoQztZQUNBLE9BQU87U0FDUjtRQUNELG1CQUFtQjtRQUNuQixJQUNFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxZQUFZLGlCQUFpQixDQUFDO1lBQzlDLENBQUMsS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ3BDLENBQUMsS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQ3ZDO1lBQ0EsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7U0FDM0I7YUFBTTtZQUNMLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDckIsd0JBQXdCO2dCQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2FBQ2xDO2lCQUFNO2dCQUNMLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3JCLHlCQUF5QjtnQkFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQzthQUNsQztTQUNGO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRzs7Ozs7O0lBQ0gsaURBQWtCOzs7OztJQUFsQjtRQUFBLGlCQThCQztRQTdCQyw0QkFBNEI7UUFDNUIsc0JBQXNCO1FBQ3RCLDJCQUEyQjtRQUMzQixJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsRUFBRTtZQUNuRCxhQUFhO1lBQ2IsSUFDRSxJQUFJLENBQUMsbUJBQW1CO2dCQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQ3pEO2dCQUNBLGdCQUFnQjtnQkFDaEIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBQzNCLFVBQVU7OztnQkFBQztvQkFDVCxLQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3JCLEtBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDL0IsQ0FBQyxHQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ1A7aUJBQU07Z0JBQ0wsb0JBQW9CO2dCQUNwQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2dCQUMzQixVQUFVOzs7Z0JBQUM7b0JBQ1QsS0FBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUN0QixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUNyQixLQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDdEIsQ0FBQyxHQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ1A7U0FDRjthQUFNO1lBQ0wsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQztJQUVELFlBQVk7Ozs7Ozs7SUFDWiw4Q0FBZTs7Ozs7OztJQUFmLFVBQWdCLENBQVMsRUFBRSxDQUFTO1FBQXBDLGlCQW1DQztRQWxDQyxJQUNFLENBQUMsS0FBSyxJQUFJO1lBQ1YsQ0FBQyxLQUFLLElBQUk7WUFDVixDQUFDLElBQUksQ0FBQyxjQUFjO1lBQ3BCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDaEM7WUFDQSxPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN0Qiw4Q0FBOEM7WUFDOUMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxFQUFFO2dCQUNoQyxrQkFBa0I7Z0JBQ2xCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2dCQUMzQixVQUFVOzs7Z0JBQUM7b0JBQ1QsS0FBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUN0QixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUNyQixLQUFJLENBQUMsUUFBUSxDQUNYLEtBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDOUIsS0FBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUNsQyxDQUFDO2dCQUNKLENBQUMsR0FBRSxDQUFDLENBQUMsQ0FBQzthQUNQO1lBQ0QsT0FBTztTQUNSO2FBQU07WUFDTCxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ1gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDckIsd0JBQXdCO2dCQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2FBQ2pFO2lCQUFNO2dCQUNMLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3JCLHdCQUF3QjtnQkFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQzthQUNqQztTQUNGO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHOzs7Ozs7OztJQUNILHVDQUFROzs7Ozs7O0lBQVIsVUFBUyxDQUFTLEVBQUUsQ0FBUyxFQUFFLGFBQStCO1FBQS9CLDhCQUFBLEVBQUEsdUJBQStCO1FBQzVELElBQ0UsQ0FBQyxLQUFLLElBQUk7WUFDVixDQUFDLEtBQUssSUFBSTtZQUNWLENBQUMsSUFBSSxDQUFDLGNBQWM7WUFDcEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUNoQztZQUNBLE9BQU87U0FDUjtRQUNELGFBQWE7UUFDYixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JELElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFOztnQkFDakQsS0FBRyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLHNDQUFzQztZQUN0QyxJQUFJLEtBQUcsWUFBWSxpQkFBaUIsRUFBRTtnQkFDcEMsSUFBSSxLQUFHLENBQUMsVUFBVSxFQUFFO29CQUNsQixJQUFJLGFBQWEsS0FBSyxPQUFPLEVBQUU7d0JBQzdCLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO3FCQUM1Qjt5QkFBTSxJQUFJLGFBQWEsS0FBSyxNQUFNLEVBQUU7d0JBQ25DLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO3FCQUM1QjtvQkFDRCxPQUFPO2lCQUNSO2dCQUNELEtBQUcsQ0FBQywyQkFBMkIsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FDdkUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUMxRCxDQUFDO2dCQUNGLDhEQUE4RDtnQkFDOUQsSUFBSSxLQUFHLENBQUMsZUFBZSxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUU7b0JBQzNDLFVBQVU7OztvQkFBQzt3QkFDVCxLQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ2QsQ0FBQyxHQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUNQO3FCQUFNO29CQUNMLEtBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDYjthQUNGO2lCQUFNLElBQUksS0FBRyxZQUFZLHNCQUFzQixFQUFFO2dCQUNoRCxJQUFJLEtBQUcsQ0FBQyxVQUFVLEVBQUU7b0JBQ2xCLElBQUksYUFBYSxLQUFLLE9BQU8sRUFBRTt3QkFDN0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7cUJBQzVCO3lCQUFNLElBQUksYUFBYSxLQUFLLE1BQU0sRUFBRTt3QkFDbkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7cUJBQzVCO29CQUNELE9BQU87aUJBQ1I7O29CQUNLLFVBQVEsR0FBUSxRQUFRLENBQUMsY0FBYyxDQUFDLEtBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQ3ZELFVBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDakIsVUFBUSxDQUFDLGNBQWMsQ0FBQztvQkFDdEIsUUFBUSxFQUFFLFFBQVE7b0JBQ2xCLEtBQUssRUFBRSxRQUFRO29CQUNmLE1BQU0sRUFBRSxRQUFRO2lCQUNqQixDQUFDLENBQUM7Z0JBQ0gsVUFBVTs7O2dCQUFDO29CQUNULFVBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDcEIsQ0FBQyxHQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ1A7aUJBQU0sSUFBSSxLQUFHLFlBQVksVUFBVSxFQUFFO2dCQUNwQyxJQUFJLEtBQUcsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFO29CQUM5QixJQUFJLGFBQWEsS0FBSyxPQUFPLEVBQUU7d0JBQzdCLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO3FCQUM1Qjt5QkFBTSxJQUFJLGFBQWEsS0FBSyxNQUFNLEVBQUU7d0JBQ25DLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO3FCQUM1QjtvQkFDRCxPQUFPO2lCQUNSO2dCQUNELEtBQUcsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzFCLEtBQUcsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDO29CQUMvQixRQUFRLEVBQUUsUUFBUTtvQkFDbEIsS0FBSyxFQUFFLFFBQVE7b0JBQ2YsTUFBTSxFQUFFLFFBQVE7aUJBQ2pCLENBQUMsQ0FBQztnQkFDSCxVQUFVOzs7Z0JBQUM7b0JBQ1QsS0FBRyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDN0IsQ0FBQyxHQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ1A7aUJBQU0sSUFDTCxLQUFHLFlBQVkscUJBQXFCO2dCQUNwQyxLQUFHLFlBQVksc0JBQXNCO2dCQUNyQyxLQUFHLFlBQVkscUJBQXFCLEVBQ3BDO2dCQUNBLHVFQUF1RTtnQkFDdkUsSUFBSSxhQUFhLEtBQUssT0FBTyxFQUFFO29CQUM3QixJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDNUI7cUJBQU0sSUFBSSxhQUFhLEtBQUssTUFBTSxFQUFFO29CQUNuQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDNUI7Z0JBQ0QsT0FBTzthQUNSO1lBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDekI7YUFBTTtZQUNMLHVCQUF1QjtTQUN4QjtJQUNILENBQUM7Ozs7OztJQUVELDRDQUFhOzs7OztJQUFiLFVBQWMsQ0FBUyxFQUFFLENBQVM7UUFDaEMsSUFDRSxDQUFDLEtBQUssSUFBSTtZQUNWLENBQUMsS0FBSyxJQUFJO1lBQ1YsQ0FBQyxJQUFJLENBQUMsY0FBYztZQUNwQixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQ2hDO1lBQ0EsT0FBTztTQUNSO1FBQ0QsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7O2dCQUNqRCxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckMsSUFBSSxHQUFHLFlBQVksaUJBQWlCLEVBQUU7Z0JBQ3BDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDWCxHQUFHLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQzthQUNwQjtpQkFBTSxJQUFJLEdBQUcsWUFBWSxzQkFBc0IsRUFBRTtnQkFDaEQsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO2FBQ1o7aUJBQU0sSUFBSSxHQUFHLFlBQVksVUFBVSxFQUFFO2dCQUNwQyxHQUFHLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO2FBQzFCO2lCQUFNO2FBQ047U0FDRjtJQUNILENBQUM7Ozs7OztJQUVELDJDQUFZOzs7OztJQUFaLFVBQWEsQ0FBUyxFQUFFLENBQVM7UUFDL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkUsSUFBSSxJQUFJLENBQUMsU0FBUyxZQUFZLGlCQUFpQixFQUFFO1lBQy9DLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzFEO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7Ozs7Ozs7SUFDSCxzREFBdUI7Ozs7OztJQUF2QixVQUF3QixTQUFpQixFQUFFLFNBQWlCO1FBQzFELElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1FBQzVCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVEOzs7O09BSUc7Ozs7OztJQUNILHdDQUFTOzs7OztJQUFULFVBQVUsS0FBb0I7UUFBOUIsaUJBdUZDO1FBdEZDLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLEVBQUU7WUFDeEQsT0FBTztTQUNSO1FBQ0QsUUFBUSxLQUFLLENBQUMsR0FBRyxFQUFFO1lBQ2pCLEtBQUssU0FBUztnQkFDWixJQUNFLElBQUksQ0FBQyxTQUFTLFlBQVksaUJBQWlCO29CQUMzQyxJQUFJLENBQUMsMkJBQTJCLEVBQ2hDO29CQUNBLE9BQU87aUJBQ1I7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLENBQUMsRUFBRTtvQkFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQ3JEO2dCQUNELE1BQU07WUFDUixLQUFLLFdBQVc7Z0JBQ2QsSUFDRSxJQUFJLENBQUMsU0FBUyxZQUFZLGlCQUFpQjtvQkFDM0MsSUFBSSxDQUFDLDJCQUEyQixFQUNoQztvQkFDQSxPQUFPO2lCQUNSO2dCQUNELGVBQWU7Z0JBQ2YsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDdEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDckQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7b0JBQzFCLE1BQU07aUJBQ1A7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQ3JEO2dCQUNELE1BQU07WUFDUixLQUFLLFdBQVc7Z0JBQ2QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDdkQsTUFBTTtZQUNSLEtBQUssWUFBWTtnQkFDZixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN2RCxNQUFNO1lBQ1IsS0FBSyxPQUFPO2dCQUNWLElBQUksSUFBSSxDQUFDLFNBQVMsWUFBWSxpQkFBaUIsRUFBRTtvQkFDL0MsSUFBSSxDQUFDLDhCQUE4QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3pELElBQUksSUFBSSxDQUFDLDJCQUEyQixLQUFLLEtBQUssRUFBRTt3QkFDOUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztxQkFDakQ7aUJBQ0Y7cUJBQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDN0QsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7aUJBQzNCO2dCQUNELE1BQU07WUFDUixLQUFLLFFBQVE7Z0JBQ1gsSUFBSSxJQUFJLENBQUMsU0FBUyxZQUFZLGlCQUFpQixFQUFFOzt3QkFDekMsY0FBWSxHQUFHLG1CQUFBLElBQUksQ0FBQyxTQUFTLEVBQXFCO29CQUN4RCxVQUFVOzs7b0JBQUM7d0JBQ1QsS0FBSSxDQUFDLDhCQUE4QixDQUFDLGNBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDdkQsSUFBSSxLQUFJLENBQUMsMkJBQTJCLEtBQUssS0FBSyxFQUFFOzRCQUM5QyxJQUFJLGNBQVksQ0FBQyxlQUFlLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRTtnQ0FDcEQsVUFBVTs7O2dDQUFDO29DQUNULEtBQUksQ0FBQyxRQUFRLENBQUMsS0FBSSxDQUFDLFVBQVUsRUFBRSxLQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7Z0NBQ2xELENBQUMsR0FBRSxDQUFDLENBQUMsQ0FBQzs2QkFDUDtpQ0FBTTtnQ0FDTCxLQUFJLENBQUMsUUFBUSxDQUFDLEtBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDOzZCQUNqRDt5QkFDRjtvQkFDSCxDQUFDLEdBQUUsQ0FBQyxDQUFDLENBQUM7aUJBQ1A7Z0JBQ0QsTUFBTTtZQUNSO2dCQUNFLCtCQUErQjtnQkFDL0IsSUFDRSxJQUFJLENBQUMsU0FBUyxZQUFZLGlCQUFpQjtvQkFDM0MsSUFBSSxDQUFDLDJCQUEyQixLQUFLLEtBQUs7b0JBQzFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUMvQjs7d0JBQ00sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTO29CQUMxQixHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztvQkFDbEIsSUFBSSxDQUFDLDhCQUE4QixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMxQyxvREFBb0Q7b0JBQ3BELDBEQUEwRDtvQkFDMUQsaUJBQWlCO29CQUNqQixtRkFBbUY7b0JBQ25GLHFCQUFxQjtvQkFDckIsa0NBQWtDO29CQUNsQyw4REFBOEQ7b0JBQzlELDRDQUE0QztvQkFDNUMsU0FBUztpQkFDVjtnQkFDRCxNQUFNO1NBQ1Q7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7Ozs7Ozs7O0lBQ0ssMENBQVc7Ozs7Ozs7SUFBbkIsVUFBb0IsS0FBYSxFQUFFLElBQXFCOztZQUNoRCxRQUFRLEdBQUc7WUFDZixPQUFPO1lBQ1AsUUFBUTtZQUNSLE1BQU07WUFDTixXQUFXO1lBQ1gsVUFBVTtZQUNWLGFBQWE7WUFDYixnQkFBZ0I7U0FDakI7O1lBQ0csVUFBVSxHQUFHLEVBQUU7UUFDbkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDcEMsSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFO2dCQUNmLE9BQU8sVUFBVSxDQUFDLE1BQU0sQ0FBQzthQUMxQjtZQUNELHlEQUF5RDtZQUN6RCxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtnQkFDcEQsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMxQjtTQUNGO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7O09BS0c7Ozs7Ozs7O0lBQ0ssNkNBQWM7Ozs7Ozs7SUFBdEIsVUFBdUIsS0FBYSxFQUFFLElBQXFCO1FBQ3pELE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDOztZQUNwQixRQUFRLEdBQUc7WUFDZixPQUFPO1lBQ1AsUUFBUTtZQUNSLE1BQU07WUFDTixXQUFXO1lBQ1gsVUFBVTtZQUNWLGFBQWE7WUFDYixnQkFBZ0I7U0FDakI7O1lBQ0csVUFBVSxHQUFHLEVBQUU7UUFDbkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDcEMsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7Z0JBQ3BELFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pCLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxLQUFLLEdBQUcsQ0FBQyxFQUFFO29CQUNuQyxPQUFPLENBQUMsQ0FBQztpQkFDVjthQUNGO1NBQ0Y7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxzQkFBSSxnREFBYzs7OztRQUFsQjtZQUNFLE9BQU8sbUJBQUEsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBYSxDQUFDO1FBQzVELENBQUM7OztPQUFBO0lBRUQsc0JBQUksNkNBQVc7Ozs7UUFBZjtZQUNFLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQzs7O09BQUE7SUFFRCx5QkFBeUI7Ozs7O0lBQ2xCLHVDQUFROzs7OztJQUFmO1FBQ0UsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7Ozs7Ozs7O0lBRUQsNENBQWE7Ozs7Ozs7SUFBYixVQUNFLEVBQU8sRUFDUCxLQUFVLEVBQ1YsSUFBUyxFQUNULHlCQUE4QjtRQUpoQyxpQkEyQkM7UUFyQkMsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNQLE9BQU87U0FDUjs7WUFDSyxVQUFVLEdBQ2QseUJBQXlCLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRSxxQ0FBcUM7UUFDckMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNmLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNwQzthQUFNO1lBQ0wsSUFBSSxDQUFDLGVBQWUsR0FBRyxVQUFVLENBQUM7WUFDbEMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQzthQUN2QztZQUNELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsYUFBYTtpQkFDekMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7aUJBQ3hDLFNBQVM7Ozs7WUFBQyxVQUFDLEVBQW1CO29CQUFqQixVQUFFLEVBQUUsZ0JBQUssRUFBRSxjQUFJO2dCQUFPLE9BQUEsS0FBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQztZQUFsQyxDQUFrQyxFQUFDLENBQUM7WUFDMUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUEsRUFBRSxLQUFLLE9BQUEsRUFBRSxJQUFJLE1BQUEsRUFBRSxDQUFDLENBQUM7U0FDOUM7UUFDRCxVQUFVOzs7UUFBQztZQUNULEtBQUksQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxDQUFDLEdBQUUsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDOzs7Ozs7OztJQUVELGdEQUFpQjs7Ozs7OztJQUFqQixVQUNFLEVBQU8sRUFDUCxJQUFhLEVBQ2IsSUFBUyxFQUNULDZCQUFrQztRQUpwQyxpQkFnQ0M7UUExQkMsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNQLE9BQU87U0FDUjs7WUFDSyxVQUFVLEdBQ2QsNkJBQTZCLElBQUksSUFBSTtZQUNuQyxDQUFDLENBQUMsNkJBQTZCO1lBQy9CLENBQUMsQ0FBQyxDQUFDO1FBQ1AscUNBQXFDO1FBQ3JDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixJQUFJLElBQUksRUFBRTtnQkFDUixJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDbkM7WUFDRCxPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMseUJBQXlCLEdBQUcsVUFBVSxDQUFDO1FBQzVDLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQy9CLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUMzQztRQUNELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCO2FBQ2pELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUM7YUFDbEQsU0FBUzs7OztRQUFDLFVBQUMsRUFBbUI7Z0JBQWpCLFVBQUUsRUFBRSxnQkFBSyxFQUFFLGNBQUk7WUFDM0IsSUFBSSxLQUFLLEVBQUU7Z0JBQ1QsS0FBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ3BDO1FBQ0gsQ0FBQyxFQUFDLENBQUM7UUFDTCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFBLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLE1BQUEsRUFBRSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOzs7OztPQUtHOzs7Ozs7OztJQUNILDJDQUFZOzs7Ozs7O0lBQVosVUFBYSxFQUFPLEVBQUUsS0FBVSxFQUFFLElBQVM7UUFDekMsSUFBSSxFQUFFLEVBQUU7WUFDTixFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ2pCO0lBQ0gsQ0FBQzs7OztJQUVELDRDQUFhOzs7SUFBYjtRQUFBLGlCQXdEQzs7WUF2REssc0JBQXNCLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDekMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztTQUN6QixDQUFDO1FBQ0YsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU87Ozs7UUFBQyxVQUFDLGlCQUFpQjs7Z0JBQzVDLFlBQVksR0FBUSxFQUFFO1lBQzFCLEtBQUksQ0FBQyxTQUFTLENBQUMsT0FBTzs7OztZQUFDLFVBQUMsSUFBSTtnQkFDMUIsaUJBQWlCO2dCQUNqQixZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUN2QztvQkFDRSxLQUFLLEVBQUUsS0FBSSxDQUFDLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDNUQsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7d0JBQzlCLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUk7b0JBQ3RCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtpQkFDeEIsRUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUMxQyxDQUFDO2dCQUNGLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRTtvQkFDaEQsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQ3JELGlCQUFpQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxFQUNsRCxFQUFFLENBQ0gsQ0FBQztpQkFDSDtZQUNILENBQUMsRUFBQyxDQUFDO1lBQ0gsWUFBWSxDQUFDLFNBQVMsR0FBRyxLQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FDdEMsQ0FBQyxtQkFBQSxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUN0RSxFQUFFLENBQ0gsQ0FBQzs7Z0JBQ0UsWUFBWSxHQUFHLEtBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQztZQUM5QyxLQUFJLENBQUMsU0FBUyxDQUFDLE9BQU87Ozs7WUFBQyxVQUFDLElBQUk7Z0JBQzFCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTs7d0JBQ2hCLFVBQVUsR0FDZCxJQUFJLENBQUMseUJBQXlCLElBQUksSUFBSTt3QkFDcEMsQ0FBQyxDQUFDLElBQUksQ0FBQyx5QkFBeUI7d0JBQ2hDLENBQUMsQ0FBQyxDQUFDOzt3QkFDRCxPQUFPLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUMzQywrQkFBK0I7b0JBQy9CLElBQUksVUFBVSxHQUFHLENBQUMsRUFBRTt3QkFDbEIsT0FBTyxDQUFDLFlBQVk7NkJBQ2pCLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7NkJBQzlCLFNBQVM7Ozs7d0JBQUMsVUFBQyxLQUFLOzRCQUNmLEtBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7d0JBQzdELENBQUMsRUFBQyxDQUFDO3FCQUNOO3lCQUFNO3dCQUNMLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUzs7Ozt3QkFBQyxVQUFDLEtBQUs7NEJBQ25DLEtBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7d0JBQzdELENBQUMsRUFBQyxDQUFDO3FCQUNKO2lCQUNGO1lBQ0gsQ0FBQyxFQUFDLENBQUM7WUFDSCxDQUFDLG1CQUFBLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBYSxDQUFDLENBQUMsTUFBTSxDQUN2RCxDQUFDLG1CQUFBLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBYSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFDbEUsWUFBWSxDQUNiLENBQUM7UUFDSixDQUFDLEVBQUMsQ0FBQztRQUNILE9BQU8sc0JBQXNCLENBQUMsS0FBSyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxpQkFBaUI7Ozs7O0lBQ1YsdUNBQVE7Ozs7O0lBQWY7UUFBQSxpQkFZQzs7WUFYSyxRQUFRLEdBQUcsRUFBRTtRQUNqQixJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTzs7OztRQUFDLFVBQUMsaUJBQWlCOztnQkFDNUMsWUFBWSxHQUFRLEVBQUU7WUFDMUIsS0FBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPOzs7O1lBQUMsVUFBQyxJQUFJO2dCQUMxQixpQkFBaUI7Z0JBQ2pCLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pELENBQUMsRUFBQyxDQUFDO1lBQ0gsWUFBWSxDQUFDLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxTQUFTLENBQUM7WUFDckQsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM5QixDQUFDLEVBQUMsQ0FBQztRQUNILE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCx1QkFBdUI7Ozs7O0lBQ3ZCLDBDQUFXOzs7OztJQUFYO1FBQUEsaUJBeUNDO1FBeENDLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdEMsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsMEJBQTBCO1FBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ25CLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBQzFCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQixPQUFPO1NBQ1I7O1lBQ0ssV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1FBQ3ZELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7OztZQUdyQixZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU07Ozs7O1FBQ2pELFVBQUMsSUFBUyxFQUFFLEtBQWE7OztnQkFDdkIsS0FBbUIsSUFBQSxLQUFBLGlCQUFBLEtBQUksQ0FBQyxTQUFTLENBQUEsZ0JBQUEsNEJBQUU7b0JBQTlCLElBQU0sSUFBSSxXQUFBO29CQUNiLElBQ0UsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUM7d0JBQzdCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLEVBQ3BDO3dCQUNBLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzs7NEJBQ3pCLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQzs0QkFDM0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFOzRCQUMxQyxDQUFDLENBQUMsRUFBRTt3QkFDTixJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUU7NEJBQy9CLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQ2xDLE9BQU8sSUFBSSxDQUFDO3lCQUNiO3FCQUNGO2lCQUNGOzs7Ozs7Ozs7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsRUFDRjtRQUNELGVBQWU7UUFDZixJQUFJLENBQUMsd0JBQXdCLEdBQUcsWUFBWSxDQUFDO1FBQzdDLGtCQUFrQjtRQUNsQixJQUFJLENBQUMsYUFBYSxHQUFHLFlBQVksQ0FBQztRQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xCLENBQUM7Ozs7SUFFRCwyQ0FBWTs7O0lBQVo7UUFDRSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xCLENBQUM7Ozs7Ozs7SUFFRCx1Q0FBUTs7Ozs7O0lBQVIsVUFBUyxJQUFlLEVBQUUsUUFBYSxFQUFFLEtBQWE7O1lBQ2hELFFBQVEsR0FBRztZQUNiLFdBQVcsRUFBRSxLQUFLO1NBQ25CO1FBQ0QsSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFO1lBQ2xCLFFBQVEsd0JBQVEsUUFBUSxFQUFLLFFBQVEsQ0FBQyxLQUFLLENBQUUsQ0FBQztTQUMvQztRQUNELElBQ0UsUUFBUSxDQUFDLFdBQVc7WUFDcEIsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJO1lBQ3pCLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQ3pDO1lBQ0EsUUFBUSx3QkFDSCxRQUFRLEVBQ1IsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUN4RCxDQUFDO1NBQ0g7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDOzs7OztJQUVELDBDQUFXOzs7O0lBQVgsVUFBWSxPQUFzQjtRQUNoQyxJQUNFLE9BQU8sQ0FBQyxlQUFlLENBQUM7WUFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsWUFBWSxDQUFDO2dCQUNuRCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxhQUFhLENBQUMsRUFDeEQ7WUFDQSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDbkUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7YUFDOUM7WUFDRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDYjtRQUNELElBQ0UsT0FBTyxDQUFDLGFBQWEsQ0FBQztZQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxZQUFZLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxFQUN0RDtZQUNBLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN2QjtJQUNILENBQUM7Ozs7SUFFRCw2Q0FBYzs7O0lBQWQ7UUFBQSxpQkFjQztRQWJDLFdBQVc7UUFDWCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMxRSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU87Ozs7WUFBQyxVQUFDLElBQUk7Z0JBQzVCLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxDQUFDLENBQUMsRUFBRTtvQkFDcEUsS0FBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxHQUFHO3dCQUMzQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVc7d0JBQ3ZCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxJQUFJLE1BQU07d0JBQzNCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxJQUFJLEtBQUs7cUJBQ3ZDLENBQUM7aUJBQ0g7WUFDSCxDQUFDLEVBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQzs7Ozs7O0lBRU8sbUNBQUk7Ozs7O0lBQVosVUFBYSxNQUF1QjtRQUFwQyxpQkE0QkM7UUE1QlksdUJBQUEsRUFBQSxjQUF1QjtRQUNsQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLE9BQU87UUFDUCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDbkMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDMUIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLDJCQUEyQjtRQUMzQixJQUNFLENBQUMsTUFBTTtZQUNQLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYTtnQkFDbEIsQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQzFEO1lBQ0EsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDMUIsMkJBQTJCO1lBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUU7Z0JBQzdCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQy9CO1lBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7U0FDdEI7YUFBTTtZQUNMLE9BQU87WUFDUCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztTQUM1QjtRQUNELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsU0FBUzs7OztRQUFDLFVBQUMsSUFBSTtZQUNuRCxPQUFBLEtBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUM7UUFBL0IsQ0FBK0IsRUFDaEMsQ0FBQztRQUNGLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRDs7T0FFRzs7Ozs7O0lBQ0sseUNBQVU7Ozs7O0lBQWxCO1FBQ0UsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ3ZDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7U0FDekIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDcEMsQ0FBQzs7OztJQUVELG1EQUFvQjs7O0lBQXBCO1FBQUEsaUJBSUM7UUFIQyxVQUFVOzs7UUFBQztZQUNULEtBQUksQ0FBQyxlQUFlLENBQUMsS0FBSSxDQUFDLFVBQVUsRUFBRSxLQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekQsQ0FBQyxHQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVEOztPQUVHOzs7Ozs7SUFDSywwQ0FBVzs7Ozs7SUFBbkI7UUFDRSxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVEOzs7OztPQUtHOzs7Ozs7Ozs7SUFDSyxtREFBb0I7Ozs7Ozs7O0lBQTVCLFVBQ0UsaUJBQXNCLEVBQ3RCLFdBQTRCLEVBQzVCLGVBQWdDO1FBSGxDLGlCQXlGQztRQXZGQyw0QkFBQSxFQUFBLG1CQUE0QjtRQUM1QixnQ0FBQSxFQUFBLHVCQUFnQzs7WUFFNUIsWUFBWSxHQUFRLEVBQUU7UUFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPOzs7O1FBQUMsVUFBQyxJQUFJO1lBQzFCLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQ3ZDO2dCQUNFLEtBQUssRUFDSCxpQkFBaUIsSUFBSSxJQUFJO29CQUN2QixDQUFDLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztvQkFDOUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLO2dCQUNoQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7YUFDeEIsRUFDRCxXQUFXO2dCQUNULENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7b0JBQzFCLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7b0JBQ3ZCLENBQUMsQ0FBQyxFQUFFO2dCQUNOLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTztvQkFDWixDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO29CQUN2QixDQUFDLENBQUMsRUFBRSxDQUNULENBQUM7WUFDRixJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUU7Z0JBQ2hELFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUNyRCxpQkFBaUIsSUFBSSxJQUFJO29CQUN2QixDQUFDLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJO29CQUNwRCxDQUFDLENBQUMsSUFBSSxFQUNSLEVBQUUsQ0FDSCxDQUFDO2FBQ0g7UUFDSCxDQUFDLEVBQUMsQ0FBQzs7O1lBR0csS0FBSyxHQUNULENBQUMsZUFBZSxJQUFJLGlCQUFpQixJQUFJLGlCQUFpQixDQUFDLFFBQVE7WUFDakUsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFFBQVE7WUFDNUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7UUFDMUIsWUFBWSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQyxJQUFJLGlCQUFpQixJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFO1lBQ3BELGlCQUFpQixDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7U0FDcEM7UUFFRCxzQ0FBc0M7UUFDdEMsSUFBSSxpQkFBaUIsRUFBRTtZQUNyQixNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsT0FBTzs7OztZQUFDLFVBQUMsR0FBRztnQkFDekMsSUFDRSxHQUFHLEtBQUssV0FBVztvQkFDbkIsR0FBRyxLQUFLLHVCQUF1QjtvQkFDL0IsR0FBRyxLQUFLLFVBQVUsRUFDbEI7b0JBQ0EsT0FBTztpQkFDUjtnQkFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUN0QixZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztpQkFDN0Q7WUFDSCxDQUFDLEVBQUMsQ0FBQztTQUNKO1FBRUQsWUFBWSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FDdEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDdkMsRUFBRSxDQUNILENBQUM7UUFDRixZQUFZLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQzs7WUFDeEUsZUFBZSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQztRQUNqRCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU87Ozs7UUFBQyxVQUFDLElBQUk7WUFDMUIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFOztvQkFDaEIsVUFBVSxHQUNkLElBQUksQ0FBQyx5QkFBeUIsSUFBSSxJQUFJO29CQUNwQyxDQUFDLENBQUMsSUFBSSxDQUFDLHlCQUF5QjtvQkFDaEMsQ0FBQyxDQUFDLENBQUM7O29CQUNELE9BQU8sR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7O29CQUN4QyxZQUFZOzs7O2dCQUFHLFVBQUMsS0FBVTtvQkFDOUIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FBQyxNQUFNLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTt3QkFDdkQsS0FBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7cUJBQzdCO29CQUNELEtBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLENBQUM7Z0JBQ2hFLENBQUMsQ0FBQTtnQkFDRCwrQkFBK0I7Z0JBQy9CLElBQUksVUFBVSxHQUFHLENBQUMsRUFBRTtvQkFDbEIsT0FBTyxDQUFDLFlBQVk7eUJBQ2pCLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7eUJBQzlCLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztpQkFDNUI7cUJBQU07b0JBQ0wsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7aUJBQzlDO2FBQ0Y7UUFDSCxDQUFDLEVBQUMsQ0FBQztRQUNILE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7Ozs7O0lBRU8sa0RBQW1COzs7O0lBQTNCO1FBQ0UsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsT0FBTzs7Ozs7UUFBQyxVQUFDLElBQUksRUFBRSxLQUFLO1lBQy9DLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNsRSxDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRzs7Ozs7SUFDSCxrREFBbUI7Ozs7SUFBbkI7UUFBQSxpQkFVQztRQVRDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTzs7OztRQUFDLFVBQUMsaUJBQWlCO1lBQzNDLEtBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUN4QixLQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQ25DLEtBQUksQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUM3QyxDQUFDO1FBQ0osQ0FBQyxFQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztJQUN2QixDQUFDO0lBRUQ7OztPQUdHOzs7Ozs7O0lBQ0gsMENBQVc7Ozs7OztJQUFYLFVBQVksU0FBNEIsRUFBRSxPQUF1QjtRQUFqRSxpQkFnQkM7UUFoQnlDLHdCQUFBLEVBQUEsY0FBdUI7O1lBQ3pELFFBQVEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDO1FBQ3BELElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQix3QkFBd0I7UUFDeEIsSUFBSSxDQUFDLG1CQUFtQjtZQUN0QixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckQsVUFBVTs7O1FBQUM7WUFDVCxLQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsSUFBSSxPQUFPLEVBQUU7Z0JBQ1gsS0FBSSxDQUFDLFVBQVUsR0FBRyxLQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3JELEtBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO2dCQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN0QixLQUFJLENBQUMsUUFBUSxDQUFDLEtBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ2pEO1FBQ0gsQ0FBQyxHQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVEOztPQUVHOzs7Ozs7SUFDSCwyQ0FBWTs7Ozs7SUFBWixVQUFhLElBQWU7UUFBNUIsaUJBbUJDOztZQWxCTyxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUM5RCxJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUU7WUFDbkIsT0FBTztTQUNSOzs7WUFFSyxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRTs7WUFDakMsUUFBUSxHQUFHLFdBQVcsR0FBRyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUN4QixRQUFRLEVBQ1IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQ3JELENBQUM7UUFDRixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQixVQUFVOzs7UUFBQztZQUNULEtBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN0QixLQUFJLENBQUMsVUFBVSxHQUFHLEtBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNyRCxLQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztZQUNwQixLQUFJLENBQUMsUUFBUSxDQUFDLEtBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xELENBQUMsR0FBRSxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFJRDs7O09BR0c7Ozs7OztJQUNILDZDQUFjOzs7OztJQUFkLFVBQWUsV0FBK0I7UUFBOUMsaUJBK0NDOztZQTlDSyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLElBQUksT0FBTyxXQUFXLEtBQUssUUFBUSxFQUFFO1lBQ25DLFFBQVEsR0FBRyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1NBQzVCO2FBQU0sSUFBSSxXQUFXLEVBQUU7WUFDdEIsUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUM5RDtRQUNELE9BQU8sQ0FBQyxHQUFHLENBQ1QsT0FBTyxFQUNQLE9BQU8sV0FBVyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQ3pELENBQUM7UUFDRixJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUU7WUFDaEIsT0FBTztTQUNSO1FBQ0QsaUJBQWlCO1FBQ2pCLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDakUsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUNqQztZQUNELE9BQU87U0FDUjs7WUFDSyxXQUFXLEdBQUcsbUJBQUEsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQWE7UUFDakUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzFDLElBQ0UsQ0FBQyxJQUFJLENBQUMsWUFBWTtZQUNsQixJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVE7WUFDNUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDekMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQ3pCO1lBQ0EsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3BCO2FBQU07OztnQkFFQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDdEIsQ0FBQyxFQUNELElBQUksQ0FBQyxJQUFJLENBQ1AsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FDOUQsQ0FDRjtZQUNELElBQUksSUFBSSxDQUFDLG1CQUFtQixHQUFHLE9BQU8sRUFBRTtnQkFDdEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLE9BQU8sQ0FBQzthQUNwQztZQUNELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1NBQzVCO1FBQ0QsVUFBVTs7O1FBQUM7WUFDVCxLQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDeEIsQ0FBQyxHQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVELDJCQUEyQjs7Ozs7OztJQUNuQixrREFBbUI7Ozs7OztJQUEzQixVQUE0QixTQUE0QjtRQUN0RCxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7U0FDNUM7O1lBQ0ssR0FBRyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFDM0QsT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7SUFDbEUsQ0FBQztJQUVELDJCQUEyQjs7Ozs7OztJQUNuQixrREFBbUI7Ozs7OztJQUEzQixVQUE0QixXQUFtQjtRQUM3QyxPQUFPLENBQ0wsV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FDdkUsQ0FBQztJQUNKLENBQUM7Ozs7O0lBRU0sOENBQWU7Ozs7SUFBdEIsVUFBdUIsS0FBYTtRQUFwQyxpQkFLQztRQUpDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDakMsVUFBVTs7O1FBQUM7WUFDVCxLQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDeEIsQ0FBQyxHQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQzs7Ozs7SUFFTSw2Q0FBYzs7OztJQUFyQixVQUFzQixLQUFhO1FBQW5DLGlCQUtDO1FBSkMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztRQUNoQyxVQUFVOzs7UUFBQztZQUNULEtBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN4QixDQUFDLEdBQUUsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDOzs7Ozs7SUFFTyxtREFBb0I7Ozs7O0lBQTVCLFVBQTZCLElBQVU7UUFBdkMsaUJBb0dDO1FBbkdDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFOztvQkFDdEQsT0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLO2dCQUN4QixJQUFJLE9BQUssQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRTtvQkFDakQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU87Ozs7O29CQUFDLFVBQUMsSUFBSSxFQUFFLEtBQUs7d0JBQ3hDLEtBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsd0JBQ3hCLEtBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsRUFDcEMsT0FBSyxDQUFDLEtBQUssQ0FBQyxDQUNoQixDQUFDO29CQUNKLENBQUMsRUFBQyxDQUFDO2lCQUNKO3FCQUFNLElBQUksT0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFOzs7O3dCQUdoRCxXQUFXLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUs7O3dCQUM1RCxRQUFRLEdBQUcsQ0FBQyxDQUFDO29CQUNqQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTt3QkFDM0MsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLEVBQUU7NEJBQ3hDLFFBQVEsR0FBRyxDQUFDLENBQUM7NEJBQ2IsTUFBTTt5QkFDUDtxQkFDRjtvQkFDRCxJQUFJLFFBQVEsS0FBSyxDQUFDLENBQUMsRUFBRTt3QkFDbkIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FDNUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQ3ZDLENBQUMsRUFDRCxXQUFXLENBQUMsUUFBUSxDQUFDLENBQ3RCLENBQUM7cUJBQ0g7b0JBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2lCQUNyRTtxQkFBTTs7Ozt3QkFHRCxjQUFZLEdBQUcsQ0FBQyxDQUFDOzt3QkFDakIsS0FBSyxHQUFHLENBQUM7b0JBQ2IsSUFBSSxPQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTt3QkFDdEIsY0FBWSxHQUFHLENBQUMsQ0FBQztxQkFDbEI7eUJBQU07d0JBQ0wsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7NEJBQ3JDLElBQUksT0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxFQUFFO2dDQUNsQyxjQUFZLEdBQUcsQ0FBQyxDQUFDO2dDQUNqQixNQUFNOzZCQUNQOzRCQUNELEtBQUssRUFBRSxDQUFDO3lCQUNUO3FCQUNGO29CQUNELElBQUksY0FBWSxLQUFLLENBQUMsQ0FBQyxFQUFFO3dCQUN2QixvRUFBb0U7d0JBQ3BFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTTs7Ozs7d0JBQ3RELFVBQUMsSUFBSSxFQUFFLEtBQUs7NEJBQ1YsT0FBTyxLQUFLLEtBQUssS0FBSSxDQUFDLGdCQUFnQixDQUFDLGNBQVksQ0FBQyxDQUFDO3dCQUN2RCxDQUFDLEVBQ0YsQ0FBQzt3QkFDRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLGNBQVksRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDOUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7NEJBQ3JELElBQUksQ0FBQyxJQUFJLGNBQVksRUFBRTtnQ0FDckIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7NkJBQzVCO3lCQUNGO3FCQUNGO3lCQUFNOzs7NEJBRUMsYUFBVyxHQUNmLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzt3QkFDekQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNOzs7Ozt3QkFDdEQsVUFBQyxJQUFJLEVBQUUsS0FBSzs0QkFDVixPQUFPLEtBQUssS0FBSyxhQUFXLENBQUM7d0JBQy9CLENBQUMsRUFDRixDQUFDO3dCQUNGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQztxQkFDN0I7aUJBQ0Y7YUFDRjtpQkFBTTtnQkFDTCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO29CQUN0QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztpQkFDdEM7YUFDRjtTQUNGO2FBQU07WUFDTCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUN0QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQzthQUN0QztTQUNGO1FBRUQsTUFBTTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQztTQUNqRDthQUFNO1lBQ0wsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUNsQixpQ0FBaUM7Z0JBQ2pDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQzthQUNqRDtpQkFBTTtnQkFDTCxrREFBa0Q7Z0JBQ2xELElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRTtvQkFDbEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7aUJBQ3ZDO3FCQUFNO29CQUNMLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQztpQkFDakQ7YUFDRjtTQUNGO1FBQ0QsOEJBQThCO1FBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ2xELENBQUM7Ozs7OztJQUVPLHdDQUFTOzs7OztJQUFqQixVQUFrQixJQUFxQjtRQUNyQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDeEMsT0FBTyxLQUFLLENBQUM7U0FDZDs7WUFDRyxRQUFRLEdBQUcsRUFBRTs7WUFDYixxQkFBcUIsR0FBRyxFQUFFO1FBQzlCLElBQUksQ0FBQyxPQUFPOzs7O1FBQUMsVUFBQyxJQUFJO1lBQ2hCLFVBQVU7WUFDVixzSEFBc0g7WUFDdEgsOENBQThDO1lBQzlDLElBQUk7WUFDSixRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUV6QiwyREFBMkQ7WUFDM0QsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQzNDLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLE9BQU87Ozs7Z0JBQUMsVUFBQyxTQUFTO29CQUNyQixJQUNFLFNBQVMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLO3dCQUMxQyxTQUFTLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUMxQzt3QkFDQSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUM1QztnQkFDSCxDQUFDLEVBQUMsQ0FBQztnQkFDSCxJQUFJLHFCQUFxQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3BDLE1BQU0sc0ZBQXdCLElBQUksQ0FBQyxJQUFJLG9JQUFpRCxDQUFDO2lCQUMxRjthQUNGO1FBQ0gsQ0FBQyxFQUFDLENBQUM7UUFDSCxhQUFhO1FBQ2IsSUFBSSxpQkFBSSxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNqRCxNQUFNLCtCQUErQixDQUFDO1NBQ3ZDO1FBQ0QsZ0JBQWdCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7OztJQUVNLHlDQUFVOzs7SUFBakI7UUFDRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUNoRSxDQUFDOzs7O0lBRU0sd0NBQVM7OztJQUFoQjtRQUNFLEtBQUs7UUFDTCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM3RCxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3hCO1FBQ0QsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsQ0FBQztJQUMvQixDQUFDOzs7Ozs7SUFFTSx5Q0FBVTs7Ozs7SUFBakIsVUFBa0IsUUFBYSxFQUFFLElBQVM7UUFDeEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7Ozs7Ozs7SUFFTSwwQ0FBVzs7Ozs7O0lBQWxCLFVBQW1CLEVBQVUsRUFBRSxTQUFpQixFQUFFLFNBQWlCOztZQUMzRCxRQUFRLEdBQVEsUUFBUSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7UUFDaEQsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDckQsQ0FBQzs7Ozs7O0lBSUQsNkNBQWM7Ozs7O0lBQWQsVUFBZSxJQUFZLEVBQUUsUUFBZ0I7O1lBQ3JDLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztRQUM3QyxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUU7WUFDN0IsT0FBTyxXQUFXLEdBQUcsRUFBRSxJQUFJLFFBQVEsQ0FBQztTQUNyQzs7WUFFSyxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7UUFDM0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztRQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUM7UUFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDO1FBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLGNBQWMsQ0FBQyxDQUFDLHNCQUFzQjtRQUMzRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7WUFDMUIsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxJQUFJLFFBQVE7UUFDcEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzdDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUM1QixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDOzs7OztJQUVELDRDQUFhOzs7O0lBQWIsVUFBYyxHQUFRO1FBQ3BCLElBQUksR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUU7WUFDcEIsT0FBTyxHQUFHLENBQUM7U0FDWjthQUFNO1lBQ0wsT0FBTyxLQUFLLENBQUM7U0FDZDtJQUNILENBQUM7Ozs7O0lBRUQsbURBQW9COzs7O0lBQXBCLFVBQXFCLEdBQVE7UUFDM0IsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUU7WUFDckMsT0FBTyxLQUFLLENBQUM7U0FDZDthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUM7U0FDYjtJQUNILENBQUM7O2dCQXZwREYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxlQUFlO29CQUN6QixnMitCQUE2Qzs7aUJBRTlDOzs7O2dCQXZCbUIsV0FBVztnQkFkN0IsaUJBQWlCOzs7bUNBdUNoQixZQUFZLFNBQUMsY0FBYztpQ0FFM0IsS0FBSzs2QkFDTCxLQUFLO3NDQUNMLE1BQU07eUNBQ04sS0FBSzsrQkFDTCxLQUFLOzZCQUNMLEtBQUs7K0JBRUwsS0FBSzs0QkFDTCxLQUFLO2dDQUVMLEtBQUs7aUNBQ0wsS0FBSzt5QkFDTCxLQUFLOzhCQUNMLE1BQU07a0NBRU4sTUFBTTtvQ0FDTixLQUFLOzRCQVFMLEtBQUs7OEJBQ0wsS0FBSztnQ0FDTCxLQUFLO3VDQTRDTCxZQUFZLFNBQUMsc0JBQXNCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO3NDQUd0RCxZQUFZLFNBQUMscUJBQXFCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO3VDQUdyRCxZQUFZLFNBQUMsc0JBQXNCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2tDQXV5Q3RELE1BQU07O0lBbjNDa0I7UUFBZixZQUFZLEVBQUU7O2dFQUFnQztJQUMvQjtRQUFmLFlBQVksRUFBRTs7NERBQTRCO0lBRTNCO1FBQWYsWUFBWSxFQUFFOzt3RUFBeUM7SUFDeEM7UUFBZixZQUFZLEVBQUU7OzhEQUErQjtJQUM5QjtRQUFmLFlBQVksRUFBRTs7NERBQTZCO0lBRTVCO1FBQWYsWUFBWSxFQUFFOzs4REFBK0I7SUFTOUI7UUFBZixZQUFZLEVBQUU7O21FQUFvQztJQVFuQztRQUFmLFlBQVksRUFBRTs7MkRBQTRCO0lBd25EdEQsMkJBQUM7Q0FBQSxBQXhwREQsSUF3cERDO1NBbnBEWSxvQkFBb0I7OztJQUMvQixnREFBdUU7O0lBRXZFLDhDQUF3RDs7SUFDeEQsMENBQW9EOztJQUNwRCxtREFBbUQ7O0lBQ25ELHNEQUFpRTs7SUFDakUsNENBQXVEOztJQUN2RCwwQ0FBcUQ7Ozs7O0lBRXJELDRDQUF1RDs7SUFDdkQseUNBQW9DOztJQUVwQyw2Q0FBNEI7O0lBQzVCLDhDQUEyRDs7SUFDM0Qsc0NBQTBEOztJQUMxRCwyQ0FBMkM7Ozs7O0lBRTNDLCtDQUE0RDs7SUFDNUQsaURBQTREOztJQUM1RCxtREFBZ0M7O0lBQ2hDLGtEQUFnQzs7SUFDaEMsbURBQStCOztJQUMvQix1Q0FBYTs7SUFDYiwwQ0FBbUI7O0lBR25CLHlDQUFvRDs7SUFDcEQsMkNBQThDOztJQUM5Qyw2Q0FBNEM7O0lBQzVDLCtDQUFxQjs7SUFFckIsd0NBQTBCOztJQUMxQix5Q0FBa0I7O0lBQ2xCLGtEQUE2Qjs7SUFDN0Isd0RBQW1DOztJQUNuQyxnREFBcUM7O0lBQ3JDLDRDQUE4Qjs7SUFDOUIseUNBQTJCOzs7Ozs7SUFFM0IsOENBQTJDOzs7OztJQUMzQyw2Q0FBMEU7Ozs7O0lBQzFFLCtDQUFvQzs7Ozs7SUFFcEMsa0RBQXFEOzs7OztJQUNyRCxtREFBc0Q7Ozs7O0lBRXRELGlEQUE4RTs7Ozs7SUFDOUUseURBQThDOzs7OztJQUM5QyxzREFBeUQ7O0lBR3pELDhDQVNPOztJQUVQLDBDQUEwQjs7SUFDMUIsMENBQTBCOztJQUMxQix5Q0FNaUM7O0lBQ2pDLDJEQUE2Qzs7SUFDN0Msb0RBQ3VDOzs7OztJQUV2QyxtREFDc0M7Ozs7O0lBRXRDLG9EQUN1Qzs7SUFzeUN2QywrQ0FBK0M7Ozs7O0lBdVAvQyw4Q0FBdUQ7Ozs7O0lBMWhEckQsa0NBQXVCOzs7OztJQUN2QixtQ0FBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZHJlbixcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQge1xuICBJbnB1dEJvb2xlYW4sXG4gIE56RGF0ZVBpY2tlckNvbXBvbmVudCxcbiAgTnpJbnB1dE51bWJlckNvbXBvbmVudCxcbiAgTnpSYW5nZVBpY2tlckNvbXBvbmVudCxcbiAgTnpTZWxlY3RDb21wb25lbnQsXG4gIE56VGltZVBpY2tlckNvbXBvbmVudCxcbn0gZnJvbSBcIm5nLXpvcnJvLWFudGRcIjtcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IFRvdGFsT3B0aW9uIH0gZnJvbSBcIi4uL2hkLWRldGFpbC1saW5lcy9oZC1kZXRhaWwtbGluZXMuc2VydmljZVwiO1xuaW1wb3J0IHsgU2VsZWN0T3B0aW9uVGFibGVDb2x1bW4gfSBmcm9tIFwiLi4vbW9kZWwvY29tbW9uLXR5cGVcIjtcbmltcG9ydCB7IEZvcm1MaW5lLCBGb3JtTGluZVR5cGUgfSBmcm9tIFwiLi9oZC1mb3JtLWxpbmVzLnNlcnZpY2VcIjtcblxuLyoqIOS4jiBhbnQtc2VsZWN0IOmAiemhuemhueawtOW5s+WGhei+uei3neS4gOiHtO+8jOeUqOS6juihqOWktOS4jumAiemhueihjOWvuem9kCAqL1xuY29uc3QgU0VMRUNUX1RBQkxFX09QVElPTl9IT1JJWk9OVEFMX1BBRERJTkcgPSAxMjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImhkLWZvcm0tbGluZXNcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9oZC1mb3JtLWxpbmVzLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9oZC1mb3JtLWxpbmVzLmNvbXBvbmVudC5sZXNzXCJdLFxufSlcbmV4cG9ydCBjbGFzcyBIZEZvcm1MaW5lc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZHJlbihcImZvcm1JbnB1dERvbVwiKSBmb3JtSW5wdXREb21MaXN0ITogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBzaG93TGluZU51bWJlcjogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBhbGxvd0VtcHR5OiBib29sZWFuID0gdHJ1ZTtcbiAgQE91dHB1dCgpIGRlbGV0ZUxhc3RMaW5lRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBzaG93S2V5Ym9hcmRPcGVyYXRlVGlwOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSB0YWJsZUxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dTZWFyY2g6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIOaYr+WQpuWxleekuuihjOWLvumAieWIl++8jOeUqOS6juWklumDqOaJuemHj+aTjeS9nOWLvumAieihjCAqL1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgc2hvd0NoZWNrYm94OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGZvcm1MaW5lczogQXJyYXk8Rm9ybUxpbmU+O1xuICAvLyDpkojlr7lmb3JtTGluZXPph4zpnaLmiYDmnInnmoRuYW1l77yMXG4gIEBJbnB1dCgpIGZvcm1MaW5lc0RhdGE6IGFueTtcbiAgQElucHV0KCkgb3BlcmF0ZUJ1dHRvbnM6IEFycmF5PHN0cmluZz4gPSBbXCJhZGRcIiwgXCJkZWxldGVcIl07IC8vIOaTjeS9nOWIl+aMiemSru+8mmFkZCAvIGRlbGV0ZSAvIGNvcHlcbiAgQElucHV0KCkgc2Nyb2xsOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0geyB4OiBcIjFweFwiIH07XG4gIEBPdXRwdXQoKSBjaGFuZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgLyoqIOWLvumAieWPmOWMluaXtuaKm+WHuuW9k+WJjeWLvumAieihjCBGb3JtR3JvdXAg5YiX6KGoICovXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEZvcm1Hcm91cFtdPigpO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgc2hvd0RlbGV0ZUNvbmZpcm06IGJvb2xlYW4gPSBmYWxzZTtcbiAgcGFnaW5hdGlvblBhZ2VJbmRleDogbnVtYmVyID0gMTtcbiAgcGFnaW5hdGlvblBhZ2VTaXplOiBudW1iZXIgPSAxMDtcbiAgdmFsaWRhdGVIZEZvcm1MaW5lczogRm9ybUdyb3VwO1xuICBuZXdMaW5lOiBhbnk7XG4gIGlucHV0VmFsdWU6IHN0cmluZztcblxuICAvLyDlkIjorqHljLrln59cbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dUb3RhbDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB0b3RhbE9wdGlvbjogQXJyYXk8VG90YWxPcHRpb24+ID0gW107XG4gIEBJbnB1dCgpIGNvbHVtbnNOdW1iZXI6IG51bWJlciB8IHN0cmluZyA9IDA7XG4gIHRvdGFsT3B0aW9uTGlzdCA9IFtdO1xuXG4gIHNob3dGb3JtOiBib29sZWFuID0gZmFsc2U7XG4gIGZpbHRlclN0cjogc3RyaW5nO1xuICBzdG9yZUZvcm1MaW5lc0RhdGE6IGFueSA9IFtdOyAvLyDnvJPlrZjnmoTmgLvnmoTooajljZXmlbDmja5cbiAgZmlsdGVyU3RvcmVGb3JtTGluZXNEYXRhOiBhbnkgPSBbXTsgLy8g562b6YCJ5Ye65p2l55qE5pWw5o2u5YiX6KGoXG4gIGZpbHRlckluZGV4U3RvcmU6IEFycmF5PG51bWJlcj4gPSBbXTsgLy8g562b6YCJ5Ye65p2l55qE5pWw5o2u5Zyo5Y6f5aeL5YiX6KGo5Lit55qE5LiL5qCHXG4gIGlzRmlsdGVyRGF0YTogYm9vbGVhbiA9IGZhbHNlOyAvLyDmmK/lkKbmmK/lt7Lnu4/nrZvpgInov4fnmoTmlbDmja5cbiAgZm9ybVZhbGlkOiBib29sZWFuID0gZmFsc2U7IC8vIOihqOWNleW9k+WJjeeahOeKtuaAgVxuICAvKiog5Yu+6YCJ55qE6KGMIGlk77yI6Leo6aG144CB5pCc57Si6YeN5bu65ZCO5LuN5L+d55WZ77yJICovXG4gIHByaXZhdGUgc2VsZWN0ZWRSb3dJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBzZWFyY2hTdWJqZWN0ID0gbmV3IFN1YmplY3Q8eyBmbjogYW55OyBldmVudDogYW55OyBsaW5lOiBhbnkgfT4oKTtcbiAgcHJpdmF0ZSBkZWJvdW5jZVRpbWVvdXQ6IG51bWJlciA9IDA7IC8vIOm7mOiupOmYsuaKluaXtumXtFxuXG4gIHByaXZhdGUgc2VhcmNoU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZm9ybUlucHV0RG9tTGlzdFN1YjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgb3BlbkNoYW5nZVN1YmplY3QgPSBuZXcgU3ViamVjdDx7IGZuOiBhbnk7IGV2ZW50OiBhbnk7IGxpbmU6IGFueSB9PigpO1xuICBwcml2YXRlIG9wZW5DaGFuZ2VEZWJvdW5jZVRpbWVvdXQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgb3BlbkNoYW5nZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuXG4gIC8vIOW9k+WJjemhteeahGRvbeS6jOe7tOaVsOe7hFxuICBjb2xsZWN0RG9tTGlzdDogQXJyYXk8XG4gICAgQXJyYXk8XG4gICAgICB8IEVsZW1lbnRSZWZcbiAgICAgIHwgTnpTZWxlY3RDb21wb25lbnRcbiAgICAgIHwgTnpJbnB1dE51bWJlckNvbXBvbmVudFxuICAgICAgfCBOekRhdGVQaWNrZXJDb21wb25lbnRcbiAgICAgIHwgTnpSYW5nZVBpY2tlckNvbXBvbmVudFxuICAgICAgfCBOelRpbWVQaWNrZXJDb21wb25lbnRcbiAgICA+XG4gID4gPSBbXTtcbiAgLy8g5b2T5YmN6IGa54Sm55qEZG9t5YWD57Sg5Z2Q5qCHXG4gIGFjdGl2ZURvbVg6IG51bWJlciA9IG51bGw7XG4gIGFjdGl2ZURvbVk6IG51bWJlciA9IG51bGw7XG4gIGFjdGl2ZURvbTpcbiAgICB8IEVsZW1lbnRSZWZcbiAgICB8IE56U2VsZWN0Q29tcG9uZW50XG4gICAgfCBOeklucHV0TnVtYmVyQ29tcG9uZW50XG4gICAgfCBOekRhdGVQaWNrZXJDb21wb25lbnRcbiAgICB8IE56UmFuZ2VQaWNrZXJDb21wb25lbnRcbiAgICB8IE56VGltZVBpY2tlckNvbXBvbmVudCA9IG51bGw7XG4gIGFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBAQ29udGVudENoaWxkKFwiVmlld0RvbVJpZ2h0VGVtcGxhdGVcIiwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIFZpZXdEb21SaWdodFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAvKiog5bel5YW35qCP5bem5L6n6Ieq5a6a5LmJ5oyJ6ZKu77yM55So5rOV5ZCMIGhkLXRhYmxlIOeahCB0YWJsZUxlZnRCdXR0b24gKi9cbiAgQENvbnRlbnRDaGlsZChcImZvcm1MaW5lc0xlZnRCdXR0b25cIiwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGZvcm1MaW5lc0xlZnRCdXR0b246IFRlbXBsYXRlUmVmPGFueT47XG4gIC8qKiDlt6XlhbfmoI/lj7Pkvqfoh6rlrprkuYnmjInpkq7vvIznlKjms5XlkIwgaGQtdGFibGUg55qEIHRhYmxlUmlnaHRCdXR0b24gKi9cbiAgQENvbnRlbnRDaGlsZChcImZvcm1MaW5lc1JpZ2h0QnV0dG9uXCIsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBmb3JtTGluZXNSaWdodEJ1dHRvbjogVGVtcGxhdGVSZWY8YW55PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICkge1xuICAgIHRoaXMuc2VhcmNoU3Vic2NyaXB0aW9uID0gdGhpcy5zZWFyY2hTdWJqZWN0XG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUodGhpcy5kZWJvdW5jZVRpbWVvdXQpKVxuICAgICAgLnN1YnNjcmliZSgoeyBmbiwgZXZlbnQsIGxpbmUgfSkgPT4gdGhpcy50cmlnZ2VyRXZlbnQoZm4sIGV2ZW50LCBsaW5lKSk7XG4gICAgdGhpcy5vcGVuQ2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy5vcGVuQ2hhbmdlU3ViamVjdFxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKHRoaXMub3BlbkNoYW5nZURlYm91bmNlVGltZW91dCkpXG4gICAgICAuc3Vic2NyaWJlKCh7IGZuLCBldmVudCwgbGluZSB9KSA9PiB7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgIHRoaXMudHJpZ2dlckV2ZW50KGZuLCBldmVudCwgbGluZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgLy8g57yT5a2Y5LiA5LiL5oC755qE6KGo5Y2V5pWw5o2uXG4gICAgdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEgPSB0aGlzLmZvcm1MaW5lc0RhdGE7XG4gICAgdGhpcy5pbml0KCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5jb2xsZWN0RG9tRGF0YSgpO1xuICAgIHRoaXMuZm9ybUlucHV0RG9tTGlzdFN1YiA9IHRoaXMuZm9ybUlucHV0RG9tTGlzdC5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmNvbGxlY3REb21EYXRhKCk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5zZWFyY2hTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc2VhcmNoU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wZW5DaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMub3BlbkNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5mb3JtSW5wdXREb21MaXN0U3ViKSB7XG4gICAgICB0aGlzLmZvcm1JbnB1dERvbUxpc3RTdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgZm9ybUxpbmVzTGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aDtcbiAgfVxuXG4gIGdldCBvcGVyYXRlQ29sV2lkdGgoKSB7XG4gICAgY29uc3QgY291bnQgPSAodGhpcy5vcGVyYXRlQnV0dG9ucyB8fCBbXSkuZmlsdGVyKChidG4pID0+XG4gICAgICBbXCJhZGRcIiwgXCJjb3B5XCIsIFwiZGVsZXRlXCJdLmluY2x1ZGVzKGJ0biksXG4gICAgKS5sZW5ndGg7XG4gICAgcmV0dXJuIE1hdGgubWF4KGNvdW50ICogNDAsIDgwKTtcbiAgfVxuXG4gIC8qKiBhbGxvd0VtcHR5IOS4lOaTjeS9nOWIl+S7heacieWIoOmZpOaXtu+8muWFgeiuuCAwIOihjO+8jOWIneWni+WMluS4juWIoOiHs+epuumDveS4jeiHquWKqOihpeepuuihjCAqL1xuICBnZXQgaXNUcnVseUVtcHR5QWxsb3dlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBidXR0b25zID0gKHRoaXMub3BlcmF0ZUJ1dHRvbnMgfHwgW10pLmZpbHRlcigoYnRuKSA9PlxuICAgICAgW1wiYWRkXCIsIFwiY29weVwiLCBcImRlbGV0ZVwiXS5pbmNsdWRlcyhidG4pLFxuICAgICk7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuYWxsb3dFbXB0eSAmJlxuICAgICAgYnV0dG9ucy5sZW5ndGggPT09IDEgJiZcbiAgICAgIGJ1dHRvbnNbMF0gPT09IFwiZGVsZXRlXCJcbiAgICApO1xuICB9XG5cbiAgLyoqIOWLvumAieWIl+WbuuWumuaXtu+8jOW6j+WPt+WIl+eahCBsZWZ0IOWBj+enuyAqL1xuICBnZXQgbGluZU51bWJlckxlZnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0NoZWNrYm94ID8gXCI0MHB4XCIgOiBcIjBweFwiO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZVJvd0lkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBoZF9yb3dfJHtEYXRlLm5vdygpfV8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDkpfWA7XG4gIH1cblxuICBwcml2YXRlIGdldFJvd0lkKGxpbmU6IEZvcm1Hcm91cCk6IHN0cmluZyB7XG4gICAgaWYgKCFsaW5lIHx8ICFsaW5lLmdldChcIl9oZFJvd0lkXCIpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGxpbmUuZ2V0KFwiX2hkUm93SWRcIikudmFsdWU7XG4gIH1cblxuICAvKiog5b2T5YmN6aG155qE6KGM77yI55So5LqO6KGo5aS05YWo6YCJ77yM5LuF5L2c55So5LqO5b2T5YmN6aG177yM6Leo6aG15Yu+6YCJ5LuN5L+d55WZ77yJICovXG4gIHByaXZhdGUgZ2V0Q3VycmVudFBhZ2VMaW5lcygpOiBGb3JtR3JvdXBbXSB7XG4gICAgY29uc3Qgc3RhcnQgPSAodGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4IC0gMSkgKiB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZTtcbiAgICBjb25zdCBlbmQgPSBzdGFydCArIHRoaXMucGFnaW5hdGlvblBhZ2VTaXplO1xuICAgIHJldHVybiAodGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scyBhcyBGb3JtR3JvdXBbXSkuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gIH1cblxuICBpc0xpbmVDaGVja2VkKGxpbmU6IEZvcm1Hcm91cCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlkID0gdGhpcy5nZXRSb3dJZChsaW5lKTtcbiAgICByZXR1cm4gISFpZCAmJiB0aGlzLnNlbGVjdGVkUm93SWRzLmhhcyhpZCk7XG4gIH1cblxuICBpc0FsbENoZWNrZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGFnZUxpbmVzID0gdGhpcy5nZXRDdXJyZW50UGFnZUxpbmVzKCk7XG4gICAgcmV0dXJuIChcbiAgICAgIHBhZ2VMaW5lcy5sZW5ndGggPiAwICYmXG4gICAgICBwYWdlTGluZXMuZXZlcnkoKGxpbmUpID0+IHRoaXMuaXNMaW5lQ2hlY2tlZChsaW5lKSlcbiAgICApO1xuICB9XG5cbiAgaXNJbmRldGVybWluYXRlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhZ2VMaW5lcyA9IHRoaXMuZ2V0Q3VycmVudFBhZ2VMaW5lcygpO1xuICAgIGNvbnN0IGNoZWNrZWRDb3VudCA9IHBhZ2VMaW5lcy5maWx0ZXIoKGxpbmUpID0+XG4gICAgICB0aGlzLmlzTGluZUNoZWNrZWQobGluZSksXG4gICAgKS5sZW5ndGg7XG4gICAgcmV0dXJuIGNoZWNrZWRDb3VudCA+IDAgJiYgY2hlY2tlZENvdW50IDwgcGFnZUxpbmVzLmxlbmd0aDtcbiAgfVxuXG4gIG9uQWxsQ2hlY2tlZChjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5nZXRDdXJyZW50UGFnZUxpbmVzKCkuZm9yRWFjaCgobGluZSkgPT4ge1xuICAgICAgY29uc3QgaWQgPSB0aGlzLmdldFJvd0lkKGxpbmUpO1xuICAgICAgaWYgKCFpZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkUm93SWRzLmFkZChpZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlbGVjdGVkUm93SWRzLmRlbGV0ZShpZCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gIH1cblxuICBvbkxpbmVDaGVja2VkQ2hhbmdlKGxpbmU6IEZvcm1Hcm91cCwgY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGlkID0gdGhpcy5nZXRSb3dJZChsaW5lKTtcbiAgICBpZiAoIWlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjaGVja2VkKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUm93SWRzLmFkZChpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dJZHMuZGVsZXRlKGlkKTtcbiAgICB9XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRTZWxlY3Rpb25DaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzLmdldFNlbGVjdGVkTGluZXMoKSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUxpbmVGcm9tU2VsZWN0aW9uKGxpbmU6IEZvcm1Hcm91cCk6IHZvaWQge1xuICAgIGNvbnN0IGlkID0gdGhpcy5nZXRSb3dJZChsaW5lKTtcbiAgICBpZiAoaWQgJiYgdGhpcy5zZWxlY3RlZFJvd0lkcy5oYXMoaWQpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUm93SWRzLmRlbGV0ZShpZCk7XG4gICAgICB0aGlzLmVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5VmFsdWVzVG9MaW5lKFxuICAgIGxpbmU6IEZvcm1Hcm91cCxcbiAgICB2YWx1ZXM6IHsgW2ZpZWxkOiBzdHJpbmddOiBhbnkgfSxcbiAgICBlbWl0RXZlbnQ6IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIE9iamVjdC5rZXlzKHZhbHVlcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBsZXQgY29udHJvbCA9IGxpbmUuZ2V0KGtleSk7XG4gICAgICBpZiAoIWNvbnRyb2wpIHtcbiAgICAgICAgbGluZS5hZGRDb250cm9sKGtleSwgdGhpcy5mYi5jb250cm9sKHZhbHVlc1trZXldKSk7XG4gICAgICAgIGNvbnRyb2wgPSBsaW5lLmdldChrZXkpO1xuICAgICAgfVxuICAgICAgLy8g6Z2Z6buY6LWL5YC877yM6YG/5YWNIHZhbHVlQ2hhbmdlcyAvIERPTSBtYXhsZW5ndGgg5Zue5YaZ5oqK5qCh6aqM5oCB5omT5LmxXG4gICAgICBjb250cm9sLnNldFZhbHVlKHZhbHVlc1trZXldLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICBjb250cm9sLm1hcmtBc1ByaXN0aW5lKHsgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICBjb250cm9sLm1hcmtBc1VudG91Y2hlZCh7IG9ubHlTZWxmOiB0cnVlIH0pO1xuICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIGlmIChlbWl0RXZlbnQpIHtcbiAgICAgICAgY29uc3QgZm9ybUl0ZW0gPSB0aGlzLmZvcm1MaW5lcy5maW5kKChpdGVtKSA9PiBpdGVtLm5hbWUgPT09IGtleSk7XG4gICAgICAgIGlmIChmb3JtSXRlbSAmJiBmb3JtSXRlbS5vbkNoYW5nZUV2ZW50KSB7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoZm9ybUl0ZW0ub25DaGFuZ2VFdmVudCwgdmFsdWVzW2tleV0sIGxpbmUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIOS7heWcqOeUqOaIt+S6pOS6kuWQjuOAgeS4lOW9k+WJjeWAvOehruWunuS4uuepuueahCByZXF1aXJlZCDplJnor6/ml7blsZXnpLrnuqLmoYbvvIxcbiAgICog6YG/5YWN5om56YeP6LWL5YC85pe2IG5nLXpvcnJvIOaui+eVmeOAjOS4jeiDveS4uuepuuOAjeaPkOekulxuICAgKi9cbiAgZ2V0Q29udHJvbFZhbGlkYXRlU3RhdHVzKGxpbmU6IEZvcm1Hcm91cCwgZm9ybUl0ZW06IEZvcm1MaW5lKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb250cm9sID0gbGluZS5nZXQoZm9ybUl0ZW0ubmFtZSk7XG4gICAgaWYgKCFjb250cm9sIHx8IGNvbnRyb2wuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBjb25zdCBlbXB0eSA9XG4gICAgICBjb250cm9sLnZhbHVlID09PSBudWxsIHx8XG4gICAgICBjb250cm9sLnZhbHVlID09PSB1bmRlZmluZWQgfHxcbiAgICAgIGNvbnRyb2wudmFsdWUgPT09IFwiXCI7XG4gICAgaWYgKFxuICAgICAgKGNvbnRyb2wuZGlydHkgfHwgY29udHJvbC50b3VjaGVkKSAmJlxuICAgICAgZW1wdHkgJiZcbiAgICAgIGNvbnRyb2wuaGFzRXJyb3IoXCJyZXF1aXJlZFwiKVxuICAgICkge1xuICAgICAgcmV0dXJuIFwiZXJyb3JcIjtcbiAgICB9XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cblxuICAvKiog55So5oi36L6T5YWl5pe25oyJIG1heExlbmd0aCDmiKrmlq3vvIjkuI3kvb/nlKjljp/nlJ8gbWF4bGVuZ3Ro77yM6YG/5YWN5bmy5omw56iL5bqP5YyW6LWL5YC877yJICovXG4gIGxpbWl0SW5wdXRMZW5ndGgoZXZlbnQ6IEV2ZW50LCBsaW5lOiBGb3JtR3JvdXAsIGZvcm1JdGVtOiBGb3JtTGluZSk6IHZvaWQge1xuICAgIGlmICghZm9ybUl0ZW0gfHwgIWZvcm1JdGVtLm1heExlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGlmIChpbnB1dCAmJiBpbnB1dC52YWx1ZSAmJiBpbnB1dC52YWx1ZS5sZW5ndGggPiBmb3JtSXRlbS5tYXhMZW5ndGgpIHtcbiAgICAgIGNvbnN0IG5leHQgPSBpbnB1dC52YWx1ZS5zbGljZSgwLCBmb3JtSXRlbS5tYXhMZW5ndGgpO1xuICAgICAgaW5wdXQudmFsdWUgPSBuZXh0O1xuICAgICAgY29uc3QgY29udHJvbCA9IGxpbmUuZ2V0KGZvcm1JdGVtLm5hbWUpO1xuICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgY29udHJvbC5zZXRWYWx1ZShuZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiog6I635Y+W5b2T5YmN5Yu+6YCJ5LiU5bey5oyC6L2955qE6KGMIEZvcm1Hcm91cO+8iOW9k+WJjeetm+mAiee7k+aenOWGhe+8iSAqL1xuICBwdWJsaWMgZ2V0U2VsZWN0ZWRMaW5lcygpOiBGb3JtR3JvdXBbXSB7XG4gICAgcmV0dXJuICh0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzIGFzIEZvcm1Hcm91cFtdKS5maWx0ZXIoKGxpbmUpID0+XG4gICAgICB0aGlzLmlzTGluZUNoZWNrZWQobGluZSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blhajpg6jli77pgInooYzmlbDmja7vvIjlkKvot6jpobXjgIHmkJzntKLlkI7mnKrlsZXnpLrkvYbku43li77pgInnmoTooYzvvIlcbiAgICovXG4gIHB1YmxpYyBnZXRTZWxlY3RlZExpbmVzRGF0YSgpOiBhbnlbXSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgY29uc3QgbW91bnRlZEJ5SWQgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgICh0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzIGFzIEZvcm1Hcm91cFtdKS5mb3JFYWNoKChsaW5lKSA9PiB7XG4gICAgICBjb25zdCBpZCA9IHRoaXMuZ2V0Um93SWQobGluZSk7XG4gICAgICBpZiAoaWQgJiYgdGhpcy5zZWxlY3RlZFJvd0lkcy5oYXMoaWQpKSB7XG4gICAgICAgIG1vdW50ZWRCeUlkLnNldChpZCwgbGluZS5nZXRSYXdWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgICh0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YSB8fCBbXSkuZm9yRWFjaCgoZGF0YSkgPT4ge1xuICAgICAgY29uc3QgaWQgPSBkYXRhICYmIGRhdGEuX2hkUm93SWQ7XG4gICAgICBpZiAoaWQgJiYgdGhpcy5zZWxlY3RlZFJvd0lkcy5oYXMoaWQpKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKG1vdW50ZWRCeUlkLmhhcyhpZCkgPyBtb3VudGVkQnlJZC5nZXQoaWQpIDogeyAuLi5kYXRhIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8g5YWc5bqV77ya5Yia5paw5aKe44CB5bCa5pyq6L+bIHN0b3JlIOeahOWLvumAieihjFxuICAgIHRoaXMuc2VsZWN0ZWRSb3dJZHMuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgIXJlc3VsdC5zb21lKChpdGVtKSA9PiBpdGVtICYmIGl0ZW0uX2hkUm93SWQgPT09IGlkKSAmJlxuICAgICAgICBtb3VudGVkQnlJZC5oYXMoaWQpXG4gICAgICApIHtcbiAgICAgICAgcmVzdWx0LnB1c2gobW91bnRlZEJ5SWQuZ2V0KGlkKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiDmibnph4/loavlhYXli77pgInooYzlrZfmrrXvvIjmlK/mjIHot6jpobXjgIHmkJzntKLlkI7mnKrlsZXnpLrkvYbku43li77pgInnmoTooYzvvIlcbiAgICogQHBhcmFtIHZhbHVlcyDopoHlhpnlhaXnmoTlrZfmrrXvvIzlpoIgeyByZW1hcms6ICfmibnph4/lpIfms6gnLCBwcmljZTogMTAgfVxuICAgKiBAcGFyYW0gZW1pdEV2ZW50IOaYr+WQpuinpuWPkSB2YWx1ZUNoYW5nZXMgLyBvbkNoYW5nZUV2ZW5077yM6buY6K6kIHRydWVcbiAgICogQHJldHVybnMg5a6e6ZmF5aGr5YWF55qE6KGM5pWwXG4gICAqL1xuICBwdWJsaWMgYmF0Y2hGaWxsU2VsZWN0ZWQoXG4gICAgdmFsdWVzOiB7IFtmaWVsZDogc3RyaW5nXTogYW55IH0sXG4gICAgZW1pdEV2ZW50OiBib29sZWFuID0gdHJ1ZSxcbiAgKTogbnVtYmVyIHtcbiAgICBpZiAoIXZhbHVlcyB8fCB0aGlzLnNlbGVjdGVkUm93SWRzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCBtb3VudGVkQnlJZCA9IG5ldyBNYXA8c3RyaW5nLCBGb3JtR3JvdXA+KCk7XG4gICAgKHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMgYXMgRm9ybUdyb3VwW10pLmZvckVhY2goKGxpbmUpID0+IHtcbiAgICAgIGNvbnN0IGlkID0gdGhpcy5nZXRSb3dJZChsaW5lKTtcbiAgICAgIGlmIChpZCkge1xuICAgICAgICBtb3VudGVkQnlJZC5zZXQoaWQsIGxpbmUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICB0aGlzLnNlbGVjdGVkUm93SWRzLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICBjb25zdCBsaW5lID0gbW91bnRlZEJ5SWQuZ2V0KGlkKTtcbiAgICAgIGlmIChsaW5lKSB7XG4gICAgICAgIHRoaXMuYXBwbHlWYWx1ZXNUb0xpbmUobGluZSwgdmFsdWVzLCBlbWl0RXZlbnQpO1xuICAgICAgICBjb3VudCsrO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyDlvZPliY3nrZvpgIkv6aG16Z2i5pyq5oyC6L2977ya55u05o6l5pS55oC75pWw5o2u77yM6YCA5Ye65pCc57Si5ZCO5Y+v6KeBXG4gICAgICBjb25zdCBzdG9yZUl0ZW0gPSAodGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEgfHwgW10pLmZpbmQoXG4gICAgICAgIChkYXRhKSA9PiBkYXRhICYmIGRhdGEuX2hkUm93SWQgPT09IGlkLFxuICAgICAgKTtcbiAgICAgIGlmIChzdG9yZUl0ZW0pIHtcbiAgICAgICAgT2JqZWN0LmtleXModmFsdWVzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICBzdG9yZUl0ZW1ba2V5XSA9IHZhbHVlc1trZXldO1xuICAgICAgICB9KTtcbiAgICAgICAgY291bnQrKztcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY291bnQ7XG4gIH1cblxuICAvKiog5riF56m65Yu+6YCJICovXG4gIHB1YmxpYyBjbGVhclNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZFJvd0lkcy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRSb3dJZHMuY2xlYXIoKTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgfVxuXG4gIC8qKiDlvZPliY3li77pgInmlbDph4/vvIjlkKvot6jpobXjgIHmkJzntKLkv53nlZnvvIkgKi9cbiAgcHVibGljIGdldFNlbGVjdGVkQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFJvd0lkcy5zaXplO1xuICB9XG5cbiAgLyoqIOaYr+WQpuWxleekuumhtumDqOW3peWFt+agjyAqL1xuICBnZXQgc2hvd1Rvb2xiYXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhdGhpcy5zaG93U2VhcmNoIHx8XG4gICAgICAhIXRoaXMuc2hvd0NoZWNrYm94IHx8XG4gICAgICAhIXRoaXMuZm9ybUxpbmVzTGVmdEJ1dHRvbiB8fFxuICAgICAgISF0aGlzLmZvcm1MaW5lc1JpZ2h0QnV0dG9uXG4gICAgKTtcbiAgfVxuXG4gIHNldEFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3Blbih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuYWN0aXZlU2VsZWN0ZWRDb21wb25lbnRPcGVuID0gdmFsdWU7XG4gICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29uc3QgZG9tTGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICAgICAgXCIuYW50LXNlbGVjdC1kcm9wZG93bi5oZC1zZWxlY3QtdGFibGVcIixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGRvbUxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGRvbSA9IGRvbUxpc3RbMF07XG4gICAgICAgICAgZG9tXG4gICAgICAgICAgICAucXVlcnlTZWxlY3RvckFsbChcIi5oZC1vcHRpb24taGVhZGVyXCIpXG4gICAgICAgICAgICAuZm9yRWFjaCgoaGVhZGVyKSA9PiBoZWFkZXIucmVtb3ZlKCkpO1xuICAgICAgICAgIGNvbnN0IG9sZEluZGV4ID0gdGhpcy5nZXRPbGREb21JbmRleCh0aGlzLmFjdGl2ZURvbVksIHRoaXMuZm9ybUxpbmVzKTtcbiAgICAgICAgICBkb20uaW5zZXJ0QmVmb3JlKFxuICAgICAgICAgICAgdGhpcy5jcmVhdGVET01TdHJ1Y3R1cmUoXG4gICAgICAgICAgICAgIHRoaXMuZm9ybUxpbmVzW29sZEluZGV4XSxcbiAgICAgICAgICAgICAgdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5zbGljZShcbiAgICAgICAgICAgICAgICAodGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4IC0gMSkgKiB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZSxcbiAgICAgICAgICAgICAgICAodGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4IC0gMSkgKiB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZSArXG4gICAgICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZSxcbiAgICAgICAgICAgICAgKVt0aGlzLmFjdGl2ZURvbVhdLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGRvbS5maXJzdENoaWxkLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0sIDApO1xuICAgIH1cbiAgfVxuXG4gIGdldFNlbGVjdFRhYmxlQ29sdW1uU3R5bGUoY29sdW1uOiBTZWxlY3RPcHRpb25UYWJsZUNvbHVtbik6IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmc7XG4gIH0ge1xuICAgIGlmICghY29sdW1uIHx8ICFjb2x1bW4ud2lkdGgpIHtcbiAgICAgIHJldHVybiB7IHdpZHRoOiBcInVuc2V0XCIgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgd2lkdGg6IGAke2NvbHVtbi53aWR0aH1weGAgfTtcbiAgfVxuXG4gIGNyZWF0ZURPTVN0cnVjdHVyZShmb3JtSXRlbSwgbGluZSkge1xuICAgIC8vIOWIm+W7uuWklumDqCBkaXZcbiAgICBjb25zdCBoZE9wdGlvbkhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgaGRPcHRpb25IZWFkZXIuY2xhc3NOYW1lID0gXCJoZC1vcHRpb24taGVhZGVyXCI7XG4gICAgaGRPcHRpb25IZWFkZXIuc3R5bGUucGFkZGluZ0xlZnQgPSBgJHtTRUxFQ1RfVEFCTEVfT1BUSU9OX0hPUklaT05UQUxfUEFERElOR31weGA7XG4gICAgaGRPcHRpb25IZWFkZXIuc3R5bGUucGFkZGluZ1JpZ2h0ID0gYCR7U0VMRUNUX1RBQkxFX09QVElPTl9IT1JJWk9OVEFMX1BBRERJTkd9cHhgO1xuXG4gICAgLy8g5qOA5p+l5p2h5Lu277yM56Gu5a6a5piv5ZCm6KaB5Yib5bu65a2Q5YWD57SgXG4gICAgLy8gY29uc3Qgc2VsZWN0TGlzdExlbmd0aCA9IChmb3JtSXRlbSAmJiBmb3JtSXRlbS5zZWxlY3RPcHRpb24gJiYgZm9ybUl0ZW0uc2VsZWN0T3B0aW9uLnNlbGVjdExpc3QgJiYgZm9ybUl0ZW0uc2VsZWN0T3B0aW9uLnNlbGVjdExpc3QubGVuZ3RoKSB8fCAwO1xuICAgIC8vIGlmXG4gICAgLy8gY29uc3QgbGluZVZhbHVlTGVuZ3RoID0gKGxpbmUuZ2V0KGZvcm1JdGVtLnNlbGVjdE9wdGlvbi5zZWxlY3RMaXN0TmFtZSkgJiYgbGluZS5nZXQoZm9ybUl0ZW0uc2VsZWN0T3B0aW9uLnNlbGVjdExpc3ROYW1lKS52YWx1ZSAmJiBsaW5lLmdldChmb3JtSXRlbS5zZWxlY3RPcHRpb24uc2VsZWN0TGlzdE5hbWUpLnZhbHVlLmxlbmd0aCkgfHwgMDtcblxuICAgIC8vIGlmIChzZWxlY3RMaXN0TGVuZ3RoID4gMCB8fCBsaW5lVmFsdWVMZW5ndGggPiAwKSB7XG4gICAgLy8g6YGN5Y6GIHRhYmxlQ29sdW1ucyDliJvlu7rlhoXpg6jliJcgZGl2XG4gICAgZm9ybUl0ZW0uc2VsZWN0T3B0aW9uLnRhYmxlQ29sdW1ucy5mb3JFYWNoKChzZWxlY3RPcHRpb25UYWJsZUNvbHVtbikgPT4ge1xuICAgICAgY29uc3QgY29sdW1uRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGNvbHVtbkRpdi5jbGFzc05hbWUgPSBcImhkLW9wdGlvbi1oZWFkZXItY29sdW1uXCI7XG5cbiAgICAgIGNvbnN0IHdpZHRoU3R5bGUgPSB0aGlzLmdldFNlbGVjdFRhYmxlQ29sdW1uU3R5bGUoXG4gICAgICAgIHNlbGVjdE9wdGlvblRhYmxlQ29sdW1uLFxuICAgICAgKTtcbiAgICAgIGNvbHVtbkRpdi5zdHlsZS53aWR0aCA9IHdpZHRoU3R5bGUud2lkdGg7XG5cbiAgICAgIC8vIOa3u+WKoOWIl+agh+etvuWGheWuuVxuICAgICAgaWYgKHNlbGVjdE9wdGlvblRhYmxlQ29sdW1uLmxhYmVsKSB7XG4gICAgICAgIGNvbnN0IGxhYmVsVGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFxuICAgICAgICAgIHNlbGVjdE9wdGlvblRhYmxlQ29sdW1uLmxhYmVsLFxuICAgICAgICApO1xuICAgICAgICBjb2x1bW5EaXYuYXBwZW5kQ2hpbGQobGFiZWxUZXh0KTtcbiAgICAgIH1cblxuICAgICAgLy8g5re75Yqg5YiXIGRpdiDliLDlpJbpg6ggZGl2XG4gICAgICBoZE9wdGlvbkhlYWRlci5hcHBlbmRDaGlsZChjb2x1bW5EaXYpO1xuICAgIH0pO1xuICAgIC8vIH1cblxuICAgIHJldHVybiBoZE9wdGlvbkhlYWRlcjtcbiAgfVxuXG4gIGNvbGxlY3REb21EYXRhKCkge1xuICAgIHRoaXMuY29sbGVjdERvbUxpc3QgPSBbXTtcbiAgICBjb25zdCBwYWdlRG9tTGlzdCA9IHRoaXMuZm9ybUlucHV0RG9tTGlzdC50b0FycmF5KCk7XG4gICAgLy8gU3RlcCAxOiDojrflj5blvZPliY3pobXnmoTmlbDmja7ph49cbiAgICBjb25zdCBzdGFydEluZGV4ID0gKHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCAtIDEpICogdGhpcy5wYWdpbmF0aW9uUGFnZVNpemU7XG4gICAgY29uc3QgZW5kSW5kZXggPSB0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXggKiB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZTtcbiAgICBjb25zdCBhZGp1c3RlZEVuZEluZGV4ID1cbiAgICAgIGVuZEluZGV4ID4gdGhpcy5mb3JtTGluZXNMZW5ndGggPyB0aGlzLmZvcm1MaW5lc0xlbmd0aCA6IGVuZEluZGV4O1xuICAgIGNvbnN0IHBhZ2VMaW5lc0xlbmd0aCA9IGFkanVzdGVkRW5kSW5kZXggLSBzdGFydEluZGV4O1xuXG4gICAgY29uc3QgaW50ZXJ2YWwgPSBwYWdlRG9tTGlzdC5sZW5ndGggLyBwYWdlTGluZXNMZW5ndGg7XG4gICAgLy8gU3RlcCAyOiDmi4bliIZmb3JtSW5wdXREb21MaXN0XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYWdlTGluZXNMZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5jb2xsZWN0RG9tTGlzdC5wdXNoKHBhZ2VEb21MaXN0LnNwbGljZSgwLCBpbnRlcnZhbCkpO1xuICAgIH1cbiAgICB0aGlzLmRpc2FibGVJbnB1dE51bWJlcktleWJvYXJkU3RlcCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIG5nLXpvcnJvIDgg5ZyoIGlucHV0IOeahCBvbktleURvd24g6YeM55So5LiK5LiL6ZSu6LCDIHVwKCkvZG93bigpIOaUuSBzdGVw44CCXG4gICAqIOWPquimhuebliBvbktleURvd27vvIjkuI3liqggdXAvZG93bu+8ie+8jOmUruebmOaWueWQkemUruS6pOe7meihqOWNlei3s+i9rO+8jCsvLSDmjInpkq7ku43lj6/nlKjjgIJcbiAgICovXG4gIHByaXZhdGUgZGlzYWJsZUlucHV0TnVtYmVyS2V5Ym9hcmRTdGVwKCk6IHZvaWQge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvbGxlY3REb21MaXN0W2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGNvbnN0IGRvbSA9IHRoaXMuY29sbGVjdERvbUxpc3RbaV1bal07XG4gICAgICAgIGlmIChkb20gaW5zdGFuY2VvZiBOeklucHV0TnVtYmVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgZG9tLm9uS2V5RG93biA9IChlOiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSAzOCB8fCBlLmtleUNvZGUgPT09IDQwKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDEzKSB7XG4gICAgICAgICAgICAgIGRvbS5zZXRWYWxpZGF0ZVZhbHVlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIOiBmueEpuS4i+S4gOS4qmRvbVxuICBqdW1wVG9OZXh0SW5wdXQoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICBpZiAoXG4gICAgICB4ID09PSBudWxsIHx8XG4gICAgICB5ID09PSBudWxsIHx8XG4gICAgICAhdGhpcy5jb2xsZWN0RG9tTGlzdCB8fFxuICAgICAgdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGggPT09IDBcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8g5aaC5p6c5piv5pyA5ZCO5LiA5Liq5Y+v6L6T5YWl5YWD57Sg77yM5paw5aKe6KGMXG4gICAgaWYgKFxuICAgICAgISh0aGlzLmFjdGl2ZURvbSBpbnN0YW5jZW9mIE56U2VsZWN0Q29tcG9uZW50KSAmJlxuICAgICAgeCA9PT0gdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGggLSAxICYmXG4gICAgICB5ID09PSB0aGlzLmNvbGxlY3REb21MaXN0WzBdLmxlbmd0aCAtIDFcbiAgICApIHtcbiAgICAgIHRoaXMuYWRkTmV3TGluZUFuZEZvY3VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh5ID09PSB0aGlzLmNvbGxlY3REb21MaXN0WzBdLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCLmiafooYzov4fnqIsxXCIpO1xuICAgICAgICAvLyDlpoLmnpzmmK/mnIDlkI7kuIDliJfvvIzliJnot7PovazliLDkuIvkuIDooYznrKzkuIDkuKrovpPlhaXmoYZcbiAgICAgICAgdGhpcy5mb2N1c0RvbSh4ICsgMSwgMCwgXCJyaWdodFwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi5omn6KGM6L+H56iLMlwiKTtcbiAgICAgICAgLy8g5aaC5p6c5LiN5piv5pyA5ZCO5LiA5YiX77yM5YiZ6Lez6L2s5Yiw5b2T5YmN6KGM5LiL5LiA5Liq6L6T5YWl5qGGXG4gICAgICAgIHRoaXMuZm9jdXNEb20oeCwgeSArIDEsIFwicmlnaHRcIik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWinuWKoOaWsOihjOW5tuS4lOiBmueEpuWIsOesrOS4gOS4quWFg+e0oO+8jFxuICAgKiDov5nph4zopoHms6jmhI/vvIzlpoLmnpzlrZjlnKjnv7vpobXmg4XlhrXvvIzpnIDopoHlpITnkIZcbiAgICovXG4gIGFkZE5ld0xpbmVBbmRGb2N1cygpIHtcbiAgICAvLyDlvZPliY3ooYzkuLrlvZPliY3pobXmnIDlkI7kuIDooYznmoTml7blgJnvvIzliKTmlq3kuIvkuIDpobXmmK/lkKbmnInmlbDmja5cbiAgICAvLyAx44CB5aaC5p6c5pyJ77ya57+76aG1K+iBmueEpuesrOS4gOihjOesrOS4gOS4quWFg+e0oFxuICAgIC8vIDLjgIHlpoLmnpzmsqHmnInvvJrmlrDlop7ooYwr57+76aG1K+iBmueEpuesrOS4gOihjOesrOS4gOS4quWFg+e0oFxuICAgIGlmICh0aGlzLmFjdGl2ZURvbVggPT09IHRoaXMucGFnaW5hdGlvblBhZ2VTaXplIC0gMSkge1xuICAgICAgLy8g5Yik5pat5LiL5LiA6aG15piv5ZCm5pyJ5pWw5o2uXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCA8XG4gICAgICAgIE1hdGguY2VpbCh0aGlzLmZvcm1MaW5lc0xlbmd0aCAvIHRoaXMucGFnaW5hdGlvblBhZ2VTaXplKVxuICAgICAgKSB7XG4gICAgICAgIC8vIOe/u+mhtSvogZrnhKbnrKzkuIDooYznrKzkuIDkuKrlhYPntKBcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4Kys7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY29sbGVjdERvbURhdGEoKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIuaJp+ihjOi/h+eoizNcIik7XG4gICAgICAgICAgdGhpcy5mb2N1c0RvbSgwLCAwLCBcInJpZ2h0XCIpO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOaWsOWinuihjCvnv7vpobUr6IGa54Sm56ys5LiA6KGM56ys5LiA5Liq5YWD57SgXG4gICAgICAgIHRoaXMuYWRkRm9ybUxpbmUoKTtcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4Kys7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY29sbGVjdERvbURhdGEoKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIuaJp+ihjOi/h+eoizRcIik7XG4gICAgICAgICAgdGhpcy5mb2N1c0RvbSgwLCAwKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRkRm9ybUxpbmUoKTtcbiAgICB9XG4gIH1cblxuICAvLyDogZrnhKbliLDkuIrkuIDkuKpkb21cbiAganVtcFRvUHJldklucHV0KHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gICAgaWYgKFxuICAgICAgeCA9PT0gbnVsbCB8fFxuICAgICAgeSA9PT0gbnVsbCB8fFxuICAgICAgIXRoaXMuY29sbGVjdERvbUxpc3QgfHxcbiAgICAgIHRoaXMuY29sbGVjdERvbUxpc3QubGVuZ3RoID09PSAwXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh4ID09PSAwICYmIHkgPT09IDApIHtcbiAgICAgIC8vIOWmguaenOaYr+esrOS4gOS4quWPr+i+k+WFpeWFg+e0oO+8jCDliKTmlq3mmK/lkKbmnInkuIrkuIDpobXvvIwg5aaC5p6c5pyJ77yM5YiZ57+76aG1K+iBmueEpuWIsOS4iuS4gOmhteacgOWQjuS4gOS4quWFg+e0oFxuICAgICAgaWYgKHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCA+IDEpIHtcbiAgICAgICAgLy8g57+76aG1K+iBmueEpuWIsOS4iuS4gOmhteacgOWQjuS4gOS4quWFg+e0oFxuICAgICAgICB0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXgtLTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jb2xsZWN0RG9tRGF0YSgpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwi5omn6KGM6L+H56iLNVwiKTtcbiAgICAgICAgICB0aGlzLmZvY3VzRG9tKFxuICAgICAgICAgICAgdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGggLSAxLFxuICAgICAgICAgICAgdGhpcy5jb2xsZWN0RG9tTGlzdFswXS5sZW5ndGggLSAxLFxuICAgICAgICAgICk7XG4gICAgICAgIH0sIDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoeSA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIuaJp+ihjOi/h+eoizZcIik7XG4gICAgICAgIC8vIOWmguaenOaYr+esrOS4gOWIl++8jOWImei3s+i9rOWIsOS4iuS4gOihjOacgOWQjuS4gOS4qui+k+WFpeahhlxuICAgICAgICB0aGlzLmZvY3VzRG9tKHggLSAxLCB0aGlzLmNvbGxlY3REb21MaXN0WzBdLmxlbmd0aCAtIDEsIFwibGVmdFwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi5omn6KGM6L+H56iLN1wiKTtcbiAgICAgICAgLy8g5aaC5p6c5LiN5piv56ys5LiA5YiX77yM5YiZ6Lez6L2s5Yiw5b2T5YmN6KGM5LiK5LiA5Liq6L6T5YWl5qGGXG4gICAgICAgIHRoaXMuZm9jdXNEb20oeCwgeSAtIDEsIFwibGVmdFwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6IGa54Sm5Yiw5p+Q5LiqZG9tXG4gICAqIEBwYXJhbSB4IOWdkOagh3hcbiAgICogQHBhcmFtIHkg5Z2Q5qCHeVxuICAgKiBAcGFyYW0ganVtcERpcmVjdGlvbiDot7PovazmlrnlkJFcbiAgICovXG4gIGZvY3VzRG9tKHg6IG51bWJlciwgeTogbnVtYmVyLCBqdW1wRGlyZWN0aW9uOiBzdHJpbmcgPSBcInJpZ2h0XCIpIHtcbiAgICBpZiAoXG4gICAgICB4ID09PSBudWxsIHx8XG4gICAgICB5ID09PSBudWxsIHx8XG4gICAgICAhdGhpcy5jb2xsZWN0RG9tTGlzdCB8fFxuICAgICAgdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGggPT09IDBcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8g5YWI5riF6Zmk5LiA5LiL5b2T5YmN55qE54Sm54K5XG4gICAgdGhpcy5jbGVhbkZvY3VzRG9tKHRoaXMuYWN0aXZlRG9tWCwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgICBpZiAodGhpcy5jb2xsZWN0RG9tTGlzdFt4XSAmJiB0aGlzLmNvbGxlY3REb21MaXN0W3hdW3ldKSB7XG4gICAgICBjb25zdCBkb20gPSB0aGlzLmNvbGxlY3REb21MaXN0W3hdW3ldO1xuICAgICAgLy8g6ZyA6KaB5Yik5pat5LiL5LiA5LiqZm9jdXPnmoRkb23mmK/lkKbmmK/npoHnlKjnirbmgIHvvIzlpoLmnpzmmK/npoHnlKjnirbmgIHpnIDopoHot7Pov4dcbiAgICAgIGlmIChkb20gaW5zdGFuY2VvZiBOelNlbGVjdENvbXBvbmVudCkge1xuICAgICAgICBpZiAoZG9tLm56RGlzYWJsZWQpIHtcbiAgICAgICAgICBpZiAoanVtcERpcmVjdGlvbiA9PT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgICB0aGlzLmp1bXBUb05leHRJbnB1dCh4LCB5KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGp1bXBEaXJlY3Rpb24gPT09IFwibGVmdFwiKSB7XG4gICAgICAgICAgICB0aGlzLmp1bXBUb1ByZXZJbnB1dCh4LCB5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGRvbS5uelNlbGVjdFRvcENvbnRyb2xDb21wb25lbnQuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoXG4gICAgICAgICAgeyBiZWhhdmlvcjogXCJzbW9vdGhcIiwgYmxvY2s6IFwiY2VudGVyXCIsIGlubGluZTogXCJjZW50ZXJcIiB9LFxuICAgICAgICApO1xuICAgICAgICAvLyDov5nph4zlpJrpgInmoYbpnIDopoHpop3lpJblpITnkIbkuIvvvIzlm6DkuLrlkJHkuIvnmoTml7blgJnkvJrop6blj5HlhoXpg6hJbnB1dOeahOiBmueEpu+8jOaKiuS4i+S4gOS4qmRvbeeahGZvY3Vz5pS+5Yiw5a6P5Lu75Yqh5Lit77yM5bu26L+f5aSE55CG44CCXG4gICAgICAgIGlmIChkb20ubnpTZWxlY3RTZXJ2aWNlLm1vZGUgPT09IFwibXVsdGlwbGVcIikge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgZG9tLmZvY3VzKCk7XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZG9tLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZG9tIGluc3RhbmNlb2YgTnpJbnB1dE51bWJlckNvbXBvbmVudCkge1xuICAgICAgICBpZiAoZG9tLm56RGlzYWJsZWQpIHtcbiAgICAgICAgICBpZiAoanVtcERpcmVjdGlvbiA9PT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgICB0aGlzLmp1bXBUb05leHRJbnB1dCh4LCB5KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGp1bXBEaXJlY3Rpb24gPT09IFwibGVmdFwiKSB7XG4gICAgICAgICAgICB0aGlzLmp1bXBUb1ByZXZJbnB1dCh4LCB5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlucHV0RG9tOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkb20ubnpJZCk7XG4gICAgICAgIGlucHV0RG9tLmZvY3VzKCk7XG4gICAgICAgIGlucHV0RG9tLnNjcm9sbEludG9WaWV3KHtcbiAgICAgICAgICBiZWhhdmlvcjogXCJzbW9vdGhcIixcbiAgICAgICAgICBibG9jazogXCJjZW50ZXJcIixcbiAgICAgICAgICBpbmxpbmU6IFwiY2VudGVyXCIsXG4gICAgICAgIH0pO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpbnB1dERvbS5zZWxlY3QoKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9IGVsc2UgaWYgKGRvbSBpbnN0YW5jZW9mIEVsZW1lbnRSZWYpIHtcbiAgICAgICAgaWYgKGRvbS5uYXRpdmVFbGVtZW50LmRpc2FibGVkKSB7XG4gICAgICAgICAgaWYgKGp1bXBEaXJlY3Rpb24gPT09IFwicmlnaHRcIikge1xuICAgICAgICAgICAgdGhpcy5qdW1wVG9OZXh0SW5wdXQoeCwgeSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChqdW1wRGlyZWN0aW9uID09PSBcImxlZnRcIikge1xuICAgICAgICAgICAgdGhpcy5qdW1wVG9QcmV2SW5wdXQoeCwgeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkb20ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICBkb20ubmF0aXZlRWxlbWVudC5zY3JvbGxJbnRvVmlldyh7XG4gICAgICAgICAgYmVoYXZpb3I6IFwic21vb3RoXCIsXG4gICAgICAgICAgYmxvY2s6IFwiY2VudGVyXCIsXG4gICAgICAgICAgaW5saW5lOiBcImNlbnRlclwiLFxuICAgICAgICB9KTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgZG9tLm5hdGl2ZUVsZW1lbnQuc2VsZWN0KCk7XG4gICAgICAgIH0sIDApO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgZG9tIGluc3RhbmNlb2YgTnpEYXRlUGlja2VyQ29tcG9uZW50IHx8XG4gICAgICAgIGRvbSBpbnN0YW5jZW9mIE56UmFuZ2VQaWNrZXJDb21wb25lbnQgfHxcbiAgICAgICAgZG9tIGluc3RhbmNlb2YgTnpUaW1lUGlja2VyQ29tcG9uZW50XG4gICAgICApIHtcbiAgICAgICAgLy8gVE9ETzrlnKhuZ3pvcnJvOC41LnjniYjmnKzvvIzml7bpl7Tnm7jlhbPnmoTpgInmi6nlmajmsqHmnInmmrTpnLLlh7pvcGVu5pa55rOV77yM5pqC5pe25YWI5LiN5aSE55CG44CC77yIMTAueOWPiuS7peS4iueJiOacrOaPkOS+m+S6hm9wZW7mlrnms5XvvIlcbiAgICAgICAgaWYgKGp1bXBEaXJlY3Rpb24gPT09IFwicmlnaHRcIikge1xuICAgICAgICAgIHRoaXMuanVtcFRvTmV4dElucHV0KHgsIHkpO1xuICAgICAgICB9IGVsc2UgaWYgKGp1bXBEaXJlY3Rpb24gPT09IFwibGVmdFwiKSB7XG4gICAgICAgICAgdGhpcy5qdW1wVG9QcmV2SW5wdXQoeCwgeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRBY3RpdmVEb20oeCwgeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOayoeaciWRvbeeahOWcuuaZr+S4i++8jOmcgOimgeWIpOaWreaYr+W3pui/mOaYr+WPs++8jFxuICAgIH1cbiAgfVxuXG4gIGNsZWFuRm9jdXNEb20oeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICBpZiAoXG4gICAgICB4ID09PSBudWxsIHx8XG4gICAgICB5ID09PSBudWxsIHx8XG4gICAgICAhdGhpcy5jb2xsZWN0RG9tTGlzdCB8fFxuICAgICAgdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGggPT09IDBcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29sbGVjdERvbUxpc3RbeF0gJiYgdGhpcy5jb2xsZWN0RG9tTGlzdFt4XVt5XSkge1xuICAgICAgY29uc3QgZG9tID0gdGhpcy5jb2xsZWN0RG9tTGlzdFt4XVt5XTtcbiAgICAgIGlmIChkb20gaW5zdGFuY2VvZiBOelNlbGVjdENvbXBvbmVudCkge1xuICAgICAgICBkb20uYmx1cigpO1xuICAgICAgICBkb20ubnpPcGVuID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKGRvbSBpbnN0YW5jZW9mIE56SW5wdXROdW1iZXJDb21wb25lbnQpIHtcbiAgICAgICAgZG9tLmJsdXIoKTtcbiAgICAgIH0gZWxzZSBpZiAoZG9tIGluc3RhbmNlb2YgRWxlbWVudFJlZikge1xuICAgICAgICBkb20ubmF0aXZlRWxlbWVudC5ibHVyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldEFjdGl2ZURvbSh4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgIHRoaXMuYWN0aXZlRG9tWCA9IHg7XG4gICAgdGhpcy5hY3RpdmVEb21ZID0geTtcbiAgICB0aGlzLmFjdGl2ZURvbSA9IHRoaXMuY29sbGVjdERvbUxpc3RbdGhpcy5hY3RpdmVEb21YXVt0aGlzLmFjdGl2ZURvbVldO1xuICAgIGlmICh0aGlzLmFjdGl2ZURvbSBpbnN0YW5jZW9mIE56U2VsZWN0Q29tcG9uZW50KSB7XG4gICAgICB0aGlzLnNldEFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3Blbih0aGlzLmFjdGl2ZURvbS5vcGVuKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5qC55o2u6KGM5Y+35ZKM5YiX5Y+35ZCN56ew6I635Y+W5b2T5YmN6IGa54Sm55qEZG9t5L2N572uXG4gICAqIEBwYXJhbSByb3dOdW1iZXIg6KGM5Y+3XG4gICAqIEBwYXJhbSBjb2xOdW1iZXIg5YiX5Y+3XG4gICAqL1xuICBzZXRBY3RpdmVEb21JbkZvcm1MaW5lcyhyb3dOdW1iZXI6IG51bWJlciwgY29sTnVtYmVyOiBudW1iZXIpIHtcbiAgICB0aGlzLmFjdGl2ZURvbVggPSByb3dOdW1iZXI7XG4gICAgdGhpcy5hY3RpdmVEb21ZID0gdGhpcy5nZXREb21JbmRleChjb2xOdW1iZXIsIHRoaXMuZm9ybUxpbmVzKTtcbiAgICB0aGlzLnNldEFjdGl2ZURvbSh0aGlzLmFjdGl2ZURvbVgsIHRoaXMuYWN0aXZlRG9tWSk7XG4gIH1cblxuICAvKipcbiAgICog6ZSu55uY54K55Ye75LqL5Lu2XG4gICAqIEBwYXJhbSBldmVudCDplK7nm5jkuovku7ZcbiAgICogQHJldHVybnNcbiAgICovXG4gIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmICh0aGlzLmFjdGl2ZURvbVggPT09IG51bGwgfHwgdGhpcy5hY3RpdmVEb21ZID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlIFwiQXJyb3dVcFwiOlxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5hY3RpdmVEb20gaW5zdGFuY2VvZiBOelNlbGVjdENvbXBvbmVudCAmJlxuICAgICAgICAgIHRoaXMuYWN0aXZlU2VsZWN0ZWRDb21wb25lbnRPcGVuXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hY3RpdmVEb21YICE9PSAwKSB7XG4gICAgICAgICAgdGhpcy5mb2N1c0RvbSh0aGlzLmFjdGl2ZURvbVggLSAxLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkFycm93RG93blwiOlxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5hY3RpdmVEb20gaW5zdGFuY2VvZiBOelNlbGVjdENvbXBvbmVudCAmJlxuICAgICAgICAgIHRoaXMuYWN0aXZlU2VsZWN0ZWRDb21wb25lbnRPcGVuXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyDliKTmlq3mmK/lkKblnKjmnIDlkI7kuIDooYzvvIzliqDooYxcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlRG9tWCA9PT0gdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgdGhpcy5jbGVhbkZvY3VzRG9tKHRoaXMuYWN0aXZlRG9tWCwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgICAgICAgICB0aGlzLmFkZE5ld0xpbmVBbmRGb2N1cygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZm9jdXNEb20odGhpcy5hY3RpdmVEb21YICsgMSwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJBcnJvd0xlZnRcIjpcbiAgICAgICAgdGhpcy5qdW1wVG9QcmV2SW5wdXQodGhpcy5hY3RpdmVEb21YLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJBcnJvd1JpZ2h0XCI6XG4gICAgICAgIHRoaXMuanVtcFRvTmV4dElucHV0KHRoaXMuYWN0aXZlRG9tWCwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiRW50ZXJcIjpcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlRG9tIGluc3RhbmNlb2YgTnpTZWxlY3RDb21wb25lbnQpIHtcbiAgICAgICAgICB0aGlzLnNldEFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3Blbih0aGlzLmFjdGl2ZURvbS5vcGVuKTtcbiAgICAgICAgICBpZiAodGhpcy5hY3RpdmVTZWxlY3RlZENvbXBvbmVudE9wZW4gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzRG9tKHRoaXMuYWN0aXZlRG9tWCwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5hY3RpdmVEb21YID09PSB0aGlzLmNvbGxlY3REb21MaXN0Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICB0aGlzLmFkZE5ld0xpbmVBbmRGb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkVzY2FwZVwiOlxuICAgICAgICBpZiAodGhpcy5hY3RpdmVEb20gaW5zdGFuY2VvZiBOelNlbGVjdENvbXBvbmVudCkge1xuICAgICAgICAgIGNvbnN0IG5vd0FjdGl2ZURvbSA9IHRoaXMuYWN0aXZlRG9tIGFzIE56U2VsZWN0Q29tcG9uZW50O1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVTZWxlY3RlZENvbXBvbmVudE9wZW4obm93QWN0aXZlRG9tLm9wZW4pO1xuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlU2VsZWN0ZWRDb21wb25lbnRPcGVuID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICBpZiAobm93QWN0aXZlRG9tLm56U2VsZWN0U2VydmljZS5tb2RlID09PSBcIm11bHRpcGxlXCIpIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNEb20odGhpcy5hY3RpdmVEb21YLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNEb20odGhpcy5hY3RpdmVEb21YLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyDlpoLmnpzlvZPliY3ogZrnhKbnmoTmmK/pgInmi6nmoYbvvIzkuJTplK7lhaUwLTlhLXpBLVrvvIzliJnlvLnlh7pcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuYWN0aXZlRG9tIGluc3RhbmNlb2YgTnpTZWxlY3RDb21wb25lbnQgJiZcbiAgICAgICAgICB0aGlzLmFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3BlbiA9PT0gZmFsc2UgJiZcbiAgICAgICAgICAvXlswLTlhLXpBLVpdJC8udGVzdChldmVudC5rZXkpXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGRvbSA9IHRoaXMuYWN0aXZlRG9tO1xuICAgICAgICAgIGRvbS5uek9wZW4gPSB0cnVlO1xuICAgICAgICAgIHRoaXMuc2V0QWN0aXZlU2VsZWN0ZWRDb21wb25lbnRPcGVuKHRydWUpO1xuICAgICAgICAgIC8vIC8vIFRPRE866L+Z6YeM5pqC5pe25rOo6YeK77yM5LiN6IO955u05o6l5bim5YWl6ZSu5YWl5YC877yM6L+Z5qC35Lya5a+86Ie06L6T5YWl5Lit5paH55qE5pe25YCZ5bim5YWl6Iux5paH5a2X56ym77yM5LiN56ym5ZCI6aKE5pyfXG4gICAgICAgICAgLy8gZG9tLm56U2VsZWN0VG9wQ29udHJvbENvbXBvbmVudC5pbnB1dFZhbHVlID0gZXZlbnQua2V5O1xuICAgICAgICAgIC8vIC8vIOiOt+WPliBpbnB1dCDlhYPntKBcbiAgICAgICAgICAvLyBjb25zdCBpbnB1dEVsZW1lbnQgPSBkb20ubnpTZWxlY3RUb3BDb250cm9sQ29tcG9uZW50LmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIC8vICAgLy8g6Kem5Y+R6L6T5YWl5LqL5Lu277yM5Lul56Gu5L+dIEFuZ3VsYXIg5qOA5rWL5Yiw5YC855qE5Y+Y5YyWXG4gICAgICAgICAgLy8gICBjb25zdCBldmVudElucHV0ID0gbmV3IEV2ZW50KCdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSB9KTtcbiAgICAgICAgICAvLyAgIGlucHV0RWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50SW5wdXQpO1xuICAgICAgICAgIC8vIH0sIDApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja7lnKjliJ3lp4tkb23kuIvmoIflkozmlbDmja7pm4Yg6I635Y+W5ZyoY29sbGVjdERvbUxpc3TkuK3nmoTkuIvmoIdcbiAgICogQHBhcmFtIGluZGV4IOWIneWni+S4i+agh1xuICAgKiBAcGFyYW0gbGlzdCDogIHmlbDmja7pm4ZcbiAgICogQHJldHVybnNcbiAgICovXG4gIHByaXZhdGUgZ2V0RG9tSW5kZXgoaW5kZXg6IG51bWJlciwgbGlzdDogQXJyYXk8Rm9ybUxpbmU+KTogbnVtYmVyIHtcbiAgICBjb25zdCB0eXBlTGlzdCA9IFtcbiAgICAgIFwiSW5wdXRcIixcbiAgICAgIFwiU2VsZWN0XCIsXG4gICAgICBcIkRhdGVcIixcbiAgICAgIFwiRGF0ZVJhbmdlXCIsXG4gICAgICBcIlRleHRBcmVhXCIsXG4gICAgICBcIklucHV0TnVtYmVyXCIsXG4gICAgICBcIk11bHRpcGxlU2VsZWN0XCIsXG4gICAgXTtcbiAgICBsZXQgZmlsdGVyTGlzdCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGkgPT09IGluZGV4KSB7XG4gICAgICAgIHJldHVybiBmaWx0ZXJMaXN0Lmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIC8vIOS4juaooeadv+S4gOiHtO+8mmhpZGUg55qE5YiX5LiN5riy5p+TICNmb3JtSW5wdXREb23vvIzkuI3orqHlhaUgY29sbGVjdERvbUxpc3Qg55qE5YiX5LiL5qCHXG4gICAgICBpZiAodHlwZUxpc3QuaW5jbHVkZXMobGlzdFtpXS50eXBlKSAmJiAhbGlzdFtpXS5oaWRlKSB7XG4gICAgICAgIGZpbHRlckxpc3QucHVzaChsaXN0W2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICog5qC55o2u5ZyoY29sbGVjdERvbUxpc3TkuK3nmoTkuIvmoIflkozmlbDmja7pm4Yg6I635Y+W5Yid5aeLZG9t5LiL5qCHXG4gICAqIEBwYXJhbSBpbmRleCDmlrDkuIvmoIdcbiAgICogQHBhcmFtIGxpc3Qg6ICB5pWw5o2u6ZuGXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwcml2YXRlIGdldE9sZERvbUluZGV4KGluZGV4OiBudW1iZXIsIGxpc3Q6IEFycmF5PEZvcm1MaW5lPik6IG51bWJlciB7XG4gICAgY29uc29sZS5sb2coXCJpbmRleFwiLCBpbmRleCk7XG4gICAgY29uc29sZS5sb2coXCJsaXN0XCIsIGxpc3QpO1xuICAgIGNvbnN0IHR5cGVMaXN0ID0gW1xuICAgICAgXCJJbnB1dFwiLFxuICAgICAgXCJTZWxlY3RcIixcbiAgICAgIFwiRGF0ZVwiLFxuICAgICAgXCJEYXRlUmFuZ2VcIixcbiAgICAgIFwiVGV4dEFyZWFcIixcbiAgICAgIFwiSW5wdXROdW1iZXJcIixcbiAgICAgIFwiTXVsdGlwbGVTZWxlY3RcIixcbiAgICBdO1xuICAgIGxldCBmaWx0ZXJMaXN0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodHlwZUxpc3QuaW5jbHVkZXMobGlzdFtpXS50eXBlKSAmJiAhbGlzdFtpXS5oaWRlKSB7XG4gICAgICAgIGZpbHRlckxpc3QucHVzaChsaXN0W2ldKTtcbiAgICAgICAgaWYgKGZpbHRlckxpc3QubGVuZ3RoID09PSBpbmRleCArIDEpIHtcbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGdldCBsaW5lc0Zvcm1BcnJheSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnZhbGlkYXRlSGRGb3JtTGluZXMuZ2V0KFwibGluZXNcIikgYXMgRm9ybUFycmF5O1xuICB9XG5cbiAgZ2V0IExvZGFzaFJvdW5kKCkge1xuICAgIHJldHVybiByb3VuZDtcbiAgfVxuXG4gIC8vIOaatOmcsueahOaWueazle+8jOeUqOS6juiOt+WPluaJgOacieaVsOaNrueahHZhbGlk54q25oCBXG4gIHB1YmxpYyBnZXRWYWxpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtVmFsaWQ7XG4gIH1cblxuICBvblNlYXJjaEV2ZW50KFxuICAgIGZuOiBhbnksXG4gICAgZXZlbnQ6IGFueSxcbiAgICBsaW5lOiBhbnksXG4gICAgb25TZWFyY2hFdmVudERlYm91bmNlVGltZTogYW55LFxuICApIHtcbiAgICBpZiAoIWZuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRlYm91bmNlTXMgPVxuICAgICAgb25TZWFyY2hFdmVudERlYm91bmNlVGltZSAhPSBudWxsID8gb25TZWFyY2hFdmVudERlYm91bmNlVGltZSA6IDA7XG4gICAgLy8g5pyq6YWN572u5oiW5Li6IDDvvJrlkIzmraXop6blj5HvvIzkuI3otbAgZGVib3VuY2VUaW1l77yI6YG/5YWN5byC5q2l77yJXG4gICAgaWYgKCFkZWJvdW5jZU1zKSB7XG4gICAgICB0aGlzLnRyaWdnZXJFdmVudChmbiwgZXZlbnQsIGxpbmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRlYm91bmNlVGltZW91dCA9IGRlYm91bmNlTXM7XG4gICAgICBpZiAodGhpcy5zZWFyY2hTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5zZWFyY2hTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VhcmNoU3Vic2NyaXB0aW9uID0gdGhpcy5zZWFyY2hTdWJqZWN0XG4gICAgICAgIC5waXBlKGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlVGltZW91dCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKHsgZm4sIGV2ZW50LCBsaW5lIH0pID0+IHRoaXMudHJpZ2dlckV2ZW50KGZuLCBldmVudCwgbGluZSkpO1xuICAgICAgdGhpcy5zZWFyY2hTdWJqZWN0Lm5leHQoeyBmbiwgZXZlbnQsIGxpbmUgfSk7XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zZXRBY3RpdmVTZWxlY3RlZENvbXBvbmVudE9wZW4odHJ1ZSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBvbk9wZW5DaGFuZ2VFdmVudChcbiAgICBmbjogYW55LFxuICAgIG9wZW46IGJvb2xlYW4sXG4gICAgbGluZTogYW55LFxuICAgIG9uT3BlbkNoYW5nZUV2ZW50RGVib3VuY2VUaW1lOiBhbnksXG4gICkge1xuICAgIGlmICghZm4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGVib3VuY2VNcyA9XG4gICAgICBvbk9wZW5DaGFuZ2VFdmVudERlYm91bmNlVGltZSAhPSBudWxsXG4gICAgICAgID8gb25PcGVuQ2hhbmdlRXZlbnREZWJvdW5jZVRpbWVcbiAgICAgICAgOiAwO1xuICAgIC8vIOacqumFjee9ruaIluS4uiAw77ya5ZCM5q2l6Kem5Y+R77yM5LiN6LWwIGRlYm91bmNlVGltZe+8iOmBv+WFjeW8guatpe+8iVxuICAgIGlmICghZGVib3VuY2VNcykge1xuICAgICAgaWYgKG9wZW4pIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoZm4sIG9wZW4sIGxpbmUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9wZW5DaGFuZ2VEZWJvdW5jZVRpbWVvdXQgPSBkZWJvdW5jZU1zO1xuICAgIGlmICh0aGlzLm9wZW5DaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMub3BlbkNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLm9wZW5DaGFuZ2VTdWJzY3JpcHRpb24gPSB0aGlzLm9wZW5DaGFuZ2VTdWJqZWN0XG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUodGhpcy5vcGVuQ2hhbmdlRGVib3VuY2VUaW1lb3V0KSlcbiAgICAgIC5zdWJzY3JpYmUoKHsgZm4sIGV2ZW50LCBsaW5lIH0pID0+IHtcbiAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoZm4sIGV2ZW50LCBsaW5lKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgdGhpcy5vcGVuQ2hhbmdlU3ViamVjdC5uZXh0KHsgZm4sIGV2ZW50OiBvcGVuLCBsaW5lIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBmbiDniLbnu4Tku7blh73mlbBcbiAgICogQHBhcmFtIGV2ZW50IOS6i+S7tuWAvFxuICAgKiBAcGFyYW0gbGluZSDop6blj5HnmoTooYxcbiAgICovXG4gIHRyaWdnZXJFdmVudChmbjogYW55LCBldmVudDogYW55LCBsaW5lOiBhbnkpIHtcbiAgICBpZiAoZm4pIHtcbiAgICAgIGZuKGV2ZW50LCBsaW5lKTtcbiAgICB9XG4gIH1cblxuICBpbm5lckdldFZhbGlkKCkge1xuICAgIGxldCB0bXBWYWxpZGF0ZUhkRm9ybUxpbmVzID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBsaW5lczogdGhpcy5mYi5hcnJheShbXSksXG4gICAgfSk7XG4gICAgdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEuZm9yRWFjaCgoZm9ybUxpbmVzRGF0YUl0ZW0pID0+IHtcbiAgICAgIGxldCBmb3JtR3JvdXBPYmo6IGFueSA9IHt9O1xuICAgICAgdGhpcy5mb3JtTGluZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAvLyDmlrDlop7ooYwg5Yid5aeL5pWw5o2u6YO95Li6bnVsbFxuICAgICAgICBmb3JtR3JvdXBPYmpbaXRlbS5uYW1lXSA9IHRoaXMuZmIuY29udHJvbChcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5qdWRnZVZhbHVlSXNOb3RFbXB0eShmb3JtTGluZXNEYXRhSXRlbVtpdGVtLm5hbWVdKVxuICAgICAgICAgICAgICA/IGZvcm1MaW5lc0RhdGFJdGVtW2l0ZW0ubmFtZV1cbiAgICAgICAgICAgICAgOiBpdGVtLnZhbHVlIHx8IG51bGwsXG4gICAgICAgICAgICBkaXNhYmxlZDogaXRlbS5kaXNhYmxlZCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGl0ZW0ucmVxdWlyZSA/IFtWYWxpZGF0b3JzLnJlcXVpcmVkXSA6IFtdLFxuICAgICAgICApO1xuICAgICAgICBpZiAoaXRlbS5zZWxlY3RPcHRpb24gJiYgaXRlbS5zZWxlY3RPcHRpb24ubGFiZWwpIHtcbiAgICAgICAgICBmb3JtR3JvdXBPYmpbaXRlbS5zZWxlY3RPcHRpb24ubGFiZWxdID0gdGhpcy5mYi5jb250cm9sKFxuICAgICAgICAgICAgZm9ybUxpbmVzRGF0YUl0ZW1baXRlbS5zZWxlY3RPcHRpb24ubGFiZWxdIHx8IG51bGwsXG4gICAgICAgICAgICBbXSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGZvcm1Hcm91cE9iai5saW5lSW5kZXggPSB0aGlzLmZiLmNvbnRyb2woXG4gICAgICAgICh0bXBWYWxpZGF0ZUhkRm9ybUxpbmVzLmdldChcImxpbmVzXCIpIGFzIEZvcm1BcnJheSkuY29udHJvbHMubGVuZ3RoICsgMSxcbiAgICAgICAgW10sXG4gICAgICApO1xuICAgICAgbGV0IGZvcm1Hcm91cFRtcCA9IHRoaXMuZmIuZ3JvdXAoZm9ybUdyb3VwT2JqKTtcbiAgICAgIHRoaXMuZm9ybUxpbmVzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKGl0ZW0ub25DaGFuZ2VFdmVudCkge1xuICAgICAgICAgIGNvbnN0IGRlYm91bmNlTXMgPVxuICAgICAgICAgICAgaXRlbS5vbkNoYW5nZUV2ZW50RGVib3VuY2VUaW1lICE9IG51bGxcbiAgICAgICAgICAgICAgPyBpdGVtLm9uQ2hhbmdlRXZlbnREZWJvdW5jZVRpbWVcbiAgICAgICAgICAgICAgOiAwO1xuICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtR3JvdXBUbXAuZ2V0KGl0ZW0ubmFtZSk7XG4gICAgICAgICAgLy8g5pyq6YWN572u5oiW5Li6IDDvvJrlkIzmraXorqLpmIXvvIzkuI3otbAgZGVib3VuY2VUaW1lXG4gICAgICAgICAgaWYgKGRlYm91bmNlTXMgPiAwKSB7XG4gICAgICAgICAgICBjb250cm9sLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoZGVib3VuY2VNcykpXG4gICAgICAgICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoaXRlbS5vbkNoYW5nZUV2ZW50LCB2YWx1ZSwgZm9ybUdyb3VwVG1wKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoaXRlbS5vbkNoYW5nZUV2ZW50LCB2YWx1ZSwgZm9ybUdyb3VwVG1wKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAodG1wVmFsaWRhdGVIZEZvcm1MaW5lcy5nZXQoXCJsaW5lc1wiKSBhcyBGb3JtQXJyYXkpLmluc2VydChcbiAgICAgICAgKHRtcFZhbGlkYXRlSGRGb3JtTGluZXMuZ2V0KFwibGluZXNcIikgYXMgRm9ybUFycmF5KS5jb250cm9scy5sZW5ndGgsXG4gICAgICAgIGZvcm1Hcm91cFRtcCxcbiAgICAgICk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRtcFZhbGlkYXRlSGRGb3JtTGluZXMudmFsaWQ7XG4gIH1cblxuICAvLyDmmrTpnLLnmoTmlrnms5XvvIznlKjkuo7ojrflj5bmiYDmnInmlbDmja5cbiAgcHVibGljIGdldExpbmVzKCkge1xuICAgIGxldCBhbGxMaW5lcyA9IFtdO1xuICAgIHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhLmZvckVhY2goKGZvcm1MaW5lc0RhdGFJdGVtKSA9PiB7XG4gICAgICBsZXQgZm9ybUdyb3VwT2JqOiBhbnkgPSB7fTtcbiAgICAgIHRoaXMuZm9ybUxpbmVzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgLy8g5paw5aKe6KGMIOWIneWni+aVsOaNrumDveS4um51bGxcbiAgICAgICAgZm9ybUdyb3VwT2JqW2l0ZW0ubmFtZV0gPSBmb3JtTGluZXNEYXRhSXRlbVtpdGVtLm5hbWVdO1xuICAgICAgfSk7XG4gICAgICBmb3JtR3JvdXBPYmoubGluZUluZGV4ID0gZm9ybUxpbmVzRGF0YUl0ZW0ubGluZUluZGV4O1xuICAgICAgYWxsTGluZXMucHVzaChmb3JtR3JvdXBPYmopO1xuICAgIH0pO1xuICAgIHJldHVybiBhbGxMaW5lcztcbiAgfVxuXG4gIC8vIOWFqOWxgOaAp+eahOaQnOe0ou+8iOa2teeblumhtemdouS4iuaJgOacieeahOWPr+inhuaWh+Wtl++8iVxuICBzZWFyY2hMaW5lcygpIHtcbiAgICBpZiAodGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEubGVuZ3RoIDwgMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRhYmxlTG9hZGluZyA9IHRydWU7XG4gICAgLy8g5aaC5p6c5rKh5pyJ6L6T5YWl5pCc57Si5a2X56ym5Liy77yM5YiZ5pi+56S657yT5a2Y5YaF55qE5omA5pyJ5pWw5o2uXG4gICAgaWYgKCF0aGlzLmZpbHRlclN0cikge1xuICAgICAgdGhpcy5pc0ZpbHRlckRhdGEgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2V0U3RvcmVEYXRhKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZpbHRlclZhbHVlID0gdGhpcy5maWx0ZXJTdHIudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgdGhpcy5pc0ZpbHRlckRhdGEgPSB0cnVlO1xuICAgIHRoaXMuZmlsdGVySW5kZXhTdG9yZSA9IFtdO1xuXG4gICAgLy8g5qC55o2u5pCc57Si5a2X56ym5Liy6L+H5ruk5pWw5o2uXG4gICAgY29uc3QgZmlsdGVyZWREYXRhID0gdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEuZmlsdGVyKFxuICAgICAgKGRhdGE6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5mb3JtTGluZXMpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAoaXRlbS5oaWRlICYmIGl0ZW0uY2FuU2VhcmNoKSB8fFxuICAgICAgICAgICAgKCFpdGVtLmhpZGUgJiYgaXRlbS5uYW1lICE9PSBcInV1aWRcIilcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiaXRlbVwiLCBpdGVtLm5hbWUpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkYXRhW2l0ZW0ubmFtZV1cbiAgICAgICAgICAgICAgPyBkYXRhW2l0ZW0ubmFtZV0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgIDogXCJcIjtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5maWx0ZXJJbmRleFN0b3JlLnB1c2goaW5kZXgpO1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSxcbiAgICApO1xuICAgIC8vIOe8k+WtmOS4gOS4i+etm+mAieWQjueahOihqOWNleaVsOaNrlxuICAgIHRoaXMuZmlsdGVyU3RvcmVGb3JtTGluZXNEYXRhID0gZmlsdGVyZWREYXRhO1xuICAgIC8vIOWkhOeQhuetm+mAieWlveeahOaVsOaNriDnhLblkI7ph43mlrDmuLLmn5NcbiAgICB0aGlzLmZvcm1MaW5lc0RhdGEgPSBmaWx0ZXJlZERhdGE7XG4gICAgdGhpcy5pbml0KHRydWUpO1xuICB9XG5cbiAgc2V0U3RvcmVEYXRhKCkge1xuICAgIHRoaXMuZm9ybUxpbmVzRGF0YSA9IHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhO1xuICAgIHRoaXMuaW5pdCh0cnVlKTtcbiAgfVxuXG4gIGdldFN0eWxlKGxpbmU6IEZvcm1Hcm91cCwgZm9ybUl0ZW06IGFueSwgd2lkdGg6IHN0cmluZykge1xuICAgIGxldCBzdHlsZU9iaiA9IHtcbiAgICAgIFwibWluLXdpZHRoXCI6IHdpZHRoLFxuICAgIH07XG4gICAgaWYgKGZvcm1JdGVtLnN0eWxlKSB7XG4gICAgICBzdHlsZU9iaiA9IHsgLi4uc3R5bGVPYmosIC4uLmZvcm1JdGVtLnN0eWxlIH07XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGZvcm1JdGVtLmNvbG9yT3B0aW9uICYmXG4gICAgICBmb3JtSXRlbS5jb2xvck9wdGlvbi5uYW1lICYmXG4gICAgICBsaW5lLmdldChmb3JtSXRlbS5jb2xvck9wdGlvbi5uYW1lKS52YWx1ZVxuICAgICkge1xuICAgICAgc3R5bGVPYmogPSB7XG4gICAgICAgIC4uLnN0eWxlT2JqLFxuICAgICAgICAuLi57IGNvbG9yOiBsaW5lLmdldChmb3JtSXRlbS5jb2xvck9wdGlvbi5uYW1lKS52YWx1ZSB9LFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHN0eWxlT2JqO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChcbiAgICAgIGNoYW5nZXNbXCJmb3JtTGluZXNEYXRhXCJdICYmXG4gICAgICBKU09OLnN0cmluZ2lmeShjaGFuZ2VzW1wiZm9ybUxpbmVzRGF0YVwiXS5jdXJyZW50VmFsdWUpICE9PVxuICAgICAgICBKU09OLnN0cmluZ2lmeShjaGFuZ2VzW1wiZm9ybUxpbmVzRGF0YVwiXS5wcmV2aW91c1ZhbHVlKVxuICAgICkge1xuICAgICAgaWYgKHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhICYmIHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YSA9IHRoaXMuZm9ybUxpbmVzRGF0YTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW5pdCgpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzW1widG90YWxPcHRpb25cIl0gJiZcbiAgICAgIEpTT04uc3RyaW5naWZ5KGNoYW5nZXNbXCJ0b3RhbE9wdGlvblwiXS5jdXJyZW50VmFsdWUpICE9PVxuICAgICAgICBKU09OLnN0cmluZ2lmeShjaGFuZ2VzW1widG90YWxPcHRpb25cIl0ucHJldmlvdXNWYWx1ZSlcbiAgICApIHtcbiAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWwoKTtcbiAgICB9XG4gIH1cblxuICBjYWxjdWxhdGVUb3RhbCgpIHtcbiAgICAvLyDov5nph4zlpITnkIblkIjorqHmlbDmja5cbiAgICBpZiAodGhpcy5zaG93VG90YWwpIHtcbiAgICAgIHRoaXMudG90YWxPcHRpb25MaXN0ID0gbmV3IEFycmF5KE51bWJlcih0aGlzLmNvbHVtbnNOdW1iZXIpIC0gMSkuZmlsbChcIlwiKTtcbiAgICAgIHRoaXMudG90YWxPcHRpb24uZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5pbnNlcnRJbmRleCAmJiAoaXRlbS5pbnNlcnRWYWx1ZSB8fCBpdGVtLmluc2VydFZhbHVlID09PSAwKSkge1xuICAgICAgICAgIHRoaXMudG90YWxPcHRpb25MaXN0W2l0ZW0uaW5zZXJ0SW5kZXggLSAxXSA9IHtcbiAgICAgICAgICAgIHZhbHVlOiBpdGVtLmluc2VydFZhbHVlLFxuICAgICAgICAgICAgYWxpZ246IGl0ZW0uYWxpZ24gfHwgXCJsZWZ0XCIsXG4gICAgICAgICAgICBzaG93RGVjaW1hbDogaXRlbS5zaG93RGVjaW1hbCB8fCBmYWxzZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXQoaXNFZGl0OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXggPSAxO1xuICAgIC8vIOW8guW4uOaNleiOt1xuICAgIGlmICghdGhpcy5jaGVja0xpc3QodGhpcy5mb3JtTGluZXMpKSB7XG4gICAgICB0aGlzLnRhYmxlTG9hZGluZyA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNyZWF0ZUZvcm0oKTtcbiAgICAvLyDlpoLmnpzmsqHmnIlmb3JtTGluZXNEYXRh77yM5YiZ6K6k5Li65piv5paw5aKeXG4gICAgaWYgKFxuICAgICAgIWlzRWRpdCAmJlxuICAgICAgKCF0aGlzLmZvcm1MaW5lc0RhdGEgfHxcbiAgICAgICAgKHRoaXMuZm9ybUxpbmVzRGF0YSAmJiB0aGlzLmZvcm1MaW5lc0RhdGEubGVuZ3RoID09PSAwKSlcbiAgICApIHtcbiAgICAgIHRoaXMudGFibGVMb2FkaW5nID0gZmFsc2U7XG4gICAgICAvLyBhbGxvd0VtcHR5IOS4lOS7heWIoOmZpOaMiemSru+8muS4jeiHquWKqOihpeepuuihjFxuICAgICAgaWYgKCF0aGlzLmlzVHJ1bHlFbXB0eUFsbG93ZWQpIHtcbiAgICAgICAgdGhpcy5hZGRGb3JtTGluZShudWxsLCBmYWxzZSk7XG4gICAgICB9XG4gICAgICB0aGlzLnNob3dGb3JtID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g57yW6L6R6YC76L6RXG4gICAgICB0aGlzLmFkZEZvcm1MaW5lV2l0aERhdGEoKTtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZUhkRm9ybUxpbmVzLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKGRhdGEpID0+XG4gICAgICB0aGlzLm9uSGRGb3JtVmFsdWVDaGFuZ2VkKGRhdGEpLFxuICAgICk7XG4gICAgdGhpcy5vbkhkRm9ybVZhbHVlQ2hhbmdlZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIm+W7uuihqOWNlVxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVGb3JtKCkge1xuICAgIHRoaXMudmFsaWRhdGVIZEZvcm1MaW5lcyA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgbGluZXM6IHRoaXMuZmIuYXJyYXkoW10pLFxuICAgIH0pO1xuICAgIHRoaXMubmV3TGluZSA9IHRoaXMubmV3TGluZUl0ZW0oKTtcbiAgfVxuXG4gIGRlbGF5SnVtcFRvTmV4dElucHV0KCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5qdW1wVG9OZXh0SW5wdXQodGhpcy5hY3RpdmVEb21YLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIOWumuS5ieepuueahG5ld0xpbmVJdGVtIOe7k+aehFxuICAgKi9cbiAgcHJpdmF0ZSBuZXdMaW5lSXRlbSgpOiBGb3JtR3JvdXAge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZUxpbmVGcm9tVmFsdWVzKG51bGwsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIOagueaNruihjOaVsOaNruWIm+W7uiBGb3JtR3JvdXDvvIjlkKvpmpDol4/lrZfmrrXjgIFzZWxlY3Qg55qEIGxhYmVsIOetiemZhOWxnuWtl+aute+8iVxuICAgKiBAcGFyYW0gZm9ybUxpbmVzRGF0YUl0ZW0g6KGM5pWw5o2u77yM56m66KGM5LygIG51bGxcbiAgICogQHBhcmFtIGlzRW1wdHlMaW5lIOaYr+WQpuepuuihjO+8iOW9seWTjeW/heWhq+agoemqjOinhOWIme+8jOS4juWOhuWPsumAu+i+keS/neaMgeS4gOiHtO+8iVxuICAgKiBAcGFyYW0gcmVnZW5lcmF0ZVJvd0lkIOaYr+WQpuW8uuWItueUn+aIkOaWsOihjCBpZO+8iOWkjeWItuihjOaXtuS9v+eUqO+8iVxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVMaW5lRnJvbVZhbHVlcyhcbiAgICBmb3JtTGluZXNEYXRhSXRlbTogYW55LFxuICAgIGlzRW1wdHlMaW5lOiBib29sZWFuID0gZmFsc2UsXG4gICAgcmVnZW5lcmF0ZVJvd0lkOiBib29sZWFuID0gZmFsc2UsXG4gICk6IEZvcm1Hcm91cCB7XG4gICAgbGV0IGZvcm1Hcm91cE9iajogYW55ID0ge307XG4gICAgdGhpcy5mb3JtTGluZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgZm9ybUdyb3VwT2JqW2l0ZW0ubmFtZV0gPSB0aGlzLmZiLmNvbnRyb2woXG4gICAgICAgIHtcbiAgICAgICAgICB2YWx1ZTpcbiAgICAgICAgICAgIGZvcm1MaW5lc0RhdGFJdGVtICE9IG51bGxcbiAgICAgICAgICAgICAgPyBmb3JtTGluZXNEYXRhSXRlbVtpdGVtLm5hbWVdXG4gICAgICAgICAgICAgIDogaXRlbS52YWx1ZSxcbiAgICAgICAgICBkaXNhYmxlZDogaXRlbS5kaXNhYmxlZCxcbiAgICAgICAgfSxcbiAgICAgICAgaXNFbXB0eUxpbmVcbiAgICAgICAgICA/IGl0ZW0ucmVxdWlyZSAmJiAhaXRlbS5oaWRlXG4gICAgICAgICAgICA/IFtWYWxpZGF0b3JzLnJlcXVpcmVkXVxuICAgICAgICAgICAgOiBbXVxuICAgICAgICAgIDogaXRlbS5yZXF1aXJlXG4gICAgICAgICAgICA/IFtWYWxpZGF0b3JzLnJlcXVpcmVkXVxuICAgICAgICAgICAgOiBbXSxcbiAgICAgICk7XG4gICAgICBpZiAoaXRlbS5zZWxlY3RPcHRpb24gJiYgaXRlbS5zZWxlY3RPcHRpb24ubGFiZWwpIHtcbiAgICAgICAgZm9ybUdyb3VwT2JqW2l0ZW0uc2VsZWN0T3B0aW9uLmxhYmVsXSA9IHRoaXMuZmIuY29udHJvbChcbiAgICAgICAgICBmb3JtTGluZXNEYXRhSXRlbSAhPSBudWxsXG4gICAgICAgICAgICA/IGZvcm1MaW5lc0RhdGFJdGVtW2l0ZW0uc2VsZWN0T3B0aW9uLmxhYmVsXSB8fCBudWxsXG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgW10sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyDnqLPlrprooYwgaWTvvJrmkJzntKLph43lu7rooajljZXlkI7nlKjkuo7kv53nlZnli77pgIlcbiAgICBjb25zdCByb3dJZCA9XG4gICAgICAhcmVnZW5lcmF0ZVJvd0lkICYmIGZvcm1MaW5lc0RhdGFJdGVtICYmIGZvcm1MaW5lc0RhdGFJdGVtLl9oZFJvd0lkXG4gICAgICAgID8gZm9ybUxpbmVzRGF0YUl0ZW0uX2hkUm93SWRcbiAgICAgICAgOiB0aGlzLmdlbmVyYXRlUm93SWQoKTtcbiAgICBmb3JtR3JvdXBPYmouX2hkUm93SWQgPSB0aGlzLmZiLmNvbnRyb2wocm93SWQpO1xuICAgIGlmIChmb3JtTGluZXNEYXRhSXRlbSAmJiAhZm9ybUxpbmVzRGF0YUl0ZW0uX2hkUm93SWQpIHtcbiAgICAgIGZvcm1MaW5lc0RhdGFJdGVtLl9oZFJvd0lkID0gcm93SWQ7XG4gICAgfVxuXG4gICAgLy8g5aSN5Yi25rqQ6KGM5LiK5aSa5L2Z55qE5a2X5q6177yI6ZqQ6JeP6ZmE5bGe5a2X5q6144CBc2VsZWN0TGlzdE5hbWUg562J77yJXG4gICAgaWYgKGZvcm1MaW5lc0RhdGFJdGVtKSB7XG4gICAgICBPYmplY3Qua2V5cyhmb3JtTGluZXNEYXRhSXRlbSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBrZXkgPT09IFwibGluZUluZGV4XCIgfHxcbiAgICAgICAgICBrZXkgPT09IFwiaXNIZEZvcm1MaW5lU2VhcmNoQWRkXCIgfHxcbiAgICAgICAgICBrZXkgPT09IFwiX2hkUm93SWRcIlxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmb3JtR3JvdXBPYmpba2V5XSkge1xuICAgICAgICAgIGZvcm1Hcm91cE9ialtrZXldID0gdGhpcy5mYi5jb250cm9sKGZvcm1MaW5lc0RhdGFJdGVtW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmb3JtR3JvdXBPYmoubGluZUluZGV4ID0gdGhpcy5mYi5jb250cm9sKFxuICAgICAgdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5sZW5ndGggKyAxLFxuICAgICAgW10sXG4gICAgKTtcbiAgICBmb3JtR3JvdXBPYmouaXNIZEZvcm1MaW5lU2VhcmNoQWRkID0gdGhpcy5mYi5jb250cm9sKHRoaXMuaXNGaWx0ZXJEYXRhLCBbXSk7XG4gICAgbGV0IGZvcm1Hcm91cFN1Ym1pdCA9IHRoaXMuZmIuZ3JvdXAoZm9ybUdyb3VwT2JqKTtcbiAgICB0aGlzLmZvcm1MaW5lcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBpZiAoaXRlbS5vbkNoYW5nZUV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGRlYm91bmNlTXMgPVxuICAgICAgICAgIGl0ZW0ub25DaGFuZ2VFdmVudERlYm91bmNlVGltZSAhPSBudWxsXG4gICAgICAgICAgICA/IGl0ZW0ub25DaGFuZ2VFdmVudERlYm91bmNlVGltZVxuICAgICAgICAgICAgOiAwO1xuICAgICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwU3VibWl0LmdldChpdGVtLm5hbWUpO1xuICAgICAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtLnR5cGUgPT09IEZvcm1MaW5lVHlwZS5TZWxlY3QgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsYXlKdW1wVG9OZXh0SW5wdXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoaXRlbS5vbkNoYW5nZUV2ZW50LCB2YWx1ZSwgZm9ybUdyb3VwU3VibWl0KTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8g5pyq6YWN572u5oiW5Li6IDDvvJrlkIzmraXorqLpmIXvvIzkuI3otbAgZGVib3VuY2VUaW1lXG4gICAgICAgIGlmIChkZWJvdW5jZU1zID4gMCkge1xuICAgICAgICAgIGNvbnRyb2wudmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoZGVib3VuY2VNcykpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGhhbmRsZUNoYW5nZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKGhhbmRsZUNoYW5nZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZm9ybUdyb3VwU3VibWl0O1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVMaW5lTnVtYmVyKCkge1xuICAgIHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgIGl0ZW0uZ2V0KFwibGluZUluZGV4XCIpLnNldFZhbHVlKGluZGV4ICsgMSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOe8lui+keeahOaXtuWAmeaVsOaNruWkhOeQhlxuICAgKi9cbiAgYWRkRm9ybUxpbmVXaXRoRGF0YSgpIHtcbiAgICB0aGlzLmZvcm1MaW5lc0RhdGEuZm9yRWFjaCgoZm9ybUxpbmVzRGF0YUl0ZW0pID0+IHtcbiAgICAgIHRoaXMubGluZXNGb3JtQXJyYXkuaW5zZXJ0KFxuICAgICAgICB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aCxcbiAgICAgICAgdGhpcy5jcmVhdGVMaW5lRnJvbVZhbHVlcyhmb3JtTGluZXNEYXRhSXRlbSksXG4gICAgICApO1xuICAgIH0pO1xuICAgIHRoaXMuY2FsY3VsYXRlTGluZU51bWJlcigpO1xuICAgIHRoaXMudGFibGVMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5zaG93Rm9ybSA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICog5Zyo5oyH5a6a6KGM5LiL5pa55paw5aKe56m66KGM77yb5LiN5LygIGFmdGVyTGluZSDliJnov73liqDliLDmnKvlsL5cbiAgICogQHBhcmFtIGFmdGVyTGluZSDlvZPliY3ooYwgRm9ybUdyb3Vw77yI5LiN6KaB5LygIGxpbmVJbmRleO+8jOmBv+WFjeW6j+WPt+WBj+enu+WvvOiHtOaPkumUmeS9jee9ru+8iVxuICAgKi9cbiAgYWRkRm9ybUxpbmUoYWZ0ZXJMaW5lPzogRm9ybUdyb3VwIHwgbnVsbCwgaXNGb2N1czogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBjb25zdCBpbnNlcnRBdCA9IHRoaXMuZ2V0SW5zZXJ0SW5kZXhBZnRlcihhZnRlckxpbmUpO1xuICAgIHRoaXMubGluZXNGb3JtQXJyYXkuaW5zZXJ0KGluc2VydEF0LCB0aGlzLm5ld0xpbmVJdGVtKCkpO1xuICAgIHRoaXMuY2FsY3VsYXRlTGluZU51bWJlcigpO1xuICAgIC8vIOi3s+WIsOaWsOWinuihjOaJgOWcqOmhte+8jOmBv+WFjemhteeggeW8guW4uOaXtueci+S4jeWIsOaVsOaNrlxuICAgIHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCA9XG4gICAgICBNYXRoLmZsb29yKGluc2VydEF0IC8gdGhpcy5wYWdpbmF0aW9uUGFnZVNpemUpICsgMTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY29sbGVjdERvbURhdGEoKTtcbiAgICAgIGlmIChpc0ZvY3VzKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlRG9tWCA9IHRoaXMudG9QYWdlTG9jYWxSb3dJbmRleChpbnNlcnRBdCk7XG4gICAgICAgIHRoaXMuYWN0aXZlRG9tWSA9IDA7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi5omn6KGM6L+H56iLMTNcIik7XG4gICAgICAgIHRoaXMuZm9jdXNEb20odGhpcy5hY3RpdmVEb21YLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgICAgfVxuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIOWkjeWItuW9k+WJjeihjO+8muWcqOW9k+WJjeihjOS4i+aWueaWsOWinuS4gOihjO+8jOWkjeWItuaJgOacieWtl+auteWAvO+8iOWQq+makOiXj+Wtl+aute+8iVxuICAgKi9cbiAgY29weUZvcm1MaW5lKGxpbmU6IEZvcm1Hcm91cCkge1xuICAgIGNvbnN0IHNvdXJjZUluZGV4ID0gdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5pbmRleE9mKGxpbmUpO1xuICAgIGlmIChzb3VyY2VJbmRleCA8IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gZ2V0UmF3VmFsdWUg5YyF5ZCrIGRpc2FibGVkIOWtl+aute+8m+WkjeWItuihjOS9v+eUqOaWsOeahCBfaGRSb3dJZFxuICAgIGNvbnN0IHNvdXJjZVZhbHVlcyA9IGxpbmUuZ2V0UmF3VmFsdWUoKTtcbiAgICBjb25zdCBpbnNlcnRBdCA9IHNvdXJjZUluZGV4ICsgMTtcbiAgICB0aGlzLmxpbmVzRm9ybUFycmF5Lmluc2VydChcbiAgICAgIGluc2VydEF0LFxuICAgICAgdGhpcy5jcmVhdGVMaW5lRnJvbVZhbHVlcyhzb3VyY2VWYWx1ZXMsIGZhbHNlLCB0cnVlKSxcbiAgICApO1xuICAgIHRoaXMuY2FsY3VsYXRlTGluZU51bWJlcigpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jb2xsZWN0RG9tRGF0YSgpO1xuICAgICAgdGhpcy5hY3RpdmVEb21YID0gdGhpcy50b1BhZ2VMb2NhbFJvd0luZGV4KGluc2VydEF0KTtcbiAgICAgIHRoaXMuYWN0aXZlRG9tWSA9IDA7XG4gICAgICB0aGlzLmZvY3VzRG9tKHRoaXMuYWN0aXZlRG9tWCwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIEBPdXRwdXQoKSBkZWxldGVMaW5lRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLyoqXG4gICAqIOWIoOmZpOihjFxuICAgKiBAcGFyYW0gbGluZU9ySW5kZXgg6KGMIEZvcm1Hcm91cO+8jOaIliAxLWJhc2VkIOeahCBsaW5lSW5kZXjvvIjlhbzlrrkgcmVzZXRGb3Jt77yJXG4gICAqL1xuICBkZWxldGVGb3JtTGluZShsaW5lT3JJbmRleDogRm9ybUdyb3VwIHwgbnVtYmVyKSB7XG4gICAgbGV0IHJlbW92ZUF0ID0gLTE7XG4gICAgaWYgKHR5cGVvZiBsaW5lT3JJbmRleCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgcmVtb3ZlQXQgPSBsaW5lT3JJbmRleCAtIDE7XG4gICAgfSBlbHNlIGlmIChsaW5lT3JJbmRleCkge1xuICAgICAgcmVtb3ZlQXQgPSB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmluZGV4T2YobGluZU9ySW5kZXgpO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIFwiaW5kZXhcIixcbiAgICAgIHR5cGVvZiBsaW5lT3JJbmRleCA9PT0gXCJudW1iZXJcIiA/IGxpbmVPckluZGV4IDogcmVtb3ZlQXQsXG4gICAgKTtcbiAgICBpZiAocmVtb3ZlQXQgPCAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIOacgOWQjuS4gOadoeaVsOaNrueahOaXtuWAmeimgeWIpOaWreS4gOS4i1xuICAgIGlmICh0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aCA9PT0gMSAmJiAhdGhpcy5hbGxvd0VtcHR5KSB7XG4gICAgICBpZiAodGhpcy5kZWxldGVMYXN0TGluZUV2ZW50KSB7XG4gICAgICAgIHRoaXMuZGVsZXRlTGFzdExpbmVFdmVudC5lbWl0KCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlbW92ZWRMaW5lID0gdGhpcy5saW5lc0Zvcm1BcnJheS5hdChyZW1vdmVBdCkgYXMgRm9ybUdyb3VwO1xuICAgIHRoaXMubGluZXNGb3JtQXJyYXkucmVtb3ZlQXQocmVtb3ZlQXQpO1xuICAgIHRoaXMucmVtb3ZlTGluZUZyb21TZWxlY3Rpb24ocmVtb3ZlZExpbmUpO1xuICAgIGlmIChcbiAgICAgICF0aGlzLmlzRmlsdGVyRGF0YSAmJlxuICAgICAgdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scyAmJlxuICAgICAgdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5sZW5ndGggPT09IDAgJiZcbiAgICAgICF0aGlzLmlzVHJ1bHlFbXB0eUFsbG93ZWRcbiAgICApIHtcbiAgICAgIHRoaXMuYWRkRm9ybUxpbmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g5b2T5YmN6aG15bey5peg5pWw5o2u5pe25Zue6YCA6aG156CB77yM5LiU6aG156CB5pyA5bCP5Li6IDHvvIjpgb/lhY3liKDnqbrlkI7lj5jmiJAgMCDlr7zoh7Tlho3mt7vliqDnnIvkuI3op4HvvIlcbiAgICAgIGNvbnN0IG1heFBhZ2UgPSBNYXRoLm1heChcbiAgICAgICAgMSxcbiAgICAgICAgTWF0aC5jZWlsKFxuICAgICAgICAgIHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoIC8gdGhpcy5wYWdpbmF0aW9uUGFnZVNpemUsXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgaWYgKHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCA+IG1heFBhZ2UpIHtcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4ID0gbWF4UGFnZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2FsY3VsYXRlTGluZU51bWJlcigpO1xuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY29sbGVjdERvbURhdGEoKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKiDlnKjmjIflrprooYzlkI7mlrnnmoTmj5LlhaXkuIvmoIfvvJvml6DooYzliJnov73liqDliLDmnKvlsL4gKi9cbiAgcHJpdmF0ZSBnZXRJbnNlcnRJbmRleEFmdGVyKGFmdGVyTGluZT86IEZvcm1Hcm91cCB8IG51bGwpOiBudW1iZXIge1xuICAgIGlmICghYWZ0ZXJMaW5lKSB7XG4gICAgICByZXR1cm4gdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5sZW5ndGg7XG4gICAgfVxuICAgIGNvbnN0IGlkeCA9IHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMuaW5kZXhPZihhZnRlckxpbmUpO1xuICAgIHJldHVybiBpZHggPj0gMCA/IGlkeCArIDEgOiB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aDtcbiAgfVxuXG4gIC8qKiDlhajlsYDooYzkuIvmoIfovazlvZPliY3pobXlhoXnmoTooYzkuIvmoIfvvIjkvpvogZrnhKbnlKjvvIkgKi9cbiAgcHJpdmF0ZSB0b1BhZ2VMb2NhbFJvd0luZGV4KGdsb2JhbEluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiAoXG4gICAgICBnbG9iYWxJbmRleCAtICh0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXggLSAxKSAqIHRoaXMucGFnaW5hdGlvblBhZ2VTaXplXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBwYWdlSW5kZXhDaGFuZ2UoZXZlbnQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCA9IGV2ZW50O1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jb2xsZWN0RG9tRGF0YSgpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcHVibGljIHBhZ2VTaXplQ2hhbmdlKGV2ZW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZSA9IGV2ZW50O1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jb2xsZWN0RG9tRGF0YSgpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkhkRm9ybVZhbHVlQ2hhbmdlZChkYXRhPzogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNGaWx0ZXJEYXRhKSB7XG4gICAgICBpZiAoZGF0YSAmJiBkYXRhLmxpbmVzICYmIHRoaXMuZmlsdGVySW5kZXhTdG9yZS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgY29uc3QgbGluZXMgPSBkYXRhLmxpbmVzO1xuICAgICAgICBpZiAobGluZXMubGVuZ3RoID09PSB0aGlzLmZpbHRlckluZGV4U3RvcmUubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5maWx0ZXJJbmRleFN0b3JlLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YVtpdGVtXSA9IHtcbiAgICAgICAgICAgICAgLi4udGhpcy5maWx0ZXJTdG9yZUZvcm1MaW5lc0RhdGFbaW5kZXhdLFxuICAgICAgICAgICAgICAuLi5saW5lc1tpbmRleF0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGxpbmVzLmxlbmd0aCA+IHRoaXMuZmlsdGVySW5kZXhTdG9yZS5sZW5ndGgpIHtcbiAgICAgICAgICAvLyDmnInmlrDlop7mlbDmja7nmoTmg4XlhrVcbiAgICAgICAgICAvLyBzdGVwIDE6IOWFiOaJvuaWsOWinueahGluZGV45LiL5qCHXG4gICAgICAgICAgY29uc3QgZ2V0Tm93TGluZXMgPSB0aGlzLnZhbGlkYXRlSGRGb3JtTGluZXMuZ2V0UmF3VmFsdWUoKS5saW5lcztcbiAgICAgICAgICBsZXQgYWRkSW5kZXggPSAtMTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdldE5vd0xpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZ2V0Tm93TGluZXNbaV0uaXNIZEZvcm1MaW5lU2VhcmNoQWRkKSB7XG4gICAgICAgICAgICAgIGFkZEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhZGRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhLnNwbGljZShcbiAgICAgICAgICAgICAgdGhpcy5maWx0ZXJJbmRleFN0b3JlW2FkZEluZGV4IC0gMV0gKyAxLFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICBnZXROb3dMaW5lc1thZGRJbmRleF0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmZpbHRlckluZGV4U3RvcmUucHVzaCh0aGlzLmZpbHRlckluZGV4U3RvcmVbYWRkSW5kZXggLSAxXSArIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIOacieWIoOmZpOaVsOaNrueahOaDheWGtVxuICAgICAgICAgIC8vIHN0ZXAgMTrlhYjmib7liLDliKDpmaTnmoRpbmRleOS4i+agh1xuICAgICAgICAgIGxldCBkZWxldGVkSW5kZXggPSAtMTtcbiAgICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICAgIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGRlbGV0ZWRJbmRleCA9IDA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgaWYgKGxpbmVzW2ldLmxpbmVJbmRleCAtIGNvdW50ID4gMSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZWRJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGRlbGV0ZWRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIC8vIHN0ZXAgMjog5Yig6Zmk5oC75pWw5o2u5Lit55qE5a+55bqU5pWw5o2uLCDmiorkuIvmoIfmlbDnu4TlkoxsaW5lc+mVv+W6puWvuem9kO+8jOWQjOaXtuaKiuS4i+agh+aVsOe7hOWcqGRlbGV0ZWRJbmRleOWQjumdoueahOWAvOWFqOmDvS0xXG4gICAgICAgICAgICB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YSA9IHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhLmZpbHRlcihcbiAgICAgICAgICAgICAgKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4ICE9PSB0aGlzLmZpbHRlckluZGV4U3RvcmVbZGVsZXRlZEluZGV4XTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmZpbHRlckluZGV4U3RvcmUuc3BsaWNlKGRlbGV0ZWRJbmRleCwgMSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZmlsdGVySW5kZXhTdG9yZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBpZiAoaSA+PSBkZWxldGVkSW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckluZGV4U3RvcmVbaV0tLTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBzdGVwIDI6IOayoeacieaJvuWIsGRlbGV0ZWRJbmRleOivtOaYjuWIoOmZpOaTjeS9nOWcqOacgOWQjuS4gOihjFxuICAgICAgICAgICAgY29uc3QgZmlsdGVySW5kZXggPVxuICAgICAgICAgICAgICB0aGlzLmZpbHRlckluZGV4U3RvcmVbdGhpcy5maWx0ZXJJbmRleFN0b3JlLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEgPSB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YS5maWx0ZXIoXG4gICAgICAgICAgICAgIChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbmRleCAhPT0gZmlsdGVySW5kZXg7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJJbmRleFN0b3JlLnBvcCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5saW5lcykge1xuICAgICAgICAgIHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhID0gZGF0YS5saW5lcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZGF0YSAmJiBkYXRhLmxpbmVzKSB7XG4gICAgICAgIHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhID0gZGF0YS5saW5lcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDmgLvooajljZVcbiAgICBpZiAoIXRoaXMuaXNGaWx0ZXJEYXRhKSB7XG4gICAgICB0aGlzLmZvcm1WYWxpZCA9IHRoaXMudmFsaWRhdGVIZEZvcm1MaW5lcy52YWxpZDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuZm9ybVZhbGlkKSB7XG4gICAgICAgIC8vIOWmguaenOaVtOS9k+ihqOWNleaYr3RydWXvvIzkuI3nrqHlrZDooajljZXmmK/ku4DkuYjvvIzpg73lj5jmiJDlrZDooajljZXnmoTnirbmgIFcbiAgICAgICAgdGhpcy5mb3JtVmFsaWQgPSB0aGlzLnZhbGlkYXRlSGRGb3JtTGluZXMudmFsaWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDlpoLmnpzmlbTkvZPooajljZXmmK9mYWxzZe+8mjHjgIHlrZDooajljZXkuLp0cnVl77yM6ZyA6KaB6YeN566X77ybMuOAgeWtkOihqOWNleS4umZhbHNl77yM55So5a2Q6KGo5Y2V54q25oCBXG4gICAgICAgIGlmICh0aGlzLnZhbGlkYXRlSGRGb3JtTGluZXMudmFsaWQpIHtcbiAgICAgICAgICB0aGlzLmZvcm1WYWxpZCA9IHRoaXMuaW5uZXJHZXRWYWxpZCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZm9ybVZhbGlkID0gdGhpcy52YWxpZGF0ZUhkRm9ybUxpbmVzLnZhbGlkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHRoaXMuY2FsY3VsYXRlTGluZU51bWJlcigpO1xuICAgIHRoaXMuY2hhbmdlRXZlbnQuZW1pdCh0aGlzLnZhbGlkYXRlSGRGb3JtTGluZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0xpc3QobGlzdDogQXJyYXk8Rm9ybUxpbmU+KTogYm9vbGVhbiB7XG4gICAgaWYgKCFsaXN0IHx8IChsaXN0ICYmIGxpc3QubGVuZ3RoID09PSAwKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgbmFtZUxpc3QgPSBbXTtcbiAgICBsZXQgc2VsZWN0T3B0aW9uQ2hlY2tMaXN0ID0gW107XG4gICAgbGlzdC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAvLyDmoKHpqozljZXpobnpgInmi6nlmahcbiAgICAgIC8vIGlmIChpdGVtLnR5cGUgPT09IEZvcm1MaW5lVHlwZS5TZWxlY3QgJiYgKCFpdGVtLnNlbGVjdExpc3QgfHwgKGl0ZW0uc2VsZWN0TGlzdCAmJiBpdGVtLnNlbGVjdExpc3QubGVuZ3RoID09PSAwKSkpIHtcbiAgICAgIC8vICAgdGhyb3cgJ2Zvcm1MaW5lc+e7hOS7tuaVsOaNruagvOW8j+S4jeinhOiMg++8jOWtmOWcqOWNlemhuemAieaLqeWZqOayoeacieS8oOWFpemAiemhuSEnXG4gICAgICAvLyB9XG4gICAgICBuYW1lTGlzdC5wdXNoKGl0ZW0ubmFtZSk7XG5cbiAgICAgIC8vIOagoemqjOaciW9uU2VhcmNo55qE5a2X5q6155qEc2VsZWN0T3B0aW9u55qEdmFsdWXjgIFsYWJlbOaYr+WQpuWcqGZvcm1MaW5l6YeM6Z2i6YO95a6a5LmJ5LqGXG4gICAgICBpZiAoaXRlbS5vblNlYXJjaEV2ZW50ICYmIGl0ZW0uc2VsZWN0T3B0aW9uKSB7XG4gICAgICAgIHNlbGVjdE9wdGlvbkNoZWNrTGlzdCA9IFtdO1xuICAgICAgICBsaXN0LmZvckVhY2goKGlubmVySXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGlubmVySXRlbS5uYW1lID09PSBpdGVtLnNlbGVjdE9wdGlvbi52YWx1ZSB8fFxuICAgICAgICAgICAgaW5uZXJJdGVtLm5hbWUgPT09IGl0ZW0uc2VsZWN0T3B0aW9uLmxhYmVsXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBzZWxlY3RPcHRpb25DaGVja0xpc3QucHVzaChpbm5lckl0ZW0ubmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHNlbGVjdE9wdGlvbkNoZWNrTGlzdC5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgdGhyb3cgYGZvcm1MaW5lc+e7hOS7tuaVsOaNruagvOW8j+S4jeinhOiMg++8jOWtl+autSR7aXRlbS5uYW1lfeeahHNlbGVjdE9wdGlvbueahHZhbHVl44CBbGFiZWzlrZfmrrXmnKrog73lnKhmb3JtTGluZXPkuK3mib7liLDlr7nlupTlrZfmrrXvvIFgO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8g5qCh6aqMbmFtZeaYr+WQpumHjeWkjVxuICAgIGlmIChbLi4ubmV3IFNldChuYW1lTGlzdCldLmxlbmd0aCAhPT0gbGlzdC5sZW5ndGgpIHtcbiAgICAgIHRocm93IFwiZm9ybUxpbmVz57uE5Lu25pWw5o2u5qC85byP5LiN6KeE6IyD77yM5a2Y5Zyo6YeN5aSNbmFtZeWAvCFcIjtcbiAgICB9XG4gICAgLy8gLi4ubW9yZSBjaGVja1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHN1Ym1pdEZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5jaGFuZ2VFdmVudC5lbWl0KHRoaXMudmFsaWRhdGVIZEZvcm1MaW5lcy5nZXRSYXdWYWx1ZSgpKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldEZvcm0oKTogdm9pZCB7XG4gICAgLy8g5Yig6ZmkXG4gICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgIGZvciAobGV0IGkgPSB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHRoaXMuZGVsZXRlRm9ybUxpbmUoaSk7XG4gICAgfVxuICAgIHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCA9IDE7XG4gIH1cblxuICBwdWJsaWMgaW5wdXRDbGVhbihmb3JtSXRlbTogYW55LCBsaW5lOiBhbnkpOiB2b2lkIHtcbiAgICBsaW5lLmdldChmb3JtSXRlbS5uYW1lKS5zZXRWYWx1ZShudWxsKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RWYWx1ZShpZDogc3RyaW5nLCByb3dOdW1iZXI6IG51bWJlciwgY29sTnVtYmVyOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dERvbTogYW55ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihpZCk7XG4gICAgaW5wdXREb20uc2VsZWN0KCk7XG4gICAgdGhpcy5zZXRBY3RpdmVEb21JbkZvcm1MaW5lcyhyb3dOdW1iZXIsIGNvbE51bWJlcik7XG4gIH1cblxuICBwcml2YXRlIHRleHRXaWR0aENhY2hlOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG5cbiAgaXNUZXh0T3ZlcmZsb3codGV4dDogc3RyaW5nLCBtYXhXaWR0aDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2FjaGVkV2lkdGggPSB0aGlzLnRleHRXaWR0aENhY2hlW3RleHRdO1xuICAgIGlmIChjYWNoZWRXaWR0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkV2lkdGggKyAxNSA+PSBtYXhXaWR0aDtcbiAgICB9XG5cbiAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgc3Bhbi5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgICBzcGFuLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgIHNwYW4uc3R5bGUud2hpdGVTcGFjZSA9IFwibm93cmFwXCI7XG4gICAgc3Bhbi5zdHlsZS5mb250U2l6ZSA9IFwiMTRweFwiO1xuICAgIHNwYW4uc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7IC8vIOWwhuagt+W8j+S/ruaUueS4uiBpbmxpbmUtYmxvY2tcbiAgICBzcGFuLmlubmVyVGV4dCA9IHRleHQ7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzcGFuKTtcbiAgICBjb25zdCBpc092ZXJmbG93ID0gc3Bhbi5vZmZzZXRXaWR0aCArIDE1ID49IG1heFdpZHRoO1xuICAgIHRoaXMudGV4dFdpZHRoQ2FjaGVbdGV4dF0gPSBzcGFuLm9mZnNldFdpZHRoO1xuICAgIHNwYW4uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc3Bhbik7XG4gICAgcmV0dXJuIGlzT3ZlcmZsb3c7XG4gIH1cblxuICBqdWRnZUNvbEVtcHR5KHN0cjogYW55KSB7XG4gICAgaWYgKHN0ciB8fCBzdHIgPT09IDApIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcIjznqbo+XCI7XG4gICAgfVxuICB9XG5cbiAganVkZ2VWYWx1ZUlzTm90RW1wdHkoc3RyOiBhbnkpIHtcbiAgICBpZiAoc3RyID09PSBudWxsICYmIHN0ciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxufVxuIl19