\n `\n})\n\nexport class AppComponent implements OnInit {\n\tisUserToggled: boolean;\n\tisSidebarToggled: boolean;\n\ttoday: number;\n\tacctNumber: string;\n\tmsg: Alert;\n\thasAccess: boolean;\n\tappReloadMaxIdle: number;\n\tappReloadForceTimeout: number;\n\tcurrentAppVersion: string;\n\tappVersionTitle: string;\n\tbreadcrumbs: Breadcrumb[];\n\tuserGreeting: string;\n\tdashboardTitle: string;\n\taccLink: string;\n\tschoolsName: string;\n\tinterval: any;\n\tdaysWarningAboutToExpire = 30;\n\tisUsrNull: boolean;\n\n\tconstructor(\n\t\tpublic title: AppTitle,\n\t\tprivate account: Account,\n\t\tprivate config: Config,\n\t\tprivate dvc: DistrictService,\n\t\tprivate router: Router,\n\t\tangulartics2GoogleAnalytics: Angulartics2GoogleAnalytics,\n\t\tprivate app: AppService,\n\t\tprivate cdref: ChangeDetectorRef,\n\t) {\n\t\tthis.msg = new Alert();\n\t\tthis.isUserToggled = false;\n\t\tthis.isSidebarToggled = true;\n\t\tthis.today = Date.now();\n\t\tthis.clickedOutside = this.clickedOutside.bind(this);\n\t\tthis.hasAccess = true;\n\t\tthis.currentAppVersion = environment.version;\n\t\tthis.appReloadMaxIdle = (60 * 5); // 5 min\n\t\tthis.appReloadForceTimeout = (1000 * 60 * 60 * 12); // 12 hours\n\t\tthis.appVersionTitle = `App Version: ${this.currentAppVersion}`;\n\t\tthis.breadcrumbs = [];\n\t\tthis.userGreeting = '';\n\t\tthis.dashboardTitle = '';\n\t\tthis.accLink = '';\n\t\tthis.schoolsName = '';\n\t\tangulartics2GoogleAnalytics.startTracking();\n\t\tthis.isUsrNull = true;\n\t}\n\n\tngOnInit() {\n\t\tif (window.innerWidth < 992) {\n\t\t\tthis.isSidebarToggled = false;\n\t\t}\n\t\tthis.title.titleEvent.subscribe(() => {\n\t\t\tthis.dashboardTitle = this.getDashboardTitle();\n\t\t\tthis.breadcrumbs = this.getBreadcrumbs();\n\t\t});\n\n\t\tthis.app.onLoadApp.subscribe((args) => {\n\t\t\tconsole.log('re-loading');\n\t\t\tthis.load();\n\t\t});\n\n\t\tthis.load();\n\t}\n\n\tload() {\n\n\t\tif (validateToken()) {\n\t\t\t// check existing user roles before loading default one\n\t\t\tlet ur = this.dvc.userRoles();\n\t\t\tif (ur == null) {\n\t\t\t\tthis.msg.error('There is an error when loading user\\'s roles, please try refreshing this page.');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.acctNumber = ur.acctNumber;\n\t\t\tthis.userGreeting = this.getUserGreetings();\n\n\t\t\t// remove interval if any\n\t\t\tif (this.interval) {\n\t\t\t\tclearInterval(this.interval);\n\t\t\t}\n\n\t\t\t// validate token every 10 sec\n\t\t\tthis.interval = setInterval(() => {\n\t\t\t\tif (!this.tokenValidation()) {\n\t\t\t\t\tclearInterval(this.interval);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}, 10000);\n\t\t\tthis.isUsrNull = false;\n\n\t\t\tthis.dvc.subscriptionApi(this.acctNumber).subscribe((urs: SubscriptionResponse) => {\n\t\t\t\tlet remainder = elapsedDaysHoursMinutes(new Date(), urs.accountlicense.expirationDateValue);\n\t\t\t\tif (remainder.days < 0) {\n\t\t\t\t\tthis.msg.warning(`Your license has expired. Please go to subscription page for more details.`);\n\t\t\t\t\tif (urs.accountlicense.code ==='invalid account license'){\n\t\t\t\t\t\tthis.msg.error(this.dvc.getUserError(Error(urs.accountlicense.code)))\n\t\t\t\t\t}\n\t\t\t\t} else if (remainder.days <= this.daysWarningAboutToExpire) {\n\t\t\t\t\tthis.msg.warning(`Your license is about te expire in ${remainder.days} days. Please go to subscription page for more details.`);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tconsole.log(err);\n\t\t\t\tif (this.dvc.isErrNotFound(err)) {\n\t\t\t\t\tthis.msg.warning(this.dvc.getUserError(err));\n\t\t\t\t} else {\n\t\t\t\t\tif (this.dvc.isErrUnauthorized(err)) {\n\t\t\t\t\t\tthis.hasAccess = false;\n\t\t\t\t\t}\n\t\t\t\t\tthis.msg.error(this.dvc.getUserErrorDefault(err));\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tchangeRoute() {\n\t\tthis.schoolsName = this.schoolName();\n\t\tthis.accLink = this.accountLink();\n\t}\n\n\ttokenValidation(): boolean {\n\t\tlet t = this.dvc.getToken();\n\t\t// no need to display user message about token expiration in case of refreshToken being present\n\t\tif (t.refreshToken && t.refreshToken != '') {\n\t\t\treturn true;\n\t\t}\n\t\tif (!validateToken()) {\n\t\t\tvar c = 10;\n\t\t\t// current url is passed to login component for auth.ts to catch and send within redirect_uri for returning the user to the current page after login\n\t\t\tvar url = encodeURIComponent(this.router.url);\n\t\t\tvar interval = setInterval(() => {\n\t\t\t\tthis.msg.warningHtml(`This session has expired, please wait while redirecting you to login page in ${c}.`);\n\t\t\t\tc--;\n\t\t\t\tif (c < 0) {\n\t\t\t\t\tclearInterval(interval);\n\t\t\t\t\tthis.router.navigate(['/login', { queryParams: { 'gotopage': url } }])\n\t\t\t\t}\n\t\t\t}, 1000);\n\t\t\treturn false;\n\t\t}\n\t\treturn true\n\t}\n\n\tclickedOutside() {\n\t\tthis.isUserToggled = false;\n\t}\n\n\ttoggleSidebar() {\n\t\tthis.isSidebarToggled = !this.isSidebarToggled;\n\t}\n\n\ttoggleUser() {\n\t\tthis.isUserToggled = !this.isUserToggled;\n\t}\n\n\tgetUserGreetings() {\n\t\tlet user = this.account.getUser();\n\t\tif (user == null) {\n\t\t\treturn \"Hi\";\n\t\t}\n\t\tif (!user.firstName){\n\t\t\treturn 'Hi ' + user.username;\n\t\t}\n\t\treturn 'Hi ' + user.firstName;\n\t}\n\n\tgetDashboardTitle() {\n\t\treturn this.title.getDashboardTitle();\n\t}\n\n\tgetDashboardNav() {\n\t\treturn this.title.getDashboardNav();\n\t}\n\n\tgetBreadcrumbs() {\n\t\treturn this.title.getBreadcrumbsPrint();\n\t}\n\n\taccountLink() {\n\t\treturn this.config.authAppUrl + '/dashboard/profile'\n\t}\n\n\tlogout() {\n\t\tthis.account.removeLocalStorage();\n\t\tthis.dvc.removeLocalStorage();\n\t\tthis.account.logout();\n\t}\n\n\tschoolName() {\n\t\tlet s = this.dvc.userRoles();\n\t\tif (s != null) {\n\t\t\treturn s.schoolName;\n\t\t}\n\t\treturn 'NA';\n\t}\n\n\tshowMenu() {\n\t\tif (this.account.getUser() != null && this.dvc.userRoles() != null) {\n\t\t\tthis.acctNumber = this.dvc.userRoles().acctNumber;\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tappReload(version: string) {\n\t\tif (this.currentAppVersion != version) {\n\t\t\tconsole.log('version:', version);\n\t\t\twindow.location.reload(true);\n\t\t}\n\t}\n\n\tngAfterContentChecked() {\n\t\tthis.cdref.detectChanges();\n\t}\n\n}\n","import { BrowserModule } from '@angular/platform-browser';\nimport { NgModule, Injector } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { Http, HttpModule } from '@angular/http';\nimport { LocationStrategy, HashLocationStrategy } from '@angular/common';\nimport { Config, loadConfig } from './config';\nimport { routing } from \"./app.routing\";\nimport { AppComponent } from './app.component';\nimport { DashboardComponent } from './dashboard.component';\nimport { FooterComponent } from './footer.component';\nimport { LoginComponent } from './login.component';\nimport { UserManagementComponent } from './user_management.component';\nimport { SchoolAccessComponent } from './school_access.component';\nimport { SubscriptionComponent } from './subscription.component';\nimport { AppTitle } from './title';\nimport { AlertDirective } from './alert.directive';\nimport { OffClickDirective } from \"./off_click.directive\";\nimport { Account, accountServiceFactory } from './account.service';\nimport { DistrictService, districtServiceFactory } from './district.service';\nimport { Auth } from './auth';\nimport { Angulartics2Module } from 'angulartics2';\nimport { CatchAllComponent } from './catchall.component';\nimport { TruncatePipe } from './truncate.pipe';\nimport { AppToggleComponent } from './app_toggle.component';\nimport { FileUploadModule } from 'ng2-file-upload';\nimport { AppImportComponent } from \"./app_import.component\";\nimport { AlertYesNoDirective } from './alert-yesno.directive';\nimport { HttpService, getHttpService } from './http.service';\nimport { RequestOptions, XHRBackend } from \"@angular/http\";\nimport { AppReloadDirective } from './app-reload/app-reload.directive';\nimport { AppService } from './app.service';\nimport { AssociationComponent } from './settings/association.component';\nimport { SettingsComponent } from './settings/settings.component';\nimport { NoGoEnhanceListComponent } from './settings/nogo-enhance-list.component';\nimport { NoGoEnhanceComponent } from './settings/nogo-enhance.component';\nimport { NoGoEnhanceImportComponent } from './settings/nogo-enhance-import.component';\nimport { NoGoEnhanceExportComponent } from './settings/nogo-enhance-export.component';\nimport { NoGoEnhanceFilesComponent } from './settings/nogo-enhance-files.component';\nimport { RfidUsersListComponent } from './settings/rfid_users_list.component';\nimport { RfidUsersComponent } from './settings/rfid_users.component';\nimport { RfidUsersImportComponent } from './settings/rfid_users_import.component';\nimport { RfidUsersExportComponent } from './settings/rfid_users_export.component';\nimport { PreloadedListComponent } from './settings/preloaded_list.component';\nimport { PreloadedComponent } from './settings/preloaded.component';\nimport { PreloadedImportComponent } from './settings/preloaded_import.component';\nimport { PreloadedCategoryListComponent } from './settings/preloaded_category_list.component';\nimport { PreloadedCategoryImportComponent } from './settings/preloaded_category_import.component';\nimport { PreloadedExportComponent } from \"./settings/preloaded_export.component\";\nimport { PreloadedCategoryExportComponent } from \"./settings/preloaded_category_export.component\";\nimport { SchoolGroupListComponent } from \"./settings/school_group_list.component\";\nimport { SchoolGroupComponent } from \"./settings/school_group.component\";\nimport {BadgeListComponent} from \"./settings/badge_list.component\";\nimport { BadgeComponent } from './settings/badge.component';\nimport { ReportsComponent } from './reports.component';\nimport { ActivityReportComponent } from './reports/activity_report.component';\nimport {ActivityReportCardViewComponent} from './reports/activity_report_card_view.component';\nimport {ActivityReportTableViewComponent} from './reports/activity_report_table_view.component';\nimport { ActivityReportFilterViewComponent } from './reports/activity_report_filter.component';\n\n@NgModule({\n\tdeclarations: [\n\t\tAppComponent,\n\t\tDashboardComponent,\n\t\tFooterComponent,\n\t\tLoginComponent,\n\t\tUserManagementComponent,\n\t\tSchoolAccessComponent,\n\t\tSubscriptionComponent,\n\t\tAlertDirective,\n\t\tOffClickDirective,\n\t\tCatchAllComponent,\n\t\tTruncatePipe,\n\t\tAppToggleComponent,\n\t\tAppImportComponent,\n\t\tAlertYesNoDirective,\n\t\tAppReloadDirective,\n\t\tAssociationComponent,\n\t\tSettingsComponent,\n\t\tNoGoEnhanceComponent,\n\t\tNoGoEnhanceListComponent,\n\t\tNoGoEnhanceImportComponent,\n\t\tNoGoEnhanceExportComponent,\n\t\tNoGoEnhanceFilesComponent,\n\t\tRfidUsersListComponent,\n\t\tRfidUsersComponent,\n\t\tRfidUsersImportComponent,\n\t\tRfidUsersExportComponent,\n\t\tPreloadedListComponent,\n\t\tPreloadedComponent,\n\t\tPreloadedImportComponent,\n\t\tPreloadedExportComponent,\n\t\tPreloadedCategoryListComponent,\n\t\tPreloadedCategoryImportComponent,\n\t\tPreloadedCategoryExportComponent,\n\t\tSchoolGroupListComponent,\n\t\tSchoolGroupComponent,\n\t\tBadgeListComponent,\n\t\tBadgeComponent,\n\t\tReportsComponent,\n\t\tActivityReportComponent,\n\t\tActivityReportCardViewComponent,\n\t\tActivityReportTableViewComponent,\n\t\tActivityReportFilterViewComponent,\n\t],\n\timports: [\n\t\tBrowserModule,\n\t\tFormsModule,\n\t\tHttpModule,\n\t\trouting,\n\t\tReactiveFormsModule,\n\t\tAngulartics2Module.forRoot(),\n\t\tFileUploadModule\n\t],\n\tproviders: [\n\t\tAppTitle,\n\t\t{ provide: LocationStrategy, useClass: HashLocationStrategy },\n\t\t{ provide: Account, useFactory: accountServiceFactory, deps: [Config, Http] },\n\t\t{ provide: DistrictService, useFactory: districtServiceFactory, deps: [HttpService, Account, Config] },\n\t\t{ provide: Config, useFactory: loadConfig },\n\t\t{ provide: HttpService, useFactory: getHttpService, deps: [XHRBackend, RequestOptions, Injector] },\n\t\tAuth,\n\t\tAppService,\n\t],\n\tbootstrap: [AppComponent]\n})\n\nexport class AppModule { }\n","import { EventEmitter, Injectable } from '@angular/core';\n\n\n\n@Injectable()\nexport class AppService {\n\t// use this service when you need to re-render app component\n\t// example if menu displays something from settigns or any other service you need to fire this event from that component\n\t// for more take a look at the source code of station-setup/new-station\n\t// pass arguments or commands\n\tonLoadApp: EventEmitter = new EventEmitter();\n\n}\n","/// \nimport { FormControl, Validators, FormGroup ,ValidatorFn} from '@angular/forms';\n\nexport class AppValidators {\n\n\n\tstatic email(c: FormControl): { [key: string]: boolean } {\n\t\tif (Helper.isPresent(Validators.required(c))) return null;\n\t\tif (!AppValidators.isEmail(c.value)) {\n\t\t\treturn { invalidEmail: true }\n\t\t}\n\t}\n\n\tstatic date(c: FormControl): { [key: string]: boolean } {\n\t\tif (Helper.isPresent(Validators.required(c))) return null;\n\t\tif (!AppValidators.isDate(c.value)) {\n\t\t\treturn { invalidDate: true }\n\t\t}\n\t}\n\n\tstatic number(c: FormControl): { [key: string]: boolean } {\n\t\tif (Helper.isPresent(Validators.required(c))) return null;\n\t\tif (!AppValidators.isNumber(c.value)) {\n\t\t\treturn { invalidNumber: true }\n\t\t}\n\t}\n\n\tstatic isEmail(email: string) {\n\t\tvar emailRegex = /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;\n\t\treturn email.toLowerCase().match(emailRegex)\n\t}\n\n\tstatic isDate(date: string) {\n\t\tvar dateRegex = /^(?:(0[1-9]|1[012])[\\/.](0[1-9]|[12][0-9]|3[01])[\\/.](19|20)[0-9]{2})$/;\n\t\treturn date.match(dateRegex)\n\t}\n\n\tstatic isNumber(intStr: string) {\n\t\tvar intRegex = /^0$|^-?[1-9]\\d*(\\.\\d+)?$/;\n\t\treturn intStr.match(intRegex)\n\t}\n}\n\nclass Helper {\n\tstatic isPresent(obj: any): boolean {\n\t\treturn obj != null;\n }\n}\n\nexport function controlErrors(f: FormGroup, callback: any) {\n\tvar c: any;\n\tvar name: any;\n\tObject.keys(f.controls).forEach(name => {\n\t\tc = f.controls[name];\n\t\tif (!c.valid) {\n\t\t\tif (c.hasError('invalidEmail')) {\n\t\t\t\tcallback(c, name + ' has invalid email address.');\n\t\t\t} else if (c.hasError('required')) {\n\t\t\t\tcallback(c, name + ' is required.');\n\t\t\t} else if (c.hasError('minlength')) {\n\t\t\t\tlet v = c.errors['minlength'].requiredLength;\n\t\t\t\tcallback(c, `${name} min length is ${v}.`);\n\t\t\t} else if (c.hasError('invalidNumber')) {\n\t\t\t\tcallback(c, name + ' has invalid number, must be numeric (ex. -23, 23 or 23.10)');\n\t\t\t} else if (c.hasError('invalidDate')) {\n\t\t\t\tcallback(c, name + ' has invalid date, must be on format of MM/DD/YYYY (ex. 02/12/2016).');\n\t\t\t} else if (c.hasError('maxlength')) {\n\t\t\t\tlet v = c.errors['maxlength'].requiredLength;\n\t\t\t\tcallback(c, `${name} max length is ${v}.`);\n\t\t\t} else if (c.hasError('max')){\n\t\t\t\tlet v = c.errors['max']\n\t\t\t\tcallback(c, `${name} invalid number, max value is ${v.max}.`)\n\t\t\t} else if (c.hasError('min')){\n\t\t\t\tlet v = c.errors['min']\n\t\t\t\tcallback(c, `${name} invalid number, min value is ${v.min}.`)\n\t\t\t}\n\t\t}\n\t});\n}\n","import { Injectable } from '@angular/core';\nimport { Account, validateToken } from './account.service';\nimport {\n\tCanActivate, Router,\n\tActivatedRouteSnapshot,\n\tRouterStateSnapshot,\n\tCanActivateChild\n} from '@angular/router';\nimport { OAuthResponse } from './oauth_response';\nimport { Config } from './config';\nimport { DistrictService } from './district.service';\nimport { OAuthTokenRequest } from './oauth-token-request';\nimport { Observable } from 'rxjs';\n\nimport { TokenHelper } from './token_helper';\n\n\n@Injectable()\nexport class Auth implements CanActivate {\n\tpublic ar: OAuthResponse;\n\tconstructor(private router: Router, private account: Account, private config: Config, private district: DistrictService) { }\n\tcanActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable {\n\t\tlet path: string = window.location.href;\n\t\tif (path.indexOf(\"#access_token=\") === -1) {\n\t\t\tif (validateToken()) {\n\t\t\t\treturn Observable.of(true);\n\t\t\t}\n\t\t\tconsole.log('token invalid, redirecting to login page.');\n\n\t\t\tlet redirectLogin = () => {\n\n\t\t\t\tif (path.indexOf(\"#\") != -1) {\n\t\t\t\t\tlet baseUrl = path.substring(0, path.indexOf(\"#\"));\n\t\t\t\t\tlet gotopage = path.substr(path.indexOf(\"#\") + 1);\n\t\t\t\t\t// there are cases where gotopage query param is set on url\n\t\t\t\t\t// in this case we need to take that value else take the default url\n\t\t\t\t\tif (path.indexOf('gotopage=') != -1) {\n\t\t\t\t\t\tlet fg = this.parseQueryString(path.substr(path.indexOf('?') + 1));\n\t\t\t\t\t\tgotopage = fg['gotopage'];\n\t\t\t\t\t}\n\t\t\t\t\tgotopage = encodeURIComponent(gotopage);\n\t\t\t\t\twindow.location.href = this.config.loginUrl() + `?navigateUri=${gotopage}`;\n\t\t\t\t} else {\n\t\t\t\t\twindow.location.href = this.config.loginUrl();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet t = this.account.getToken();\n\t\t\t// if refresh token is empty, ask user to re-login\n\t\t\t// refresh_token will be provided only when user has checked to stay signin\n\n\t\t\tif (!t || !t.refreshToken) {\n\t\t\t\tconsole.log('no refresh token');\n\t\t\t\tredirectLogin();\n\t\t\t\treturn Observable.of(false);\n\t\t\t}\n\n\t\t\t// try to get new token based on refresh token\n\t\t\t//\n\t\t\tlet oauthreq = new OAuthTokenRequest();\n\t\t\toauthreq.refreshToken = t.refreshToken;\n\t\t\treturn this.district.oauthTokenApi(oauthreq)\n\t\t\t\t.map(data => {\n\n\t\t\t\t\tlet th = new TokenHelper();\n\t\t\t\t\tt.accessToken = data.accessToken;\n\t\t\t\t\tt.refreshToken = data.refreshToken;\n\t\t\t\t\tt.tokenType = data.tokenType;\n\t\t\t\t\tt.expiresIn = data.expiresIn;\n\t\t\t\t\tt.expiresAt = th.getExpiresAt(data.expiresIn);\n\n\t\t\t\t\tthis.account.setToken(t);\n\t\t\t\t\treturn true;\n\t\t\t\t})\n\t\t\t\t.catch(err => {\n\t\t\t\t\tconsole.log(err)\n\t\t\t\t\tredirectLogin();\n\t\t\t\t\treturn Observable.of(false)\n\t\t\t\t});\n\n\t\t} else {\n\t\t\tlet fg = this.getFragment();\n\t\t\tthis.setToken(fg);\n\t\t\t// gotopage param is to navigate the user to specific page after it is login\n\t\t\tlet gotopage = fg['gotopage'];\n\t\t\tif (gotopage) {\n\t\t\t\t//gotopage = decodeURIComponent(gotopage);\n\t\t\t\tthis.config.saveGoToPage(gotopage);\n\t\t\t}\n\t\t\twindow.location.href = '/#/login';\n\t\t\t//this will stop angular accessing wrong page like #/access_token and insted of that it will change the url to /#/login\n\t\t\treturn Observable.of(false);\n\t\t}\n\t}\n\n\tcanActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable {\n\t\treturn this.canActivate(route, state);\n\t}\n\n\tsetToken(queryParam: any) {\n\t\tthis.ar = new OAuthResponse();\n\t\tthis.ar.accessToken = queryParam['access_token'];\n\t\tthis.ar.tokenType = queryParam['token_type'];\n\t\tthis.ar.state = queryParam['state'];\n\t\tthis.ar.scope = queryParam['scope'];\n\t\tthis.ar.expiresIn = parseInt(queryParam['expires_in']);\n\t\tif (queryParam['refresh_token']) {\n\t\t\tthis.ar.refreshToken = queryParam['refresh_token'];\n\t\t}\n\t\tthis.account.oauthLogin(this.ar);\n\t}\n\n\tgetFragment() {\n\t\tif (window.location.hash.indexOf(\"#\") === 0) {\n\t\t\treturn this.parseQueryString(window.location.hash.substr(1));\n\t\t} else {\n\t\t\treturn {};\n\t\t}\n\t};\n\n\tparseQueryString(queryString) {\n\t\tvar data = {}, pairs, pair, separatorIndex, escapedKey, escapedValue, key, value;\n\n\t\tif (queryString === null) {\n\t\t\treturn data;\n\t\t}\n\n\t\tpairs = queryString.split(\"&\");\n\n\t\tfor (var i = 0; i < pairs.length; i++) {\n\t\t\tpair = pairs[i];\n\t\t\tseparatorIndex = pair.indexOf(\"=\");\n\n\t\t\tif (separatorIndex === -1) {\n\t\t\t\tescapedKey = pair;\n\t\t\t\tescapedValue = null;\n\t\t\t} else {\n\t\t\t\tescapedKey = pair.substr(0, separatorIndex);\n\t\t\t\tescapedValue = pair.substr(separatorIndex + 1);\n\t\t\t}\n\n\t\t\tkey = decodeURIComponent(escapedKey);\n\t\t\tvalue = decodeURIComponent(escapedValue);\n\n\t\t\tif (key.substr(0, 1) === '/')\n\t\t\t\tkey = key.substr(1);\n\n\t\t\tdata[key] = value;\n\t\t}\n\n\t\treturn data;\n\t};\n}\n","
\n \n
","import { Component } from '@angular/core';\nimport { NavigationCancel, ActivatedRoute, Router, Routes, RouterOutlet, RouterModule } from '@angular/router';\nimport { AppTitle } from './title';\nimport { Alert } from './alert';\n\n@Component({\n selector: 'catchall',\n template:\n `
\n \n
`\n})\n\nexport class CatchAllComponent {\n public msg: Alert;\n\n constructor(private router: Router, private title: AppTitle) {\n this.msg = new Alert();\n title.setTitles({ title: 'Page not found', dashboard: 'Page not found', dashboardNav: '' });\n this.msg.error(`Page '${router.url}' could not be found, please use the menu for navigation or re-login.`);\n }\n}\n","import { environment } from '../environments/environment';\n\nexport class Config {\n\tauthApiUrl: string;\n\tauthAppUrl: string;\n\tdistrictApiUrl: string;\n\tpowerschoolAppUrl: string;\n\toneRosterAppUrl: string;\n\tclientId: string;\n\tresponseType: string;\n\tscope: string;\n\tstate: string;\n\ttokenName: string;\n\tconfig: any;\n\tidentityAppUrl: string;\n\n\tgotopageKey: string;\n\tconstructor(config?: any) {\n\t\tthis.config = config || {};\n\t\tthis.authApiUrl = this.config.authApiUrl || 'http://localhost:4000';\n\t\tthis.authAppUrl = this.config.authAppUrl || 'http://localhost:14000/#';\n\t\tthis.districtApiUrl = this.config.districtApiUrl || 'http://localhost:4001';\n\t\tthis.powerschoolAppUrl = this.config.powerschoolAppUrl || 'http://localhost:14200/#';\n\t\tthis.identityAppUrl = this.config.identityAppUrl || 'http://localhost:14200';\n\t\tthis.oneRosterAppUrl = this.config.oneRosterAppUrl || 'http://localhost:14010/#';\n\t\tthis.tokenName = this.config.tokenName || 'token';\n\t\tthis.clientId = this.config.clientId || 'ea2849e2-8e8c-487b-81e2-dd8bfb14e22e';\n\t\tthis.responseType = this.config.responseType || 'token';\n\t\tthis.scope = this.config.scope || 'all';\n\t\tthis.state = this.config.state || '/dashboard';\n\t\tthis.gotopageKey = 'gotopage';\n\t}\n\n\tloginUrl() {\n\t\treturn this.districtApiUrl + '/oauth2/login';\n\t}\n\n\tlogoutUrl() {\n\t\treturn this.districtApiUrl + '/oauth2/logout';\n\t}\n\n\tsaveGoToPage(path: string) {\n\t\tlocalStorage.setItem(this.gotopageKey, path);\n\t}\n\n\tgoToPage(): string {\n\t\treturn localStorage.getItem(this.gotopageKey);\n\t}\n\n\tremoveLocalStorage() {\n\t\tlocalStorage.removeItem(this.gotopageKey);\n\t}\n}\n\nexport function loadConfig(): Config {\n\tconst w = window || {}\n\t// check if config is loaded from config.js file, if not then load directly from environment\n\tif (w['__config']) {\n\t\tconst c = w['__config'] || {};\n\t\treturn new Config(c);\n\t}\n\n\treturn new Config({\n\t\tclientId: environment.clientId,\n\t\tauthApiUrl: environment.authApiUrl,\n\t\tauthAppUrl: environment.authAppUrl,\n\t\tdistrictApiUrl: environment.districtApiUrl,\n\t\tpowerschoolAppUrl: environment.powerschoolAppUrl,\n\t\toneRosterAppUrl: environment.oneRosterAppUrl,\n\t\tidentityAppUrl: environment.identityAppUrl,\n\t});\n}\n","\n\t
\n\t\t\n\t
dashboard
\n\t
\n ","/// \nimport { Component, OnDestroy } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { AppTitle } from './title';\nimport { Account } from './account.service';\nimport { Config } from './config';\nimport { DistrictService } from './district.service';\nimport { Alert } from './alert';\nimport { Subscription } from 'rxjs';\n\n@Component({\n selector: 'dashboard',\n template: `\n\t
\n\t\t\n\t
dashboard
\n\t
\n `\n})\n\nexport class DashboardComponent implements OnDestroy {\n private subscription: Subscription;\n msg: Alert;\n acctNumber: string;\n\n constructor(private router: Router, private title: AppTitle, private account: Account, private activatedRoute: ActivatedRoute, private config: Config, private dvc: DistrictService) {\n this.msg = new Alert();\n title.setTitles({ title: 'Dashboard', dashboard: 'Dashboard', dashboardNav: 'Home' });\n\n this.subscription = activatedRoute.params.subscribe(\n (params) => this.acctNumber = params['acctNumber']\n )\n\n if (this.acctNumber != null) {\n dvc.validateAcctNumber(this.acctNumber)\n .subscribe(res => {\n }, err => {\n console.log(err);\n this.msg.error('There is an error when processing this request, please try again.');\n });\n }\n }\n\n ngOnDestroy() {\n this.subscription.unsubscribe();\n }\n}\n","//Parse date string as it is into Date object\n//This is used when date string has no timestamp even if there is Z (UTC) the actual date is without timestamp\nexport function rfc3339ToDate(strDate: any): Date {\n\tif (!strDate || strDate === '') {\n\t\treturn null;\n\t}\n\tif (typeof (strDate) !== 'string') {\n\t\treturn strDate;\n\t}\n\n\tlet dtstr = strDate.replace(/\\D/g, \" \");\n\tlet dtcomps = dtstr.split(\" \");\n\treturn new Date(\n\t\tparseInt(dtcomps[0]),\n\t\tparseInt(dtcomps[1]) - 1,\n\t\tparseInt(dtcomps[2]),\n\t\tparseInt(dtcomps[3]),\n\t\tparseInt(dtcomps[4]),\n\t\tparseInt(dtcomps[5]));\n}\n\nexport function slashDateToDate(d: string): Date {\n\tif (d && d.indexOf('/') != -1) {\n\t\tlet dp: string[] = d.split('/');\n\t\treturn new Date(parseInt(dp[2]), (parseInt(dp[0]) - 1), parseInt(dp[1]));\n\t}\n\treturn new Date(1, 1, 1);\n}\n\nexport function dateFormat(dt: Date, format: string): string {\n\tlet day = (\"0\" + dt.getDate()).slice(-2);\n\tlet month = (\"0\" + (dt.getMonth() + 1)).slice(-2);\n\tlet year = dt.getFullYear().toString();\n\tlet h = dt.getHours();\n\tlet ampm = (h % 12 || 12)\n\t\t+ ':' + (\"0\" + dt.getMinutes()).slice(-2)\n\t\t+ ' ' + (h < 12 ? 'A' : 'P') + 'M';\n\n\tswitch (format) {\n\t\tcase '01-02-2006 03:04 PM':\n\t\t\treturn `${month}-${day}-${year} ${ampm}`;\n\t\tcase '01/02/2006 03:04 PM':\n\t\t\treturn `${month}/${day}/${year} ${ampm}`;\n\t\tcase '01/02/2006':\n\t\t\treturn `${month}/${day}/${year}`;\n\n\t\tdefault:\n\t\t\treturn dt.toString();\n\t}\n}\n\nexport function isDateSet(d: Date): boolean {\n\tif (d && typeof (d) === \"object\" && d.getFullYear() > 1901) {\n\t\treturn true;\n\t}\n\treturn false;\n}\n","import { Injectable, Injector } from '@angular/core';\nimport { Account } from './account.service';\nimport { Config } from './config';\nimport { Observable, Observer } from 'rxjs';\nimport { UserRoles } from './user_roles';\nimport { DistrictUser } from './district_user';\nimport { InviteUser } from './invite_district_user';\nimport * as subscription from './subscription';\n\nimport { SubscriptionRegistrationURL } from './subscription_registration_url';\nimport { HttpService } from './http.service';\nimport { OAuthToken } from './oauth-token';\nimport { OAuthTokenRequest } from './oauth-token-request';\nimport { AssociateAccount } from './settings/account_association';\n\nimport { NoGoEnhance } from './settings/nogo-enhance';\nimport { NoGoEnhanceTextSearch } from './settings/nogo-enhance-text-search';\nimport { NoGoEnhanceRequest } from './settings/nogo-enhance-request';\nimport { NoGoEnhanceReply } from './settings/nogo-enhance-reply';\nimport { NoGoEnhanceExportCSVReply } from './settings/nogo-enhance-export-csv-reply';\nimport { NoGoEnhanceCount } from './settings/nogo-enhance-count';\nimport { NoGoEnhanceFind } from './settings/nogo-enhance-find';\nimport { NoGoEnhanceExportCSV } from './settings/nogo-enhance-export-csv';\nimport { NoGoEnhanceFileReply } from './settings/nogo-enhance-file-reply';\nimport { NoGoEnhanceWorkerStatus } from \"./settings/nogo-enhance-worker-status-request\";\nimport { NoGoEnhanceWorkerStatusReply } from \"./settings/nogo-enhance-worker-status\";\n\nimport { RfidUsersExportCSVReply } from './settings/rfid_users_export_csv_reply';\nimport { RfidUsersExport } from './settings/rfid_users_export'\nimport { RfidUsersReply } from './settings/rfid_users_reply'\nimport { RfidUsers } from './settings/rfid_users';\nimport { RfidUsersTextSearch } from './settings/rfid_users_text_search';\nimport { RfidUsersCount } from './settings/rfid_users_count';\nimport { RfidUsersFind } from './settings/rfid_users_find';\nimport { RfidUsersRequest } from './settings/rfid_users_request';\nimport { RfidUserListWorkerStatus } from './settings/rfid_users_worker_request';\nimport { RfidUserListWorkerStatusReply } from './settings/rfid_users_worker_status';\n\nimport { Preloaded } from './settings/preloaded';\nimport { PreloadedTextSearch } from './settings/preloaded_text_search';\nimport { PreloadedRequest } from './settings/preloaded_request';\nimport { PreloadedReply } from './settings/preloaded_reply';\nimport { PreloadedExportCSVReply } from './settings/preloaded_export_csv_reply';\nimport { PreloadedCount } from './settings/preloaded_count';\nimport { PreloadedFind } from \"./settings/preloaded_find\";\nimport { PreloadedExport } from \"./settings/preloaded_export\";\nimport { FindPreloadedCategory } from './settings/find_preloaded_category';\nimport { PreloadedCategory } from './settings/preloaded_category';\nimport { PreloadedCategoryTextSearch } from './settings/preloaded_category_text_search';\nimport { PreloadedCategoryRequest } from './settings/preloaded_category_request';\nimport { PreloadedCategoryReply } from './settings/preloaded_category_reply';\nimport { PreloadedCategoryExportCSVReply } from './settings/preloaded_category_export_csv_reply';\nimport { PreloadedCategoryCount } from './settings/preloaded_category_count';\nimport { PreloadedCategoryFind } from './settings/preloaded_category_find';\nimport { PreloadedCategoryExport } from \"./settings/preloaded_category_export\";\nimport { PreloadedWorkerStatus } from \"./settings/preloaded_worker_status_request\";\nimport { PreloadedWorkerStatusReply } from \"./settings/preloaded_worker_status\";\nimport { PreloadedCategoryWorkerStatus } from \"./settings/preloaded_category_worker_status_request\";\nimport { PreloadedCategoryWorkerStatusReply } from \"./settings/preloaded_category_worker_status\";\n\nimport { SchoolGroup } from \"./settings/school_group\";\nimport { SchoolGroupFind } from \"./settings/find_school_group\";\nimport { SchoolGroupReturn } from \"./settings/school_group_return\";\nimport { SchoolGroupCount } from \"./settings/find_school_group_count\";\n\nimport { rfc3339ToDate, isDateSet } from \"./date_helper\";\nimport { Badge } from './settings/badge';\nimport { BadgeReply } from './settings/badge_reply';\nimport { FindBadge } from './settings/find_badge';\nimport { BadgeCount } from './settings/badge_count';\nimport { RootSchoolGroupAccountV2 } from './settings/school_group v2';\n\nimport {ActivityReportCSV} from './reports/activity_report_csv';\nimport {ActivityReportPDFRequest} from './reports/activity_report_pdf_request';\nimport {ActivityReportPDF} from './reports/activity_report_pdf';\nimport {ActivityReportCSVRequest} from './reports/activity_report_csv_request';\nimport { FindActivityReport } from './reports/find_activity_report';\nimport {ActivityReportRow} from './reports/activity_report_row';\nimport { ActivityReportExportCSVStatusRequest } from './reports/activity_report_export_csv_worker_status_request';\nimport { ActivityReportExportCSVWorkerStatusReply } from './reports/activity_report_export_csv_worker_status';\nimport { ActivityReportExportPDFStatusRequest } from './reports/activity_report_export_pdf_worker_status_request';\nimport { ActivityReportExportPDFWorkerStatusReply } from './reports/activity_report_export_pdf_worker_status';\nimport { RootSchoolGroupAccountDistinctV2 } from './settings/root_school_group_account_distrinct_v2';\n\n@Injectable()\nexport class DistrictServiceMoc {\n\tuserRolesKey: string = 'userRoles';\n\ttimeout: number = 5000; //10 sec\n\tretry: number = 3; //max retry\n\t//delay:number = 10000; //max delay after retry\n\terrors: any = {};\n\tmaxPollIteration: number = 5;\n\t// userAccountRoles: UserRoles;\n\n\tconstructor(private http: HttpService, private account: Account, private config: Config) {\n\t\tthis.errors['default'] = 'There is an error when processing this request, please try again later.';\n\t\tthis.errors['no connection'] = 'There is an error when communicating with a server, please try again later.'\n\t\tthis.errors['unauthorized'] = 'Unauthorized access.';\n\t\tthis.errors['not found'] = 'No results.';\n\t\tthis.errors['invalid token'] = 'Unauthorized access.';\n\t\tthis.errors['duplicate entry'] = 'This data already exists.';\n\t\tthis.errors['bad request'] = 'Invalid request.';\n\t\tthis.errors['internal server error'] = 'Internal server error. Please try again later.';\n\t\tthis.errors['unexpected'] = 'Sorry, an unexpected error has occured. Please contact Tech Support.';\n\t\tthis.errors['timeout'] = 'Timeout when communicating with a server, please try again later.';\n\t\tthis.errors['email address is invalid'] = 'Email address is invalid.';\n\t\tthis.errors['user status is invalid'] = 'Invalid user status.';\n\t\tthis.errors['user status signup is invalid email not confirmed'] = 'The user you\\'ve invited has not yet confirmed their email address.';\n\t\tthis.errors['notification not supported'] = 'Push notifications are not supported in this browser.';\n\t\tthis.errors['account license expired'] = 'Account License has expired. Please visit the Subscription page for more details and license renewal.';\n\t\tthis.errors['invalid account license'] = 'Account License is invalid. Please visit the Subscription page for more details and license renewal.';\n\t\tthis.errors['unauthorized access role'] = 'Unauthorized access role.';\n\t}\n\n\tvalidateAcctNumber(acctNumber: string): Observable {\n\t\tlet lusr = this.userRoles();\n\t\tif (lusr != null && lusr.acctNumber == acctNumber) {\n\t\t\t//return non http observable when the userroles exists at localStorage\n\t\t\treturn Observable.create((observer: Observer) => {\n\t\t\t\tobserver.next(true);\n\t\t\t\tobserver.complete();\n\t\t\t});\n\t\t} else {\n\t\t\treturn this.userRolesApi().map(usr => {\n\t\t\t\tlet match = false;\n\t\t\t\tfor (var u in usr) {\n\t\t\t\t\tif (usr[u].acctNumber == acctNumber) {\n\t\t\t\t\t\tmatch = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\t\t}\n\t}\n\n\tloadUser(): Observable {\n\t\tlet u = this.account.getUserProfileApi().subscribe(us => {\n\t\t\tthis.account.setUser(us);\n\t\t});\n\t\treturn this.userRolesApi().map(urs => {\n\t\t\tthis.setUserRoles(urs[0]);\n\t\t\treturn urs[0]\n\t\t}).do(ur => u);\n\t}\n\n\tremoveLocalStorage() {\n\t\tlocalStorage.removeItem(this.userRolesKey);\n\t}\n\n\t// reason why we changed from storing to memory to storing on localStorage\n\t// is because users are refreshing the page and they lost the school they have selected\n\t// refresh page is taking the default school not the one they have selected from the list\n\tsetUserRoles(us: UserRoles) {\n\t\tlocalStorage.setItem(this.userRolesKey, JSON.stringify(us));\n\t}\n\n\tuserRoles() {\n\t\tif (localStorage.getItem(this.userRolesKey) === null) {\n\t\t\treturn null\n\t\t}\n\t\treturn JSON.parse(localStorage.getItem(this.userRolesKey));\n\t}\n\n\tcontainsUserRole(ur: UserRoles, role: string): boolean {\n\t\tfor (var r in ur.roles) {\n\t\t\tif (ur.roles[r] == role) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tgetToken() {\n\t\treturn this.account.getToken();\n\t}\n\n\tgetError(err: any): Error {\n\t\tvar er: any;\n\t\tvar msg = 'no connection';\n\t\tif (typeof (err.json) === 'function') {\n\t\t\ter = err.json();\n\t\t\tif (er.message != null && er.message != null && er.message != '') {\n\t\t\t\tmsg = er.message;\n\t\t\t} else {\n\t\t\t\tconsole.log(err);\n\t\t\t}\n\t\t\treturn new Error(msg);\n\t\t} else if (err instanceof Error) {\n\t\t\treturn err;\n\t\t} else {\n\t\t\tconsole.log(err);\n\t\t}\n\t}\n\n\tgetUserError(err: Error): string {\n\t\treturn this.errors[err.message];\n\t}\n\n\tisErrNotFound(err: Error): boolean {\n\t\treturn err.message == 'not found';\n\t}\n\n\tisErrUnauthorized(err: Error): boolean {\n\t\treturn err.message == 'unauthorized' ||\n\t\t\terr.message == 'unauthorized access role';\n\t}\n\n\tgetUserErrorDefault(err: Error): string {\n\t\tlet e = this.errors[err.message];\n\t\tif (e != null) {\n\t\t\treturn e;\n\t\t}\n\t\treturn this.errors['default'];\n\t}\n\n\tbuildUrl(parameters) {\n\t\tvar qs = \"\";\n\t\tfor (var key in parameters) {\n\t\t\tvar value = parameters[key];\n\t\t\tif (value != null && value != '') {\n\t\t\t\tqs += encodeURIComponent(key) + \"=\" + encodeURIComponent(value) + \"&\";\n\t\t\t}\n\t\t}\n\t\tif (qs.length > 0) {\n\t\t\treturn qs.substring(0, qs.length - 1); //chop off last \"&\"\n\t\t}\n\t\treturn '';\n\t}\n\n\tparams(parameters) {\n\t\tvar params: any = {}\n\t\tfor (var key in parameters) {\n\t\t\tvar value = parameters[key];\n\t\t\tif (value != null && value != '') {\n\t\t\t\tparams[encodeURIComponent(key)] = encodeURIComponent(value);\n\t\t\t}\n\t\t}\n\t\treturn params;\n\t}\n\n\tleftPad(val: string, size: number, ch: string): string {\n\t\tvar result = String(val);\n\t\tif (!ch) {\n\t\t\tch = \" \";\n\t\t}\n\t\twhile (result.length < size) {\n\t\t\tresult = ch + result;\n\t\t}\n\t\treturn result;\n\t}\n\n\thexAcctNumber(num: number): string {\n\t\t//sign >>> is Zero-fill right shift\n\t\treturn this.leftPad((num >>> 0).toString(16), 8, '0').toUpperCase();\n\t}\n\n\t// APIs\n\tuserRolesApi(): Observable {\n\t\tvar rows: UserRoles[] = [];\n\t\trows.push({ acctNumber: 'A12F2343', schoolName: 'High School', isDefault: false, roles: ['admin', 'user'] });\n\t\trows.push({ acctNumber: 'A12F2344', schoolName: 'College', isDefault: false, roles: ['admin', 'user'] });\n\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(rows);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\tsetDefaultApi(acctNumber: string): Observable {\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(true);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\tupdateDistrictUserApi(acctNumber: string, req: DistrictUser): Observable {\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(true);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\tdistrictUsersApi(acctNumber: string): Observable {\n\t\tlet rows: DistrictUser[] = [];\n\n\t\trows.push({\n\t\t\troles: ['admin', 'user'],\n\t\t\tuserId: 'userId1',\n\t\t\tfirstName: 'beni',\n\t\t\tlastName: 'kol',\n\t\t\temail: 'email@test.com',\n\t\t\topenAddRole: false,\n\t\t\tstatus: 'test',\n\t\t\towner: 'user',\n\t\t}, {\n\t\t\t\troles: ['user', 'user'],\n\t\t\t\tuserId: 'uderId2',\n\t\t\t\tfirstName: 'benjamin',\n\t\t\t\tlastName: 'kolenovic',\n\t\t\t\temail: 'test@email.com',\n\t\t\t\topenAddRole: false,\n\t\t\t\tstatus: 'test',\n\t\t\t\towner: 'user',\n\t\t\t});\n\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(rows);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\tinviteDistrictUserApi(acctNumber: string, req: InviteUser): Observable {\n\t\tlet row: DistrictUser = new DistrictUser();\n\n\t\trow.roles = ['admin', 'user'];\n\t\trow.userId = 'id1';\n\t\trow.firstName = 'ben';\n\t\trow.lastName = 'lastname';\n\t\trow.email = req.email;\n\t\trow.openAddRole = false;\n\t\trow.status = 'invite';\n\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(row);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\tremoveDistrictUserApi(acctNumber: string, req: DistrictUser): Observable {\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(true);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\tsubscriptionApi(acctNumber: string): Observable {\n\n\t\tlet row: subscription.SubscriptionResponse = {\n\t\t\tsupportContact: {\n\t\t\t\tname: 'test test',\n\t\t\t\tphone: 'phone',\n\t\t\t\temail: 'test@test.com',\n\t\t\t},\n\t\t\teregCustomerProfile: {\n\t\t\t\tcustId: -1,\n\t\t\t\tfirstName: '',\n\t\t\t\tlastName: 'lastName',\n\t\t\t\tusername: 'username',\n\t\t\t\temail: 'email@email.com',\n\t\t\t\tadditionalEmail: 'test@test.com',\n\t\t\t\tphone: 'phone',\n\t\t\t\tcreationDate: '2018-08-20T20:24:41.103Z',\n\t\t\t\tcreationDateValue: new Date('2018-08-20T20:24:41.103Z'),\n\t\t\t},\n\t\t\tdistrictInformation: {\n\t\t\t\tdistrictName: 'school name',\n\t\t\t\tstate: 'FL',\n\t\t\t\tcity: 'city',\n\t\t\t\tzipCode: 'zip',\n\t\t\t\taccountRegistrationId: 'acctRegID',\n\t\t\t\tacctNumber: -1,\n\t\t\t\tdistrictAcctNumber: 1,\n\t\t\t},\n\t\t\taccountlicense: {\n\t\t\t\tcode: 'code',\n\t\t\t\tlicenseTypeId: 1,\n\t\t\t\texpirationDate: '2019-08-20T20:24:41.103Z',\n\t\t\t\texpirationDateValue: new Date('2019-08-20T20:24:41.103Z'),\n\t\t\t\tstatus: 1,\n\t\t\t\tsupportedAccounts: 2,\n\t\t\t},\n\t\t};\n\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(row);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\tcountNotification: number = 0;\n\n\tisErrDuplicateEntry(err: Error): boolean {\n\t\treturn err.message == 'duplicate entry';\n\t}\n\n\tisErrAccountLicenseExpired(err: Error): boolean {\n\t\treturn err.message == 'account license expired';\n\t}\n\n\tisErrAccountLicenseInvalid(err: Error): boolean {\n\t\treturn err.message == 'invalid account license';\n\t}\n\n\tgetDefaultSaveMessage(): string {\n\t\treturn \"Successfully Saved\";\n\t}\n\n\tsubscriptionRegistrationUrlApi(acctNumber: string): Observable {\n\t\tlet row: SubscriptionRegistrationURL = {\n\t\t\tregistrationUrl: 'http://idk-r2vm/eReg/Public/CustomerInfo.aspx?Credentials=E5B5F91FCF93631D257F65794C06AF453921F588F922EB0EA984DA4E1783ABE741217E7093C4AA5783654AD1166F6CAE5274CAD5&CcssVmTrial=True&AspxAutoDetectCookieSupport=1',\n\t\t}\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(row);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\toauthTokenApi(req: OAuthTokenRequest): Observable {\n\t\treturn Observable.of(new OAuthToken());\n\t}\n\n\taccountAssociationFindApi(acctNumber: string): Observable {\n\t\tlet rows: AssociateAccount[] = [];\n\n\t\trows.push({\n\t\t\tacctNumber: '-1471032103',\n\t\t\tparentAccountNumber: 'parentacctnumber',\n\t\t\torganizationName: 'Iak Dev',\n\t\t\tstate: 'FL',\n\t\t\tzipCode: '3000',\n\t\t\tjoinedAt: new Date('2018-08-20T20:24:41.103Z'),\n\t\t\tenabled: true,\n\t\t}, {\n\t\t\t\tacctNumber: '-1471032104',\n\t\t\t\tparentAccountNumber: 'parentacctnumber',\n\t\t\t\torganizationName: 'Iak Dev1',\n\t\t\t\tstate: 'FL',\n\t\t\t\tzipCode: '3001',\n\t\t\t\tjoinedAt: new Date('2018-08-20T20:24:41.103Z'),\n\t\t\t\tenabled: false,\n\t\t\t});\n\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(rows);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\taccountAssociationAssociateApi(req: AssociateAccount[]): Observable {\n\t\treturn Observable.of(\"ok\");\n\t}\n\taccountAssociationCountApi(req: AssociateAccount[]): Observable {\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(2);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\tnoGoEnhanceEx1(): NoGoEnhance {\n\t\tlet d: any = '0001-01-01T00:00:00Z';\n\t\treturn {\n\t\t\tid: 1,\n\t\t\tfirstName: 'first',\n\t\t\tlastName: 'last',\n\t\t\tmiddleName: 'middle',\n\t\t\tdateOfBirth: rfc3339ToDate(d),\n\t\t\treferenceId: '1',\n\t\t\treferenceType: 'soc',\n\t\t\tnotes: 'notes',\n\t\t\taddressState: 'FL',\n\t\t\tcreatedAt: new Date(),\n\t\t\tupdatedAt: new Date(),\n\t\t\thasFile: false,\n\t\t\tsource: 'school',\n\t\t\tschoolGroupID: 1,\n\t\t\tschoolGroupName: 'Group 1',\n\t\t\tfiles: [],\n\t\t\tuid: '1',\n\t\t}\n\t}\n\n\tnoGoEnhanceEx2(): NoGoEnhance {\n\t\treturn {\n\t\t\tid: 2,\n\t\t\tfirstName: 'first2',\n\t\t\tlastName: 'last2',\n\t\t\tmiddleName: 'middle',\n\t\t\tdateOfBirth: new Date(2010, 1, 1),\n\t\t\treferenceId: '',\n\t\t\treferenceType: 'user',\n\t\t\tnotes: 'ttest test test testtest test test testtest test test testtest test test testtest test test testtest test test testtest test test testtest test test testtest test test testtest test test testtest test test testtest test test testtest test test testtest test test testtest test test testtest test test testtest test test testtest test test testtest test test testtest test test testtest test test testest test test test',\n\t\t\taddressState: 'FL',\n\t\t\tcreatedAt: new Date(),\n\t\t\tupdatedAt: new Date(),\n\t\t\thasFile: true,\n\t\t\tsource: 'school',\n\t\t\tschoolGroupID: 2,\n\t\t\tschoolGroupName: 'Group 2',\n\t\t\tfiles: [\n\t\t\t\t{ id: 1, linkUrl: '', createdAt: new Date(), originalFileName: 'brad-pitt.jpg', downloadUrl: 'https://d26oc3sg82pgk3.cloudfront.net/files/media/slideshows/images/brad-pitt-shutterstock.jpg.644x428_q100.jpg', contentType: 'image/jpg' },\n\t\t\t\t{ id: 2, linkUrl: '', createdAt: new Date(), originalFileName: '', downloadUrl: 'http://images.indianexpress.com/2017/08/morgan-freeman-759.jpg', contentType: 'image/jpg' },\n\t\t\t\t{ id: 3, linkUrl: '', createdAt: new Date(), originalFileName: 'user.png', downloadUrl: 'https://cdn0.iconfinder.com/data/icons/PRACTIKA/256/user.png', contentType: 'image/png' },\n\t\t\t\t{ id: 4, linkUrl: '', createdAt: new Date(), originalFileName: 'python-pandas.pdf', downloadUrl: 'http://file.allitebooks.com/20150715/Instant%20Data%20Intensive%20Apps%20with%20pandas%20How-to.pdf', contentType: 'application/pdf' },\n\t\t\t\t{ id: 5, linkUrl: '', createdAt: new Date(), originalFileName: 'notification_1532372214940.soc.url.json', downloadUrl: 'https://api.myjson.com/bins/o9wl6', contentType: 'application/json' }\n\t\t\t],\n\t\t\tuid:'1',\n\t\t}\n\t}\n\n\tnoGoEnhanceEx3(): NoGoEnhance {\n\t\treturn {\n\t\t\tid: 3,\n\t\t\tfirstName: 'first2',\n\t\t\tlastName: 'last2',\n\t\t\tmiddleName: 'middle',\n\t\t\tdateOfBirth: new Date(2010, 1, 1),\n\t\t\treferenceId: '',\n\t\t\treferenceType: 'user',\n\t\t\tnotes: 'ttest testtest test test testtest test test',\n\t\t\taddressState: 'FL',\n\t\t\tcreatedAt: new Date(),\n\t\t\tupdatedAt: new Date(),\n\t\t\thasFile: true,\n\t\t\tsource: 'school',\n\t\t\tschoolGroupID: 1,\n\t\t\tschoolGroupName: 'Group 1',\n\t\t\tfiles: [\n\t\t\t\t{ id: 2, linkUrl: '', createdAt: new Date(), originalFileName: '', downloadUrl: 'http://images.indianexpress.com/2017/08/morgan-freeman-759.jpg', contentType: 'image/png' },\n\t\t\t\t{ id: 4, linkUrl: '', createdAt: new Date(), originalFileName: 'python-pandas.pdf', downloadUrl: 'http://file.allitebooks.com/20150715/Instant%20Data%20Intensive%20Apps%20with%20pandas%20How-to.pdf', contentType: 'application/pdf' },\n\t\t\t\t{ id: 5, linkUrl: '', createdAt: new Date(), originalFileName: 'notification_1532372214940.soc.url.json', downloadUrl: 'https://api.myjson.com/bins/o9wl6', contentType: 'application/json' },\n\t\t\t],\n\t\t\tuid:'1',\n\t\t}\n\t}\n\n\n\tnoGoEnhanceSearchApi(acctNumber: string, req: NoGoEnhanceTextSearch): Observable {\n\t\tlet rows: NoGoEnhance[] = [];\n\n\t\trows.push(this.noGoEnhanceEx1());\n\t\trows.push(this.noGoEnhanceEx2());\n\t\trows.push(this.noGoEnhanceEx3());\n\n\t\tfor (let r of rows) {\n\t\t\tif (!isDateSet(r.dateOfBirth)) {\n\t\t\t\tr.dateOfBirth = null;\n\t\t\t}\n\t\t}\n\n\t\treturn Observable.of(rows);\n\t}\n\n\tnoGoEnhanceSearchCountApi(acctNumber: string, req: NoGoEnhanceTextSearch): Observable {\n\t\tlet row: NoGoEnhanceCount = { count: 1 };\n\t\treturn Observable.of(row);\n\t}\n\n\tnoGoEnhanceAddApi(acctNumber: string, req: NoGoEnhanceRequest): Observable {\n\t\tlet row: NoGoEnhanceReply = { id: 1 };\n\t\treturn Observable.of(row);\n\t}\n\n\tnoGoEnhanceUpdateApi(acctNumber: string, id: number, req: NoGoEnhanceRequest): Observable {\n\t\tlet row: NoGoEnhanceReply = { id: 1 };\n\t\treturn Observable.of(row);\n\t}\n\n\tnoGoEnhanceRemoveApi(acctNumber: string, id: number): Observable {\n\t\tlet row: NoGoEnhanceReply = { id: 1 };\n\t\treturn Observable.of(row);\n\t}\n\n\tnoGoEnhanceRemoveAllApi(acctNumber: string, req: NoGoEnhanceTextSearch): Observable {\n\t\treturn Observable.of(null);\n\t}\n\n\tnoGoEnhanceExportCsvApi(acctNumber: string, req: NoGoEnhanceExportCSV): Observable {\n\t\tlet row: NoGoEnhanceExportCSVReply = {\n\t\t\tdownloadUrls: ['http://edge.liveleak.com/80281E/u/u/thumbs/2010/Apr/3/1ddac1028fc6_thumb_1.jpg'],\n\t\t\trequestId: 'd808bb2d-9660-4430-9fc4-613df1fee4fa'\n\t\t};\n\t\treturn Observable.of(row);\n\t}\n\n\tnoGoEnhanceImportCsvUrl(acctNumber: string): string {\n\t\treturn `${this.config.districtApiUrl}/districts/${acctNumber}/settings/nogo-enhance/import/csv`\n\t}\n\n\tnoGoEnhanceFindApi(acctNumber: string, req: NoGoEnhanceFind): Observable {\n\t\treturn this.noGoEnhanceSearchApi(acctNumber, null).map(rows => {\n\n\t\t\tlet rowsRet: NoGoEnhance[] = [];\n\t\t\tfor (let r of rows) {\n\t\t\t\tlet add = true;\n\n\t\t\t\tif (req.firstName != '') {\n\t\t\t\t\tif (r.firstName != req.firstName) {\n\t\t\t\t\t\tadd = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (req.id != 0) {\n\t\t\t\t\tif (r.id != req.id) {\n\t\t\t\t\t\tadd = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (add) {\n\t\t\t\t\trowsRet.push(r);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (rowsRet.length == 0) {\n\t\t\t\tthrow new Error('not found');\n\t\t\t}\n\t\t\treturn rowsRet;\n\t\t});\n\t}\n\n\tnoGoEnhanceFileDownloadJsonUrl(acctNumber: string, jsonUrl: string): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\treturn this.http.get(jsonUrl)\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\tlet data = resp.json();\n\t\t\t\t\treturn data.url;\n\t\t\t\t} else { throw this.getError(resp); }\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tnoGoEnhanceFileUploadUrl(acctNumber: string): string {\n\t\treturn `https://httpbin.org/post`\n\t}\n\n\tnoGoEnhanceFileRemoveApi(acctNumber: string, id: number): Observable {\n\t\tlet row: NoGoEnhanceFileReply = { fileId: 1 };\n\t\treturn Observable.of(row);\n\t}\n\tnoGoEnhanceImportCsvStatus(acctNumber: string, req: NoGoEnhanceWorkerStatus): Observable {\n\t\tlet ws: NoGoEnhanceWorkerStatusReply = {\n\t\t\terror: '',\n\t\t\timportedRows: 1,\n\t\t\ttotalFileRows: 1,\n\t\t\tfilePath: '',\n\t\t\tdone: true,\n\t\t\tlastSequenceId: 0,\n\t\t}\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(ws);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\tnoGoEnhanceExportCsvStatus(acctNumber: string, req: NoGoEnhanceWorkerStatus): Observable {\n\t\tlet ws: NoGoEnhanceWorkerStatusReply = {\n\t\t\terror: '',\n\t\t\timportedRows: 1,\n\t\t\ttotalFileRows: 1,\n\t\t\tfilePath: '',\n\t\t\tdone: true,\n\t\t\tlastSequenceId: 0,\n\t\t}\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(ws);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\t// RFID users list API\n\trfidUsersExportCsvApi(acctNumber: string, req: RfidUsersExport): Observable {\n\t\tlet rows: RfidUsersExportCSVReply = {\n\t\t\tdownloadUrls: ['https://district.ccssvm.com/something'],\n\t\t\trequestId: 'd808bb2d-9660-4430-9fc4-613df1fee4fa'\n\t\t}\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tsetTimeout(() => {\n\t\t\t\tobserver.next(rows);\n\t\t\t\tobserver.complete();\n\t\t\t}, 1000);\n\t\t});\n\t}\n\n\trfidUsersRemoveApi(acctNumber: string, id: number): Observable {\n\t\tlet rows: RfidUsersReply = {\n\t\t\tid: 1,\n\t\t}\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(rows);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\trfidUsersImportCsvUrl(acctNumber: string): string {\n\t\treturn 'https://httpbin.org/post'\n\t}\n\n\trfidUsersSearchApi(acctNumber: string, req: RfidUsersTextSearch): Observable {\n\t\tlet d: any = '0001-01-01T00:00:00Z';\n\t\tlet rows: RfidUsers[] = [];\n\t\trows.push(\n\t\t\t{\n\t\t\t\tid: 1,\n\t\t\t\tfirstName: 'first',\n\t\t\t\tlastName: 'last',\n\t\t\t\tmiddleName: 'middle',\n\t\t\t\tbadgeTitle: 'Visitor',\n\t\t\t\tbadgeNumber: 1,\n\t\t\t\tfield1: 'field1',\n\t\t\t\tfield2: 'field2',\n\t\t\t\tfield3: 'field3',\n\t\t\t\tfield4: 'field4',\n\t\t\t\tfield5: 'field5',\n\t\t\t\tfield6: 'field6',\n\t\t\t\tfield7: 'field7',\n\t\t\t\trfCardId: '23ddsa',\n\t\t\t\tsource: 'school',\n\t\t\t\tschoolGroupID: 1,\n\t\t\t\tschoolGroupName: 'Group 1',\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t\tuid: '',\n\t\t\t}, {\n\t\t\t\tid: 2,\n\t\t\t\tfirstName: 'first2',\n\t\t\t\tlastName: 'last2',\n\t\t\t\tmiddleName: 'middle2',\n\t\t\t\tbadgeTitle: 'Visitor',\n\t\t\t\tbadgeNumber: 0,\n\t\t\t\tfield1: 'field1',\n\t\t\t\tfield2: 'field2',\n\t\t\t\tfield3: 'field3',\n\t\t\t\tfield4: 'field4',\n\t\t\t\tfield5: 'field5',\n\t\t\t\tfield6: 'field6',\n\t\t\t\tfield7: 'field7',\n\t\t\t\trfCardId: 'dsad11',\n\t\t\t\tsource: 'district',\n\t\t\t\tschoolGroupID: 2,\n\t\t\t\tschoolGroupName: 'Group 2',\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t\tuid:'',\n\t\t\t});\n\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(rows);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\trfidUsersSearchCountApi(acctNumber: string, req: RfidUsersTextSearch): Observable {\n\t\tlet row: RfidUsersCount = {\n\t\t\tcount: 10\n\t\t}\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(row);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\trfidUsersRemoveAllApi(acctNumber: string, req: RfidUsersTextSearch): Observable {\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tsetTimeout(() => {\n\t\t\t\tobserver.next(null);\n\t\t\t\tobserver.complete();\n\t\t\t}, 1000);\n\t\t});\n\t}\n\n\trfidUsersFindApi(acctNumber: string, req: RfidUsersFind): Observable {\n\t\tlet d: any = '0001-01-01T00:00:00Z';\n\t\tlet rows: RfidUsers[] = [];\n\t\trows.push(\n\t\t\t{\n\t\t\t\tid: 1,\n\t\t\t\tfirstName: 'first',\n\t\t\t\tlastName: 'last',\n\t\t\t\tmiddleName: 'middle',\n\t\t\t\tbadgeTitle: 'Visitor',\n\t\t\t\tbadgeNumber: 1,\n\t\t\t\tfield1: 'field1',\n\t\t\t\tfield2: 'field2',\n\t\t\t\tfield3: 'field3',\n\t\t\t\tfield4: 'field4',\n\t\t\t\tfield5: 'field5',\n\t\t\t\tfield6: 'field6',\n\t\t\t\tfield7: 'field7',\n\t\t\t\trfCardId: '23ddsa',\n\t\t\t\tsource: 'school',\n\t\t\t\tschoolGroupID: 1,\n\t\t\t\tschoolGroupName: 'Group 1',\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t\tuid:'',\n\t\t\t}, {\n\t\t\t\tid: 2,\n\t\t\t\tfirstName: 'first2',\n\t\t\t\tlastName: 'last2',\n\t\t\t\tmiddleName: 'middle2',\n\t\t\t\tbadgeTitle: 'Visitor',\n\t\t\t\tbadgeNumber: 0,\n\t\t\t\tfield1: 'field1',\n\t\t\t\tfield2: 'field2',\n\t\t\t\tfield3: 'field3',\n\t\t\t\tfield4: 'field4',\n\t\t\t\tfield5: 'field5',\n\t\t\t\tfield6: 'field6',\n\t\t\t\tfield7: 'field7',\n\t\t\t\trfCardId: 'dsad11',\n\t\t\t\tsource: 'district',\n\t\t\t\tschoolGroupID: 2,\n\t\t\t\tschoolGroupName: 'Group 2',\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t\tuid: '',\n\t\t\t});\n\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(rows);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\trfidUsersUpdateApi(acctNumber: string, id: number, req: RfidUsersRequest): Observable {\n\t\tlet row: RfidUsersReply = {\n\t\t\tid: 1,\n\t\t}\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(row);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\trfidUsersAddApi(acctNumber: string, req: RfidUsersRequest): Observable {\n\t\tlet rows: RfidUsersReply = {\n\t\t\tid: 1,\n\t\t}\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(rows);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\twsRfidUserListWorkerStatusReply: RfidUserListWorkerStatusReply;\n\trfidUsersImportCsvStatus(acctNumber: string, req: RfidUserListWorkerStatus): Observable {\n\t\tif (!this.wsRfidUserListWorkerStatusReply) {\n\t\t\tthis.wsRfidUserListWorkerStatusReply = {\n\t\t\t\terror: '',\n\t\t\t\timportedRows: 1,\n\t\t\t\ttotalFileRows: 3,\n\t\t\t\tfilePath: '',\n\t\t\t\tdone: false,\n\t\t\t\tlastSequenceId: 0,\n\t\t\t};\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.wsRfidUserListWorkerStatusReply.done = true;\n\t\t\t\t//this.wsRfidUserListWorkerStatusReply.error='something happen';\n\t\t\t\tthis.wsRfidUserListWorkerStatusReply.importedRows = 3;\n\t\t\t\tconsole.log('done');\n\t\t\t}, 4000);\n\t\t}\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(this.wsRfidUserListWorkerStatusReply);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\trfidUsersExportCsvStatus(acctNumber: string, req: RfidUserListWorkerStatus): Observable {\n\t\tlet ws: RfidUserListWorkerStatusReply = {\n\t\t\terror: '',\n\t\t\timportedRows: 1,\n\t\t\ttotalFileRows: 1,\n\t\t\tfilePath: '',\n\t\t\tdone: true,\n\t\t\tlastSequenceId: 0,\n\t\t}\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(ws);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\t//Preloaded\n\tpreloadedCategoriesApi(acctNumber: string, req: FindPreloadedCategory): Observable {\n\t\tvar rows: PreloadedCategory[] = [{\n\t\t\tid: 1,\n\t\t\tpreloadedCategoryId: 0,\n\t\t\tpreloadedCategoryName: 'Category 1',\n\t\t\tcreatedAt: new Date(),\n\t\t\tupdatedAt: new Date(),\n\t\t}, {\n\t\t\tid: 2,\n\t\t\tpreloadedCategoryId: 1,\n\t\t\tpreloadedCategoryName: 'Category 2',\n\t\t\tcreatedAt: new Date(),\n\t\t\tupdatedAt: new Date(),\n\t\t},\n\t\t{\n\t\t\tid: 3,\n\t\t\tpreloadedCategoryId: 3,\n\t\t\tpreloadedCategoryName: 'Custom Cat',\n\t\t\tcreatedAt: new Date(),\n\t\t\tupdatedAt: new Date(),\n\t\t}\n\t\t];\n\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tsetTimeout(() => {\n\t\t\t\tobserver.next(rows);\n\t\t\t\tobserver.complete();\n\t\t\t}, 1000);\n\t\t});\n\t}\n\n\tpreloadedCategorySearchApi(acctNumber: string, req: PreloadedCategoryTextSearch): Observable {\n\t\tlet d: any = '0001-01-01T00:00:00Z';\n\t\tlet rows: PreloadedCategory[] = [];\n\t\trows.push(\n\t\t\t{\n\t\t\t\tid: 1,\n\t\t\t\tpreloadedCategoryId: 1,\n\t\t\t\tpreloadedCategoryName: 'preloadedCategoryName 1',\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t}, {\n\t\t\t\tid: 2,\n\t\t\t\tpreloadedCategoryId: 2,\n\t\t\t\tpreloadedCategoryName: 'preloadedCategoryName 2',\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 3,\n\t\t\t\tpreloadedCategoryId: 3,\n\t\t\t\tpreloadedCategoryName: 'preloadedCategoryName 3',\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t},\n\n\t\t\t{\n\t\t\t\tid: 4,\n\t\t\t\tpreloadedCategoryId: 2500,\n\t\t\t\tpreloadedCategoryName: 'district cat 1',\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 5,\n\t\t\t\tpreloadedCategoryId: 4,\n\t\t\t\tpreloadedCategoryName: 'preloadedCategoryName 4',\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t},\n\t\t);\n\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(rows);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\tpreloadedCategorySearchCountApi(acctNumber: string, req: PreloadedCategoryTextSearch): Observable {\n\t\tlet row: PreloadedCategoryCount = {\n\t\t\tcount: 10\n\t\t}\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(row);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\tpreloadedCategoryAddApi(acctNumber: string, req: PreloadedCategoryRequest): Observable {\n\t\tlet rows: PreloadedCategoryReply = {\n\t\t\tid: 1,\n\t\t\tpreloadedCategoryId: 3,\n\t\t}\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(rows);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\tpreloadedCategoryUpdateApi(acctNumber: string, id: number, req: PreloadedCategoryRequest): Observable {\n\t\tlet row: PreloadedCategoryReply = {\n\t\t\tid: 1,\n\t\t\tpreloadedCategoryId: 3,\n\t\t}\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(row);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\tpreloadedCategoryRemoveApi(acctNumber: string, id: number): Observable {\n\t\tlet rows: PreloadedCategoryReply = {\n\t\t\tid: 1,\n\t\t\tpreloadedCategoryId: 3,\n\t\t}\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(rows);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\tpreloadedCategoryRemoveAllApi(acctNumber: string, req: PreloadedCategoryTextSearch): Observable {\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tsetTimeout(() => {\n\t\t\t\tobserver.next(null);\n\t\t\t\tobserver.complete();\n\t\t\t}, 1000);\n\t\t});\n\t}\n\n\tpreloadedCategoryExportCsvApi(acctNumber: string, req: PreloadedCategoryExport): Observable {\n\t\tlet rows: PreloadedCategoryExportCSVReply = {\n\t\t\tdownloadUrls: ['https://school.ccssvm.com/something'],\n\t\t\trequestId: 'd808bb2d-9660-4430-9fc4-613df1fee4fa',\n\t\t}\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tsetTimeout(() => {\n\t\t\t\tobserver.next(rows);\n\t\t\t\tobserver.complete();\n\t\t\t}, 1000);\n\t\t});\n\t}\n\n\tpreloadedCategoryImportCsvUrl(acctNumber: string): string {\n\t\treturn 'https://httpbin.org/post'\n\t}\n\n\tpreloadedCategoryFindApi(acctNumber: string, req: PreloadedCategoryFind): Observable {\n\t\tlet d: any = '0001-01-01T00:00:00Z';\n\t\tlet rows: PreloadedCategory[] = [];\n\t\trows.push(\n\t\t\t{\n\t\t\t\tid: 1,\n\t\t\t\tpreloadedCategoryId: 1,\n\t\t\t\tpreloadedCategoryName: 'preloadedCategoryName 1',\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t}, {\n\t\t\t\tid: 2,\n\t\t\t\tpreloadedCategoryId: 2,\n\t\t\t\tpreloadedCategoryName: 'preloadedCategoryName 2',\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 3,\n\t\t\t\tpreloadedCategoryId: 3,\n\t\t\t\tpreloadedCategoryName: 'preloadedCategoryName 3',\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t},\n\n\t\t\t{\n\t\t\t\tid: 4,\n\t\t\t\tpreloadedCategoryId: 2500,\n\t\t\t\tpreloadedCategoryName: 'district cat 1',\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 5,\n\t\t\t\tpreloadedCategoryId: 4,\n\t\t\t\tpreloadedCategoryName: 'preloadedCategoryName 4',\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t},\n\t\t);\n\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(rows);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\tpreloadedCategoryImportCsvStatus(acctNumber: string, req: PreloadedCategoryWorkerStatus): Observable {\n\t\tlet ws: PreloadedCategoryWorkerStatusReply = {\n\t\t\terror: '',\n\t\t\timportedRows: 1,\n\t\t\ttotalFileRows: 1,\n\t\t\tfilePath: '',\n\t\t\tdone: true,\n\t\t\tlastSequenceId: 0,\n\t\t}\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(ws);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\tpreloadedCategoryExportCsvStatus(acctNumber: string, req: PreloadedCategoryWorkerStatus): Observable {\n\t\tlet ws: PreloadedCategoryWorkerStatusReply = {\n\t\t\terror: '',\n\t\t\timportedRows: 1,\n\t\t\ttotalFileRows: 1,\n\t\t\tfilePath: '',\n\t\t\tdone: true,\n\t\t\tlastSequenceId: 0,\n\t\t}\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(ws);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\tpreloadedSearchApi(acctNumber: string, req: PreloadedTextSearch): Observable {\n\t\tlet d: any = '0001-01-01T00:00:00Z';\n\t\tlet rows: Preloaded[] = [];\n\t\trows.push(\n\t\t\t{\n\t\t\t\tid: 1,\n\t\t\t\tfirstName: 'first',\n\t\t\t\tlastName: 'last',\n\t\t\t\tmiddleName: 'middle',\n\t\t\t\tpreloadedCategoryName: 'preloadedCategoryName',\n\t\t\t\tpreloadedCategoryId: 1,\n\t\t\t\tfield1: 'field1',\n\t\t\t\tfield2: 'field2',\n\t\t\t\tfield3: 'field3',\n\t\t\t\tfield4: 'field4',\n\t\t\t\tfield5: 'field5',\n\t\t\t\tfield6: 'field6',\n\t\t\t\tfield7: 'field7',\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t\tschoolGroupName: 'Group 1',\n\t\t\t\tschoolGroupID: 1,\n\t\t\t\tsource: 'school',\n\t\t\t\tuid: '1',\n\t\t\t}, {\n\t\t\t\tid: 2,\n\t\t\t\tfirstName: 'first2',\n\t\t\t\tlastName: 'last2',\n\t\t\t\tmiddleName: 'middle2',\n\t\t\t\tpreloadedCategoryName: 'preloadedCategoryName',\n\t\t\t\tpreloadedCategoryId: 12,\n\t\t\t\tfield1: 'field1',\n\t\t\t\tfield2: 'field2',\n\t\t\t\tfield3: 'field3',\n\t\t\t\tfield4: 'field4',\n\t\t\t\tfield5: 'field5',\n\t\t\t\tfield6: 'field6',\n\t\t\t\tfield7: 'field7',\n\t\t\t\tschoolGroupName: 'Group 2',\n\t\t\t\tschoolGroupID: 2,\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t\tsource: 'district',\n\t\t\t\tuid:'2',\n\t\t\t});\n\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(rows);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\tpreloadedSearchCountApi(acctNumber: string, req: PreloadedTextSearch): Observable {\n\t\tlet row: PreloadedCount = {\n\t\t\tcount: 10\n\t\t}\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(row);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\tpreloadedAddApi(acctNumber: string, req: PreloadedRequest): Observable {\n\t\tlet rows: PreloadedReply = {\n\t\t\tid: 1,\n\t\t}\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(rows);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\tpreloadedUpdateApi(acctNumber: string, id: number, req: PreloadedRequest): Observable {\n\t\tlet row: PreloadedReply = {\n\t\t\tid: 1,\n\t\t}\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(row);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\tpreloadedRemoveApi(acctNumber: string, id: number): Observable {\n\t\tlet rows: PreloadedReply = {\n\t\t\tid: 1,\n\t\t}\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(rows);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\tpreloadedRemoveAllApi(acctNumber: string, req: PreloadedTextSearch): Observable {\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tsetTimeout(() => {\n\t\t\t\tobserver.next(null);\n\t\t\t\tobserver.complete();\n\t\t\t}, 1000);\n\t\t});\n\t}\n\n\tpreloadedExportCsvApi(acctNumber: string, req: PreloadedExport): Observable {\n\t\tlet rows: PreloadedExportCSVReply = {\n\t\t\tdownloadUrls: ['https://school.ccssvm.com/something'],\n\t\t\trequestId: 'd808bb2d-9660-4430-9fc4-613df1fee4fa'\n\t\t}\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tsetTimeout(() => {\n\t\t\t\tobserver.next(rows);\n\t\t\t\tobserver.complete();\n\t\t\t}, 1000);\n\t\t});\n\t}\n\n\tpreloadedImportCsvUrl(acctNumber: string): string {\n\t\treturn 'https://httpbin.org/post'\n\t}\n\n\tpreloadedFindApi(acctNumber: string, req: PreloadedFind): Observable {\n\t\tlet d: any = '0001-01-01T00:00:00Z';\n\t\tlet rows: Preloaded[] = [];\n\t\trows.push(\n\t\t\t{\n\t\t\t\tid: 1,\n\t\t\t\tfirstName: 'first',\n\t\t\t\tlastName: 'last',\n\t\t\t\tmiddleName: 'middle',\n\t\t\t\tpreloadedCategoryName: 'preloadedCategoryName',\n\t\t\t\tpreloadedCategoryId: 1,\n\t\t\t\tfield1: 'field1',\n\t\t\t\tfield2: 'field2',\n\t\t\t\tfield3: 'field3',\n\t\t\t\tfield4: 'field4',\n\t\t\t\tfield5: 'field5',\n\t\t\t\tfield6: 'field6',\n\t\t\t\tfield7: 'field7',\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t\tschoolGroupName: 'Group 1',\n\t\t\t\tschoolGroupID: 1,\n\t\t\t\tsource: 'school',\n\t\t\t\tuid:'1',\n\t\t\t}, {\n\t\t\t\tid: 2,\n\t\t\t\tfirstName: 'first2',\n\t\t\t\tlastName: 'last2',\n\t\t\t\tmiddleName: 'middle2',\n\t\t\t\tpreloadedCategoryName: 'preloadedCategoryName',\n\t\t\t\tpreloadedCategoryId: 2,\n\t\t\t\tfield1: 'field1',\n\t\t\t\tfield2: 'field2',\n\t\t\t\tfield3: 'field3',\n\t\t\t\tfield4: 'field4',\n\t\t\t\tfield5: 'field5',\n\t\t\t\tfield6: 'field6',\n\t\t\t\tfield7: 'field7',\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t\tschoolGroupName: 'Group 2',\n\t\t\t\tschoolGroupID: 2,\n\t\t\t\tsource: 'district',\n\t\t\t\tuid:'2',\n\t\t\t});\n\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(rows);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\tpreloadedImportCsvStatus(acctNumber: string, req: PreloadedWorkerStatus): Observable {\n\t\tlet ws: PreloadedWorkerStatusReply = {\n\t\t\terror: '',\n\t\t\timportedRows: 1,\n\t\t\ttotalFileRows: 1,\n\t\t\tfilePath: '',\n\t\t\tdone: true,\n\t\t\tlastSequenceId: 0,\n\t\t}\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(ws);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\tpreloadedExportCsvStatus(acctNumber: string, req: PreloadedWorkerStatus): Observable {\n\t\tlet ws: PreloadedWorkerStatusReply = {\n\t\t\terror: '',\n\t\t\timportedRows: 1,\n\t\t\ttotalFileRows: 1,\n\t\t\tfilePath: '',\n\t\t\tdone: true,\n\t\t\tlastSequenceId: 0,\n\t\t}\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(ws);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\t//SchoolGroup\n\tschoolGroupAddApi(acctnumber: string, req: SchoolGroup): Observable {\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(req);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\tschoolGroupFindApi(req: SchoolGroupFind): Observable {\n\t\tlet rows: SchoolGroup[] = [];\n\t\trows.push({\n\t\t\tschoolGroupID: 1,\n\t\t\tname: 'Group 1',\n\t\t\taccounts: [{ acctNumber: -1471032103, organizationName: 'school 1' }, { acctNumber: -2104, organizationName: 'school 2' }],\n\t\t\tdistrictAcctNumber: -1471032103,\n\t\t\tcreatedAt: new Date(),\n\t\t\tupdatedAt: new Date(),\n\t\t}, {\n\t\t\t\tschoolGroupID: 2,\n\t\t\t\tname: 'Group 2',\n\t\t\t\taccounts: [{ acctNumber: -1471032104, organizationName: 'school 2' }, { acctNumber: 1235, organizationName: 'school 3' }],\n\t\t\t\tdistrictAcctNumber: -1471032103,\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t},{\n\t\t\t\tschoolGroupID: 3,\n\t\t\t\tname: 'All',\n\t\t\t\taccounts: [{ acctNumber: -1471032104, organizationName: 'school 2' }, { acctNumber: 1235, organizationName: 'school 3' }],\n\t\t\t\tdistrictAcctNumber: -1471032103,\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t});\n\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(rows);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\tschoolGroupFindAccountsV2Api(req: SchoolGroupFind): Observable {\n\t\tlet rows: RootSchoolGroupAccountV2[] = [];\n\t\trows.push({\n\t\t\tschoolGroupID: 1,\n\t\t\tschoolGroupName: 'Group 1',\n\t\t\tacctNumber: -1471032102,\n\t\t\torganizationName: 'school 1',\n\t\t\tdistrictAcctNumber: -1471032103,\n\t\t\tcreatedAt: new Date(),\n\t\t\tupdatedAt: new Date(),\n\t\t}, {\n\t\t\tschoolGroupID: 1,\n\t\t\tschoolGroupName: 'Group 1',\n\t\t\tacctNumber: -1471032103,\n\t\t\torganizationName: 'school 2',\n\t\t\tdistrictAcctNumber: -1471032103,\n\t\t\tcreatedAt: new Date(),\n\t\t\tupdatedAt: new Date(),\n\t\t\t},{\n\t\t\t\tschoolGroupID: 1,\n\t\t\tschoolGroupName: 'Group 1',\n\t\t\tacctNumber: -1471032104,\n\t\t\torganizationName: 'school 3',\n\t\t\tdistrictAcctNumber: -1471032103,\n\t\t\tcreatedAt: new Date(),\n\t\t\tupdatedAt: new Date(),\n\t\t\t});\n\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(rows);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\tschoolGroupUpdateApi(acctNumber: string, req: SchoolGroup): Observable {\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(req);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\tschoolGroupRemoveApi(acctnumber: string, req: SchoolGroup): Observable {\n\t\tlet rows: SchoolGroupReturn = {\n\t\t\tid: 1,\n\t\t}\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(rows);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\tschoolGroupFindCountApi(acctNumber: string, req: SchoolGroupFind): Observable {\n\t\tlet rows: SchoolGroupCount = {\n\t\t\tcount: 1,\n\t\t}\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(rows);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\tschoolGroupFindAccountsV2DistinctApi(req: SchoolGroupFind): Observable {\n\t\tlet rows: RootSchoolGroupAccountDistinctV2[] = [];\n\t\trows.push({\n\t\t\taccounts: [{organizationName:'school 1',acctNumber:1471032101},{organizationName:'school 2',acctNumber:1471032102}],\n\t\t\tname: 'Group 1',\n\t\t\tschoolGroupId: 1,\n\t\t}, {\n\t\t\taccounts: [{organizationName:'school 3',acctNumber:1471032103},{organizationName:'school 4',acctNumber:1471032104},{organizationName:'school 4',acctNumber:1471032104}],\n\t\t\tname: 'Group 2',\n\t\t\tschoolGroupId: 2,\n\t\t\t},{\n\t\t\taccounts: [{organizationName:'school 1',acctNumber:1471032101},{organizationName:'school 2',acctNumber:1471032102},{organizationName:'school 3',acctNumber:1471032103},{organizationName:'school 4',acctNumber:1471032104},{organizationName:'school 4',acctNumber:1471032104}],\n\t\t\tname: 'all',\n\t\t\tschoolGroupId: 3,\n\t\t\t});\n\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(rows);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\tbadgeAddApi(acctNumber: string, req: Badge): Observable{\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(req);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\tbadgeUpdateApi(acctNumber: string, req:Badge): Observable{\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(req);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\tbadgeFindApi(req: FindBadge): Observable {\n\t\tlet rows: Badge[] = [];\n\t\trows.push({\n\t\t\tid: 0,\n\t\t\tbadgeNumber: 0,\n\t\t\tbadgeName: \"Visitor\",\n\t\t\tacctNumber: -1471032103,\n\t\t\tschoolGroupID: 0,\n\t\t\tschoolGroupName: '',\n\t\t\tcreatedAt: new Date(),\n\t\t\tchangedAt: new Date(),\n\t\t}, {\n\t\t\tid: 1,\n\t\t\tbadgeNumber: 1,\n\t\t\tbadgeName: \"staff\",\n\t\t\tacctNumber: -1471032103,\n\t\t\tschoolGroupID: 0,\n\t\t\tschoolGroupName: '',\n\t\t\tcreatedAt: new Date(),\n\t\t\tchangedAt: new Date(),\n\t\t},{\n\t\t\tid: 2,\n\t\t\tbadgeNumber: 2,\n\t\t\tbadgeName: \"volunter\",\n\t\t\tacctNumber: -1471032103,\n\t\t\tschoolGroupID: 0,\n\t\t\tschoolGroupName: '',\n\t\t\tcreatedAt: new Date(),\n\t\t\tchangedAt: new Date('0001-01-01T00:00:00Z'),\n\t\t});\n\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(rows);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\tbadgeFindCountApi(acctNumber: string, req: FindBadge): Observable {\n\t\tlet rows: BadgeCount = {\n\t\t\tcount: 3,\n\t\t}\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(rows);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\tbadgeDeleteApi(acctnumber: string, id: number): Observable {\n\t\tlet rows: BadgeReply = {\n\t\t\tid: 1,\n\t\t}\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(rows);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\tactivityReportPdf(acctNumber: string, req: ActivityReportPDFRequest): Observable {\n\t\tlet rows: ActivityReportPDF = new ActivityReportPDF();\n\t\trows.downloadUrls = ['https://www.imf.org/external/pubs/ft/weo/2016/01/pdf/text.pdf'];\n\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(rows);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\tactivityReportCsv(acctNumber: string, req: ActivityReportCSVRequest): Observable {\n\t\tvar row: ActivityReportCSV = new ActivityReportCSV();\n\n\t\trow.downloadUrls = ['http://viewportsizes.com/devices.csv'];\n\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(row);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\tcountActivityReportApi(acctNumber: string, req: FindActivityReport): Observable {\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(2);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\tactivityReportApi(acctNumber: string, req: FindActivityReport): Observable {\n\t\tlet rows: ActivityReportRow[] = [];\n\n\t\trows.push({\n\t\t\tid: 'id1',\n\t\t\tname: 'ben lastname',\n\t\t\tbadgeName: 'test',\n\t\t\tloginTime: new Date(),\n\t\t\tlogoutTime: new Date(),\n\t\t\tadditionalInfo1: 'Additional Info1',\n\t\t\tadditionalInfo2: 'Additional Info2',\n\t\t\tadditionalInfo3: 'Additional Info3',\n\t\t\tadditionalInfo4: 'Additional Info4',\n\t\t\tloginLocationId: 'Additional Info5',\n\t\t\tlogoutLocationId: 'Additional Info6',\n\t\t\timages: [{\n\t\t\t\timgType: 'photoId',\n\t\t\t\tlink: 'https://cdn0.iconfinder.com/data/icons/PRACTIKA/256/user.png'\n\t\t\t}, {\n\t\t\t\timgType: 'photoId',\n\t\t\t\tlink: 'http://www.hit4hit.org/img/login/user-icon-6.png'\n\t\t\t}],\n\t\t\timageIndex: 0,\n\t\t\tbadgeId: 1,\n\t\t\tstationName: 'station1',\n\t\t\tschoolName: 'School Name School Name ',\n\t\t\tdataSource: {\n\t\t\t\trfidUser: {\n\t\t\t\t\tcardId: '',\n\t\t\t\t\tfield1: '',\n\t\t\t\t\tfield2: '',\n\t\t\t\t},\n\t\t\t\tpreloaded: {\n\t\t\t\t\tfield1: '',\n\t\t\t\t\tfield2: '',\n\t\t\t\t},\n\t\t\t\tstudent: {\n\t\t\t\t\tsisStudentId:'test',\n\t\t\t\t\tstudentId:'123',\n\t\t\t\t\tfield1:'ff1',\n\t\t\t\t\tfield2:'ff2',\n\t\t\t\t},\n\t\t\t\tstudentContact: {\n\t\t\t\t\tcardId: '',\n\t\t\t\t\tname: '',\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\t{\n\t\t\t\tid: 'id2',\n\t\t\t\tname: 'ben lastname2',\n\t\t\t\tbadgeName: 'test2',\n\t\t\t\tloginTime: new Date(),\n\t\t\t\tlogoutTime: new Date(),\n\t\t\t\tadditionalInfo1: 'Additional Info1',\n\t\t\t\tadditionalInfo2: 'Additional Info2',\n\t\t\t\tadditionalInfo3: 'Additional Info3',\n\t\t\t\tadditionalInfo4: 'Additional Info4',\n\t\t\t\tloginLocationId: 'Additional Info5',\n\t\t\t\tlogoutLocationId: 'Additional Info6',\n\t\t\t\timages: [],\n\t\t\t\timageIndex: 0,\n\t\t\t\tbadgeId: 2,\n\t\t\t\tstationName: 'station2',\n\t\t\t\tschoolName: 'School Name 2',\n\t\t\t\tdataSource: {\n\t\t\t\t\trfidUser: {\n\t\t\t\t\t\tcardId: '',\n\t\t\t\t\t\tfield1: '',\n\t\t\t\t\t\tfield2: '',\n\t\t\t\t\t},\n\t\t\t\t\tpreloaded: {\n\t\t\t\t\t\tfield1: '',\n\t\t\t\t\t\tfield2: '',\n\t\t\t\t\t},\n\t\t\t\t\tstudent: {\n\t\t\t\t\t\tsisStudentId:'',\n\t\t\t\t\t\tstudentId:'',\n\t\t\t\t\t\tfield1:'',\n\t\t\t\t\t\tfield2:'',\n\t\t\t\t\t},\n\t\t\t\t\tstudentContact: {\n\t\t\t\t\t\tcardId: '',\n\t\t\t\t\t\tname: '',\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'id3',\n\t\t\t\tname: 'ben lastname2',\n\t\t\t\tbadgeName: 'test2',\n\t\t\t\tloginTime: new Date(),\n\t\t\t\tlogoutTime: new Date(),\n\t\t\t\tadditionalInfo1: 'Additional Info1',\n\t\t\t\tadditionalInfo2: 'Additional Info2',\n\t\t\t\tadditionalInfo3: 'Additional Info3',\n\t\t\t\tadditionalInfo4: 'Additional Info4',\n\t\t\t\tloginLocationId: 'Additional Info5',\n\t\t\t\tlogoutLocationId: 'Additional Info6',\n\t\t\t\timages: [],\n\t\t\t\timageIndex: 0,\n\t\t\t\tbadgeId: 3,\n\t\t\t\tstationName: 'station3',\n\t\t\t\tschoolName: 'School Name 3',\n\t\t\t\tdataSource: {\n\t\t\t\t\trfidUser: {\n\t\t\t\t\t\tcardId: '',\n\t\t\t\t\t\tfield1: '',\n\t\t\t\t\t\tfield2: '',\n\t\t\t\t\t},\n\t\t\t\t\tpreloaded: {\n\t\t\t\t\t\tfield1: '',\n\t\t\t\t\t\tfield2: '',\n\t\t\t\t\t},\n\t\t\t\t\tstudent: {\n\t\t\t\t\t\tsisStudentId:'',\n\t\t\t\t\t\tstudentId:'',\n\t\t\t\t\t\tfield1:'',\n\t\t\t\t\t\tfield2:'',\n\t\t\t\t\t},\n\t\t\t\t\tstudentContact: {\n\t\t\t\t\t\tcardId: '',\n\t\t\t\t\t\tname: '',\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'id4',\n\t\t\t\tname: 'ben lastname2',\n\t\t\t\tbadgeName: 'test2',\n\t\t\t\tloginTime: new Date(),\n\t\t\t\tlogoutTime: new Date(),\n\t\t\t\tadditionalInfo1: 'Additional Info1',\n\t\t\t\tadditionalInfo2: 'Additional Info2',\n\t\t\t\tadditionalInfo3: 'Additional Info3',\n\t\t\t\tadditionalInfo4: 'Additional Info4',\n\t\t\t\tloginLocationId: 'Additional Info5',\n\t\t\t\tlogoutLocationId: 'Additional Info6',\n\t\t\t\timages: [],\n\t\t\t\timageIndex: 0,\n\t\t\t\tbadgeId: 4,\n\t\t\t\tstationName: 'station4',\n\t\t\t\tschoolName: 'School Name 4',\n\t\t\t\tdataSource: {\n\t\t\t\t\trfidUser: {\n\t\t\t\t\t\tcardId: '',\n\t\t\t\t\t\tfield1: '',\n\t\t\t\t\t\tfield2: '',\n\t\t\t\t\t},\n\t\t\t\t\tpreloaded: {\n\t\t\t\t\t\tfield1: '',\n\t\t\t\t\t\tfield2: '',\n\t\t\t\t\t},\n\t\t\t\t\tstudent: {\n\t\t\t\t\t\tsisStudentId:'',\n\t\t\t\t\t\tstudentId:'',\n\t\t\t\t\t\tfield1:'',\n\t\t\t\t\t\tfield2:'',\n\t\t\t\t\t},\n\t\t\t\t\tstudentContact: {\n\t\t\t\t\t\tcardId: '',\n\t\t\t\t\t\tname: '',\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(rows);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n\tactivityReportExportCSVStatus(acctNumber: string, req: ActivityReportExportCSVStatusRequest): Observable {\n\t\tlet ws: ActivityReportExportCSVWorkerStatusReply = {\n\t\t\terror: '',\n\t\t\timportedRows: 1,\n\t\t\ttotalFileRows: 1,\n\t\t\tfilePath: '',\n\t\t\tdone: true,\n\t\t\tlastSequenceId: 0,\n\t\t}\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(ws);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\tactivityReportExportPDFStatus(acctNumber: string, req: ActivityReportExportPDFStatusRequest): Observable {\n\t\tlet ws: ActivityReportExportPDFWorkerStatusReply = {\n\t\t\terror: '',\n\t\t\timportedRows: 1,\n\t\t\ttotalFileRows: 1,\n\t\t\tfilePath: '',\n\t\t\tdone: true,\n\t\t\tlastSequenceId: 0,\n\t\t}\n\t\treturn Observable.create((observer: Observer) => {\n\t\t\tobserver.next(ws);\n\t\t\tobserver.complete();\n\t\t});\n\t}\n\n}\n\n\n\n\n\n\n","\nimport { throwError as observableThrowError, Observable, Observer } from 'rxjs';\nimport 'rxjs/add/operator/map';\nimport 'rxjs/add/operator/catch';\nimport 'rxjs/add/observable/throw';\n\nimport { Injectable, Injector } from '@angular/core';\nimport { Http, Headers, Response } from '@angular/http';\nimport { Account } from './account.service';\nimport { Config } from './config';\nimport { UserRoles } from './user_roles';\nimport { DistrictUser } from './district_user';\nimport { InviteUser } from './invite_district_user';\nimport { SubscriptionResponse } from \"./subscription\";\n\nimport { SubscriptionRegistrationURL } from './subscription_registration_url';\nimport { HttpService } from './http.service';\nimport { OAuthToken } from './oauth-token';\nimport { OAuthTokenRequest } from './oauth-token-request';\nimport { Token } from './token';\n\nimport { environment } from \"../environments/environment\";\nimport { DistrictServiceMoc } from \"./district.service.moc\";\nimport { AssociateAccount } from './settings/account_association';\nimport { AssociateAccountBatch } from './settings/account_association_batch';\nimport { AccountAssociationCount } from './settings/account_association_count';\nimport { AccountAssociationReturn } from './settings/account_association_return';\n\nimport { NoGoEnhance } from './settings/nogo-enhance';\nimport { NoGoEnhanceTextSearch } from './settings/nogo-enhance-text-search';\nimport { NoGoEnhanceRequest } from './settings/nogo-enhance-request';\nimport { NoGoEnhanceReply } from './settings/nogo-enhance-reply';\nimport { NoGoEnhanceExportCSVReply } from './settings/nogo-enhance-export-csv-reply';\nimport { NoGoEnhanceCount } from './settings/nogo-enhance-count';\nimport { NoGoEnhanceFind } from './settings/nogo-enhance-find';\nimport { NoGoEnhanceExportCSV } from './settings/nogo-enhance-export-csv';\nimport { NoGoEnhanceFileReply } from './settings/nogo-enhance-file-reply';\nimport { NoGoEnhanceWorkerStatus } from \"./settings/nogo-enhance-worker-status-request\";\nimport { NoGoEnhanceWorkerStatusReply } from \"./settings/nogo-enhance-worker-status\";\n\nimport { RfidUsersExportCSVReply } from './settings/rfid_users_export_csv_reply';\nimport { RfidUsersExport } from './settings/rfid_users_export';\nimport { RfidUsersReply } from './settings/rfid_users_reply';\nimport { RfidUsersTextSearch } from './settings/rfid_users_text_search';\nimport { RfidUsers } from './settings/rfid_users';\nimport { RfidUsersCount } from './settings/rfid_users_count';\nimport { RfidUsersFind } from './settings/rfid_users_find';\nimport { RfidUsersRequest } from './settings/rfid_users_request';\nimport { RfidUserListWorkerStatus } from './settings/rfid_users_worker_request';\nimport { RfidUserListWorkerStatusReply } from './settings/rfid_users_worker_status';\n\nimport { Preloaded } from './settings/preloaded';\nimport { PreloadedTextSearch } from './settings/preloaded_text_search';\nimport { PreloadedRequest } from './settings/preloaded_request';\nimport { PreloadedReply } from './settings/preloaded_reply';\nimport { PreloadedExportCSVReply } from './settings/preloaded_export_csv_reply';\nimport { PreloadedCount } from './settings/preloaded_count';\nimport { PreloadedFind } from \"./settings/preloaded_find\";\nimport { PreloadedExport } from \"./settings/preloaded_export\";\nimport { FindPreloadedCategory } from './settings/find_preloaded_category';\nimport { PreloadedCategory } from './settings/preloaded_category';\nimport { PreloadedCategoryTextSearch } from './settings/preloaded_category_text_search';\nimport { PreloadedCategoryRequest } from './settings/preloaded_category_request';\nimport { PreloadedCategoryReply } from './settings/preloaded_category_reply';\nimport { PreloadedCategoryExportCSVReply } from './settings/preloaded_category_export_csv_reply';\nimport { PreloadedCategoryCount } from './settings/preloaded_category_count';\nimport { PreloadedCategoryFind } from './settings/preloaded_category_find';\nimport { PreloadedCategoryExport } from \"./settings/preloaded_category_export\";\nimport { PreloadedWorkerStatus } from \"./settings/preloaded_worker_status_request\";\nimport { PreloadedWorkerStatusReply } from \"./settings/preloaded_worker_status\";\nimport { PreloadedCategoryWorkerStatus } from \"./settings/preloaded_category_worker_status_request\";\nimport { PreloadedCategoryWorkerStatusReply } from \"./settings/preloaded_category_worker_status\";\n\nimport { SchoolGroup } from \"./settings/school_group\";\nimport { SchoolGroupFind } from \"./settings/find_school_group\";\nimport { SchoolGroupCount } from \"./settings/find_school_group_count\";\nimport { SchoolGroupReturn } from \"./settings/school_group_return\";\n\nimport { rfc3339ToDate, isDateSet } from './date_helper';\nimport { Badge } from './settings/badge';\nimport { BadgeReply } from './settings/badge_reply';\nimport { FindBadge } from './settings/find_badge';\nimport { BadgeCount } from './settings/badge_count';\nimport { RootSchoolGroupAccountV2 } from './settings/school_group v2';\n\nimport {ActivityReportCSV} from './reports/activity_report_csv';\nimport {ActivityReportPDFRequest} from './reports/activity_report_pdf_request';\nimport {ActivityReportPDF} from './reports/activity_report_pdf';\nimport {ActivityReportCSVRequest} from './reports/activity_report_csv_request';\nimport { FindActivityReport } from './reports/find_activity_report';\nimport {ActivityReportRow} from './reports/activity_report_row';\nimport { ActivityReportExportCSVStatusRequest } from './reports/activity_report_export_csv_worker_status_request';\nimport { ActivityReportExportPDFStatusRequest } from './reports/activity_report_export_pdf_worker_status_request';\nimport { RootSchoolGroupAccountDistinctV2 } from './settings/root_school_group_account_distrinct_v2';\n\n@Injectable()\nexport class DistrictService {\n\tuserRolesKey: string = 'userRoles';\n\ttimeout: number = 10000; //10 sec\n\tretry: number = 3; //max retry\n\tdelay: number = 3000; //max delay after retry\n\terrors: any = {};\n\n\tconstructor(private http: HttpService, private account: Account, private config: Config) {\n\t\tthis.errors['default'] = 'There is an error when processing this request, please try again later.';\n\t\tthis.errors['no connection'] = 'Your device seems to be offline, please try again later.'\n\t\tthis.errors['unauthorized'] = 'Unauthorized access. Please try login again.';\n\t\tthis.errors['not found'] = 'No results.';\n\t\tthis.errors['invalid token'] = 'Unauthorized access. Please try login again.';\n\t\tthis.errors['duplicate entry'] = 'This data already exists.';\n\t\tthis.errors['bad request'] = 'Invalid request.';\n\t\tthis.errors['internal server error'] = 'Internal server error. Please try again later.';\n\t\tthis.errors['unexpected'] = 'Sorry, an unexpected error has occured. Please contact Tech Support.';\n\t\tthis.errors['timeout'] = 'Timeout when communicating with a server, please try again later.';\n\t\tthis.errors['email address is invalid'] = 'Email address is invalid.';\n\t\tthis.errors['user status is invalid'] = 'Invalid user status.';\n\t\tthis.errors['user status signup is invalid email not confirmed'] = 'The user you\\'ve invited has not yet confirmed their email address.';\n\t\tthis.errors['notification not supported'] = 'Push notifications are not supported in this browser.';\n\t\tthis.errors['account license expired'] = 'Account License has expired. Please visit the Subscription page for more details and license renewal.';\n\t\tthis.errors['invalid account license'] = 'Account License is invalid. Please visit the Subscription page for more details and license renewal.';\n\t\tthis.errors['unauthorized access role'] = 'Unauthorized access role.';\n\t\tthis.errors['invalid file version'] = 'You have selected wrong file version.';\n\t\tthis.errors['badge number is read only'] = 'Badge number is read only from 0-6';\n\t\tthis.errors['invalid file version, invalid column number'] = 'Invalid file version, invalid column number.';\n\t\tthis.errors['preloadedCategoryId is not set'] = 'Preloaded category is not selected';\n\t\tthis.errors['schoolgroup acctnumber is required'] = 'Please select a school group that has at least one school.';\n\t\tthis.errors['school name not found'] = 'Could not find any school with this name';\n\t}\n\n\tvalidateAcctNumber(acctNumber: string): Observable {\n\t\tlet lusr = this.userRoles();\n\t\tif (lusr != null && lusr.acctNumber == acctNumber) {\n\t\t\t//return non http observable when the userroles exists at localStorage\n\t\t\treturn Observable.create((observer: Observer) => {\n\t\t\t\tobserver.next(true);\n\t\t\t\tobserver.complete();\n\t\t\t});\n\t\t} else {\n\t\t\treturn this.userRolesApi().map(usr => {\n\t\t\t\tlet match = false;\n\t\t\t\tfor (var u in usr) {\n\t\t\t\t\tif (usr[u].acctNumber == acctNumber) {\n\t\t\t\t\t\tmatch = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\t\t}\n\t}\n\n\tloadUser(): Observable {\n\t\treturn this.account.getUserProfileApi()\n\t\t\t.do(us => {\n\t\t\t\tthis.account.setUser(us);\n\t\t\t})\n\t\t\t.mergeMap(() => {\n\t\t\t\treturn this.userRolesApi()\n\t\t\t\t\t.map(urs => {\n\t\t\t\t\t\tthis.setUserRoles(urs[0]);\n\t\t\t\t\t\treturn urs[0]\n\t\t\t\t\t});\n\t\t\t});\n\t}\n\n\tremoveLocalStorage() {\n\t\tlocalStorage.removeItem(this.userRolesKey);\n\t}\n\n\t// reason why we changed from storing to memory to storing on localStorage\n\t// is because users are refreshing the page and they lost the school they have selected\n\t// refresh page is taking the default school not the one they have selected from the list\n\tsetUserRoles(us: UserRoles) {\n\t\tlocalStorage.setItem(this.userRolesKey, JSON.stringify(us));\n\t}\n\n\tuserRoles() {\n\t\tif (localStorage.getItem(this.userRolesKey) === null) {\n\t\t\treturn null\n\t\t}\n\t\treturn JSON.parse(localStorage.getItem(this.userRolesKey));\n\t}\n\n\tcontainsUserRole(ur: UserRoles, role: string): boolean {\n\t\tfor (var r in ur.roles) {\n\t\t\tif (ur.roles[r] == role) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tgetToken() {\n\t\tlet t = this.account.getToken();\n\t\tif (!t) {\n\t\t\tt = new Token();\n\t\t}\n\t\treturn t;\n\t}\n\n\tgetError(err: any): Error {\n\t\tvar er: any;\n\t\tvar msg = 'no connection';\n\t\tif (typeof (err.json) === 'function') {\n\t\t\ter = err.json();\n\t\t\tif (er.message != null && er.message != null && er.message != '') {\n\t\t\t\tmsg = er.message;\n\t\t\t} else if (er.error != null && er.error != null && er.error != '') {\n\t\t\t\tmsg = er.error;\n\t\t\t} else {\n\t\t\t\tconsole.log(err);\n\t\t\t}\n\t\t\treturn new Error(msg);\n\t\t} else if (err instanceof Error) {\n\t\t\treturn err;\n\t\t} else {\n\t\t\tconsole.log(err);\n\t\t}\n\t}\n\n\tgetUserError(err: Error): string {\n\t\treturn this.errors[err.message];\n\t}\n\n\tisErrNotFound(err: Error): boolean {\n\t\treturn err.message == 'not found';\n\t}\n\n\tisErrUnauthorized(err: Error): boolean {\n\t\treturn err.message == 'unauthorized' ||\n\t\t\terr.message == 'unauthorized access role';\n\t}\n\n\tgetUserErrorDefault(err: Error): string {\n\t\tlet e = this.errors[err.message];\n\t\tif (e != null) {\n\t\t\treturn e;\n\t\t}\n\t\treturn this.errors['default'];\n\t}\n\n\tbuildUrl(parameters) {\n\t\tvar qs = \"\";\n\t\tfor (var key in parameters) {\n\t\t\tvar value = parameters[key];\n\t\t\tif (value != null && value != '') {\n\t\t\t\tqs += encodeURIComponent(key) + \"=\" + encodeURIComponent(value) + \"&\";\n\t\t\t}\n\t\t}\n\t\tif (qs.length > 0) {\n\t\t\treturn qs.substring(0, qs.length - 1); //chop off last \"&\"\n\t\t}\n\t\treturn '';\n\t}\n\n\tparams(parameters) {\n\t\tvar params: any = {}\n\t\tfor (var key in parameters) {\n\t\t\tvar value = parameters[key];\n\t\t\tif (value != null && value != '') {\n\t\t\t\tparams[encodeURIComponent(key)] = encodeURIComponent(value);\n\t\t\t}\n\t\t}\n\t\treturn params;\n\t}\n\n\tleftPad(val: string, size: number, ch: string): string {\n\t\tvar result = String(val);\n\t\tif (!ch) {\n\t\t\tch = \" \";\n\t\t}\n\t\twhile (result.length < size) {\n\t\t\tresult = ch + result;\n\t\t}\n\t\treturn result;\n\t}\n\thexToInt(hex) {\n\t\tif (hex.length % 2 != 0) {\n\t\t\thex = \"0\" + hex;\n\t\t}\n\t\tvar num = parseInt(hex, 16);\n\t\tvar maxVal = Math.pow(2, hex.length / 2 * 8);\n\t\tif (num > maxVal / 2 - 1) {\n\t\t\tnum = num - maxVal\n\t\t}\n\t\treturn num;\n\t}\n\n\thexAcctNumber(num: number): string {\n\t\t//sign >>> is Zero-fill right shift\n\t\treturn this.leftPad((num >>> 0).toString(16), 8, '0').toUpperCase();\n\t}\n\n\t// APIs\n\tuserRolesApi(): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.get(this.config.districtApiUrl + '/districts/user/roles', { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.retryWhen(error => this.httpRetry(error))\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\tvar data = resp.json().list;\n\t\t\t\t\tvar urs: UserRoles[] = [];\n\t\t\t\t\tfor (var v in data) {\n\t\t\t\t\t\turs.push({\n\t\t\t\t\t\t\tacctNumber: this.hexAcctNumber(data[v].acctNumber),\n\t\t\t\t\t\t\tschoolName: data[v].schoolName,\n\t\t\t\t\t\t\tisDefault: data[v].isDefault,\n\t\t\t\t\t\t\troles: data[v].roles,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn urs\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn observableThrowError(er);\n\t\t\t});\n\t}\n\n\tsetDefaultApi(req: UserRoles): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\tvar acctNumber = req.acctNumber;\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.put(this.config.districtApiUrl + '/districts/' + acctNumber + '/user/role/default', req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.retryWhen(error => this.httpRetry(error))\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn true;\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn observableThrowError(er);\n\t\t\t});\n\t}\n\n\tupdateDistrictUserApi(acctNumber: string, req: DistrictUser): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\tlet rq = JSON.stringify({ roles: req.roles });\n\t\treturn this.http.put(this.config.districtApiUrl + '/districts/' + acctNumber + '/user/' + req.userId + '/role', rq, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn true;\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn observableThrowError(er);\n\t\t\t});\n\t}\n\n\tdistrictUsersApi(acctNumber: string): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\tvar params: any = {};\n\t\treturn this.http.get(this.config.districtApiUrl + '/districts/' + acctNumber + '/users', { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tvar rows: DistrictUser[] = [];\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\tvar data = resp.json().list;\n\t\t\t\t\tfor (var i in data) {\n\t\t\t\t\t\tlet row = new DistrictUser();\n\t\t\t\t\t\trow.userId = data[i].userId;\n\t\t\t\t\t\trow.firstName = data[i].firstName;\n\t\t\t\t\t\trow.lastName = data[i].lastName;\n\t\t\t\t\t\trow.email = data[i].email;\n\t\t\t\t\t\trow.status = data[i].status;\n\t\t\t\t\t\trow.owner = data[i].owner;\n\t\t\t\t\t\tif (data[i].roles.length > 0) {\n\t\t\t\t\t\t\tfor (var j in data[i].roles) {\n\t\t\t\t\t\t\t\trow.roles.push(data[i].roles[j]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\trows.push(row)\n\t\t\t\t\t}\n\t\t\t\t\treturn rows\n\t\t\t\t} else if (resp.status == 404) {\n\t\t\t\t\tconsole.log('404');\n\t\t\t\t\treturn rows;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn observableThrowError(er);\n\t\t\t});\n\t}\n\n\tinviteDistrictUserApi(acctNumber: string, req: InviteUser): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\tlet rq = JSON.stringify({ email: req.email });\n\t\treturn this.http.post(this.config.districtApiUrl + '/districts/' + acctNumber + '/user/invite', rq, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\tvar data = resp.json()\n\t\t\t\t\tlet row = new DistrictUser();\n\t\t\t\t\trow.userId = data.userId;\n\t\t\t\t\trow.firstName = data.firstName;\n\t\t\t\t\trow.lastName = data.lastName;\n\t\t\t\t\trow.email = data.email;\n\t\t\t\t\trow.status = data.status;\n\t\t\t\t\trow.roles = data.roles;\n\t\t\t\t\trow.owner = data.owner;\n\n\t\t\t\t\treturn row;\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn observableThrowError(er);\n\t\t\t});\n\t}\n\n\tremoveDistrictUserApi(acctNumber: string, req: DistrictUser): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.delete(this.config.districtApiUrl + '/districts/' + acctNumber + '/user/' + req.userId + '/role', { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn true;\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn observableThrowError(er);\n\t\t\t});\n\t}\n\n\tsubscriptionApi(acctNumber: string): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.get(this.config.districtApiUrl + '/districts/' + acctNumber + '/subscription', { headers: headers })\n\t\t\t.timeout(this.timeout * 10)\n\t\t\t.map(resp => {\n\t\t\t\tvar row: SubscriptionResponse = new SubscriptionResponse();\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\trow = resp.json();\n\t\t\t\t\trow.accountlicense.expirationDateValue = new Date(row.accountlicense.expirationDate);\n\t\t\t\t\trow.eregCustomerProfile.creationDateValue = new Date(row.eregCustomerProfile.creationDate);\n\t\t\t\t\treturn row\n\t\t\t\t} else if (resp.status == 404) {\n\t\t\t\t\tconsole.log('404');\n\t\t\t\t\treturn row;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn observableThrowError(er);\n\t\t\t});\n\t}\n\n\tsubscriptionRegistrationUrlApi(acctNumber: string): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(this.config.districtApiUrl + '/district/' + acctNumber + '/subscription/registration-url', { headers: headers })\n\t\t\t.timeout(this.timeout * 10)\n\t\t\t.map(resp => {\n\t\t\t\tvar row: SubscriptionRegistrationURL = new SubscriptionRegistrationURL();\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\trow = resp.json();\n\t\t\t\t\treturn row\n\t\t\t\t} else if (resp.status == 404) {\n\t\t\t\t\tconsole.log('404');\n\t\t\t\t\treturn row;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn observableThrowError(er);\n\t\t\t});\n\t}\n\n\tisErrDuplicateEntry(err: Error): boolean {\n\t\treturn err.message == 'duplicate entry';\n\t}\n\n\tisErrNoConnection(err: Error): boolean {\n\t\treturn err.message == 'no connection';\n\t}\n\n\tisErrAccountLicenseExpired(err: Error): boolean {\n\t\treturn err.message == 'account license expired';\n\t}\n\n\tisErrAccountLicenseInvalid(err: Error): boolean {\n\t\treturn err.message == 'invalid account license';\n\t}\n\n\tgetDefaultSaveMessage(): string {\n\t\treturn \"Successfully​ Saved\";\n\t}\n\n\toauthTokenApi(req: OAuthTokenRequest): Observable {\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\tlet rq = JSON.stringify(req);\n\n\t\t// true at the end means skipping the http interception\n\t\treturn this.http.post(`${this.config.districtApiUrl}/oauth2/token`, rq, { headers: headers }, true)\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn observableThrowError(er);\n\t\t\t});\n\t}\n\n\t//Account Association API\n\taccountAssociationFindApi(parentacctNumber: string): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.get(this.config.districtApiUrl + '/districts/' + parentacctNumber + '/account-association/find', { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tvar rows: AssociateAccount[] = [];\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\tvar data = resp.json().list;\n\t\t\t\t\tfor (var i in data) {\n\t\t\t\t\t\tlet row = new AssociateAccount();\n\t\t\t\t\t\trow.acctNumber = data[i].acctNumber;\n\t\t\t\t\t\trow.parentAccountNumber = data[i].parentAccountNumber;\n\t\t\t\t\t\trow.organizationName = data[i].organizationName;\n\t\t\t\t\t\trow.state = data[i].state;\n\t\t\t\t\t\trow.zipCode = data[i].zipCode;\n\t\t\t\t\t\trow.enabled = data[i].enabled;\n\t\t\t\t\t\trow.joinedAt = new Date(data[i].joinedAt);\n\t\t\t\t\t\trows.push(row)\n\t\t\t\t\t}\n\t\t\t\t\treturn rows\n\t\t\t\t} else if (resp.status == 404) {\n\t\t\t\t\tconsole.log('404');\n\t\t\t\t\treturn rows;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn observableThrowError(er);\n\t\t\t});\n\t}\n\n\taccountAssociationAssociateApi(acctNumber: string, req: AssociateAccountBatch): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(this.config.districtApiUrl + '/districts/' + acctNumber + '/account-association/associate', req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\tvar ret = resp.json();\n\t\t\t\t\treturn ret.status;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn observableThrowError(er);\n\t\t\t});\n\t}\n\n\taccountAssociationCountApi(acctNumber: string): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.get(this.config.districtApiUrl + '/districts/' + acctNumber + '/account-association/count', { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\tvar number = resp.json();\n\t\t\t\t\treturn number;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn observableThrowError(er);\n\t\t\t});\n\t}\n\n\t// NoGo enhance API\n\tnoGoEnhanceExportCsvApi(acctNumber: string, req: NoGoEnhanceExportCSV): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/nogo-enhance/export/csv`, req, { headers: headers })\n\t\t\t.timeout(30000)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t\t// return observableThrowError();\n\t\t\t});\n\t}\n\tnoGoEnhanceFileDownloadJsonUrl(acctNumber: string, jsonUrl: string): Observable {\n\t\treturn this.http.get(jsonUrl)\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\tlet data = resp.json();\n\t\t\t\t\treturn data.url;\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tnoGoEnhanceSearchApi(acctNumber: string, req: NoGoEnhanceTextSearch): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\tlet rq = JSON.stringify(req);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/nogo-enhance/search`, rq, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\tlet rows = resp.json().list;\n\t\t\t\t\tfor (let r of rows) {\n\t\t\t\t\t\tr.dateOfBirth = rfc3339ToDate(r.dateOfBirth);\n\t\t\t\t\t\tif (!isDateSet(r.dateOfBirth)) {\n\t\t\t\t\t\t\tr.dateOfBirth = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn rows;\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tnoGoEnhanceSearchCountApi(acctNumber: string, req: NoGoEnhanceTextSearch): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\tlet rq = JSON.stringify(req);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/nogo-enhance/search/count`, rq, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tnoGoEnhanceAddApi(acctNumber: string, req: NoGoEnhanceRequest): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\tif (isDateSet(req.dateOfBirth)) {\n\t\t\treq.dateOfBirth = new Date(Date.UTC(req.dateOfBirth.getFullYear(), req.dateOfBirth.getMonth(), req.dateOfBirth.getDate(), 0, 0, 0, 0));\n\t\t}\n\t\tlet rq = JSON.stringify(req);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/nogo-enhance`, rq, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tnoGoEnhanceUpdateApi(acctNumber: string, id: number, req: NoGoEnhanceRequest): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\tif (isDateSet(req.dateOfBirth)) {\n\t\t\treq.dateOfBirth = new Date(Date.UTC(req.dateOfBirth.getFullYear(), req.dateOfBirth.getMonth(), req.dateOfBirth.getDate(), 0, 0, 0, 0));\n\t\t}\n\t\tlet rq = JSON.stringify(req);\n\t\treturn this.http.put(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/nogo-enhance/${id}`, rq, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tnoGoEnhanceRemoveApi(acctNumber: string, id: number): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.delete(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/nogo-enhance/${id}`, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tnoGoEnhanceRemoveAllApi(acctNumber: string, req: NoGoEnhanceTextSearch): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\tlet rq = JSON.stringify(req);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/nogo-enhance/remove-all`, rq, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status != 200) {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tnoGoEnhanceImportCsvUrl(acctNumber: string): string {\n\t\treturn `${this.config.districtApiUrl}/districts/${acctNumber}/settings/nogo-enhance/import/csv`\n\t}\n\n\tnoGoEnhanceFindApi(acctNumber: string, req: NoGoEnhanceFind): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\tlet rq = JSON.stringify(req);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/nogo-enhance/find`, rq, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\tlet rows = resp.json().list;\n\t\t\t\t\tfor (let r of rows) {\n\t\t\t\t\t\tr.dateOfBirth = rfc3339ToDate(r.dateOfBirth);\n\t\t\t\t\t\tif (!isDateSet(r.dateOfBirth)) {\n\t\t\t\t\t\t\tr.dateOfBirth = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn rows;\n\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tnoGoEnhanceFileUploadUrl(acctNumber: string): string {\n\t\treturn `${this.config.districtApiUrl}/districts/${acctNumber}/settings/nogo-enhance/file/upload`\n\t}\n\n\tnoGoEnhanceFileRemoveApi(acctNumber: string, id: number): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.delete(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/nogo-enhance/file/${id}`, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\tnoGoEnhanceImportCsvStatus(acctNumber: string, req: NoGoEnhanceWorkerStatus): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/nogo-enhance/import/csv/status`, req, { headers: headers })\n\t\t\t.timeout(30000)\n\t\t\t.retryWhen(error => this.httpRetry(error))\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tnoGoEnhanceExportCsvStatus(acctNumber: string, req: NoGoEnhanceWorkerStatus): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/nogo-enhance/export/csv/status`, req, { headers: headers })\n\t\t\t.timeout(30000)\n\t\t\t.retryWhen(error => this.httpRetry(error))\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\t// RFID User List API\n\trfidUsersExportCsvApi(acctNumber: string, req: RfidUsersExport): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\t// let rq = JSON.stringify(req);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/rfid-user-list/export/csv`, req, { headers: headers })\n\t\t\t.timeout(30000)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\trfidUsersImportCsvUrl(acctNumber: string): string {\n\t\treturn `${this.config.districtApiUrl}/districts/${acctNumber}/settings/rfid-user-list/import/csv`\n\t}\n\n\trfidUsersRemoveApi(acctNumber: string, id: number): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.delete(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/rfid-user-list/remove/${id}`, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\trfidUsersSearchApi(acctNumber: string, req: RfidUsersTextSearch): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/rfid-user-list/search`, req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json().list;\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\trfidUsersSearchCountApi(acctNumber: string, req: RfidUsersTextSearch): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\t// let rq = JSON.stringify(req);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/rfid-user-list/search/count`, req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\trfidUsersRemoveAllApi(acctNumber: string, req: RfidUsersTextSearch): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\t// let rq = JSON.stringify(req);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/rfid-user-list/remove-all`, req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status != 200) {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\trfidUsersFindApi(acctNumber: string, req: RfidUsersFind): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\t// let rq = JSON.stringify(req);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/rfid-user-list/find`, req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json().list;\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\trfidUsersUpdateApi(acctNumber: string, id: number, req: RfidUsersRequest): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\t// let rq = JSON.stringify(req);\n\t\treturn this.http.put(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/rfid-user-list/update/${id}`, req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\trfidUsersAddApi(acctNumber: string, req: RfidUsersRequest): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/rfid-user-list/add`, req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\trfidUsersImportCsvStatus(acctNumber: string, req: RfidUserListWorkerStatus): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/rfid-user-list/import/csv/status`, req, { headers: headers })\n\t\t\t.timeout(30000)\n\t\t\t.retryWhen(error => this.httpRetry(error))\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\trfidUsersExportCsvStatus(acctNumber: string, req: RfidUserListWorkerStatus): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\tvar params: any = {};\n\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/rfid-user-list/export/csv/status`, req, { headers: headers })\n\t\t\t.timeout(30000)\n\t\t\t.retryWhen(error => this.httpRetry(error))\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\t//preloadedCategory\n\tpreloadedCategoriesApi(acctNumber: string, req: FindPreloadedCategory): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\tvar params: any = {};\n\t\tparams['pageSize'] = req.pageSize;\n\t\tparams['page'] = req.page;\n\t\tif (req.preloadedCategoryId) {\n\t\t\tparams['preloadedCategoryId'] = req.preloadedCategoryId;\n\t\t}\n\t\tif (req.preloadedCategoryName) {\n\t\t\tparams['preloadedCategoryName'] = req.preloadedCategoryName;\n\t\t}\n\t\tlet q: string = this.buildUrl(params);\n\t\treturn this.http.get(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/preloaded-list-categories?${q}`, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.retryWhen(error => this.httpRetry(error))\n\t\t\t.map(resp => {\n\t\t\t\tvar row: PreloadedCategory[] = [];\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\trow = resp.json().list;;\n\t\t\t\t\treturn row\n\t\t\t\t} else if (resp.status == 404) {\n\t\t\t\t\tconsole.log('404');\n\t\t\t\t\treturn row;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tconsole.log('error here');\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tpreloadedCategorySearchApi(acctNumber: string, req: PreloadedCategoryTextSearch): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/preloaded-list-category/search`, req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json().list;\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tpreloadedCategorySearchCountApi(acctNumber: string, req: PreloadedCategoryTextSearch): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/preloaded-list-category/search/count`, req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tpreloadedCategoryAddApi(acctNumber: string, req: PreloadedCategoryRequest): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/preloaded-list-category`, req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tpreloadedCategoryUpdateApi(acctNumber: string, id: number, req: PreloadedCategoryRequest): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.put(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/preloaded-list-category/${id}`, req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tpreloadedCategoryRemoveApi(acctNumber: string, id: number): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.delete(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/preloaded-list-category/${id}`, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tpreloadedCategoryRemoveAllApi(acctNumber: string, req: PreloadedCategoryTextSearch): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/preloaded-list-category/remove-all`, req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status != 200) {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tpreloadedCategoryExportCsvApi(acctNumber: string, req: PreloadedCategoryExport): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/preloaded-list-category/export/csv`, req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tpreloadedCategoryImportCsvUrl(acctNumber: string): string {\n\t\treturn `${this.config.districtApiUrl}/districts/${acctNumber}/settings/preloaded-list-category/import/csv`\n\t}\n\n\tpreloadedCategoryFindApi(acctNumber: string, req: PreloadedCategoryFind): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/preloaded-list-category/find`, req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json().list;\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tpreloadedCategoryImportCsvStatus(acctNumber: string, req: PreloadedCategoryWorkerStatus): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/preloaded-list-category/import/csv/status`, req, { headers: headers })\n\t\t\t.timeout(30000)\n\t\t\t.retryWhen(error => this.httpRetry(error))\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tpreloadedCategoryExportCsvStatus(acctNumber: string, req: PreloadedCategoryWorkerStatus): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/preloaded-list-category/export/csv/status`, req, { headers: headers })\n\t\t\t.timeout(30000)\n\t\t\t.retryWhen(error => this.httpRetry(error))\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\t//Other Preloaded List\n\tpreloadedSearchApi(acctNumber: string, req: PreloadedTextSearch): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/other-preloaded-list/search`, req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json().list;\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tpreloadedSearchCountApi(acctNumber: string, req: PreloadedTextSearch): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/other-preloaded-list/search/count`, req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tpreloadedAddApi(acctNumber: string, req: PreloadedRequest): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/other-preloaded-list`, req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tpreloadedUpdateApi(acctNumber: string, id: number, req: PreloadedRequest): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.put(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/other-preloaded-list/${id}`, req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tpreloadedRemoveApi(acctNumber: string, id: number): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.delete(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/other-preloaded-list/${id}`, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tpreloadedRemoveAllApi(acctNumber: string, req: PreloadedTextSearch): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/other-preloaded-list/remove-all`, req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status != 200) {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tpreloadedExportCsvApi(acctNumber: string, req: PreloadedExport): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/other-preloaded-list/export/csv`, req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tpreloadedImportCsvUrl(acctNumber: string): string {\n\t\treturn `${this.config.districtApiUrl}/districts/${acctNumber}/settings/other-preloaded-list/import/csv`\n\t}\n\n\tpreloadedFindApi(acctNumber: string, req: PreloadedFind): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/other-preloaded-list/find`, req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json().list;\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tpreloadedImportCsvStatus(acctNumber: string, req: PreloadedWorkerStatus): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/other-preloaded-list/import/csv/status`, req, { headers: headers })\n\t\t\t.timeout(30000)\n\t\t\t.retryWhen(error => this.httpRetry(error))\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tpreloadedExportCsvStatus(acctNumber: string, req: PreloadedWorkerStatus): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/other-preloaded-list/export/csv/status`, req, { headers: headers })\n\t\t\t.timeout(30000)\n\t\t\t.retryWhen(error => this.httpRetry(error))\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\t//SchoolGroup\n\tschoolGroupAddApi(acctNumber: string, req: SchoolGroup): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/school-group/add`, req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json().list;\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\n\t}\n\n\tschoolGroupFindApi(acctNumber: string, req: SchoolGroupFind): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/school-group/find`, req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json().list;\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\tschoolGroupFindAccountsV2Api(acctNumber: string, req: SchoolGroupFind): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/school-group/find/accounts`, req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json().list;\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\tschoolGroupFindCountApi(acctNumber: string, req: SchoolGroupFind): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/school-group/count`, req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json();\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tschoolGroupUpdateApi(acctNumber: string, req: SchoolGroup): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/school-group/update/${req.schoolGroupID}`, req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json().list;\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tschoolGroupRemoveApi(acctNumber: string, req: SchoolGroup): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/school-group/remove/${req.schoolGroupID}`, req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json();\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tschoolGroupFindAccountsV2DistinctApi(acctNumber: string, req: SchoolGroupFind): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/school-group/find/accounts/distinct`, req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json().list;\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tbadgeAddApi(acctNumber: string, req: Badge): Observable{\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/badge`, req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json();\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tbadgeUpdateApi(acctNumber: string, req: Badge): Observable{\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.put(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/badge/${req.id}`, req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json();\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tbadgeFindApi(acctNumber: string, req: FindBadge): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/badge/find`, req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json().list;\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tbadgeFindCountApi(acctNumber: string, req: FindBadge): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/badge/find/count`, req, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json().list;\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tbadgeDeleteApi(acctNumber: string, id: number): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.delete(`${this.config.districtApiUrl}/districts/${acctNumber}/settings/badge/${id}`, { headers: headers })\n\t\t\t.timeout(this.timeout)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json().list;\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tactivityReportPdf(acctNumber: string, req: ActivityReportPDFRequest): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(this.config.districtApiUrl + '/districts/' + acctNumber + '/reports/activity/export/pdf' , req, { headers: headers })\n\t\t\t.timeout(35000)\n\t\t\t.map(resp => {\n\t\t\t\tvar row: ActivityReportPDF = new ActivityReportPDF();\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\tvar data = resp.json()\n\t\t\t\t\trow.downloadUrls = data.downloadUrls;\n\t\t\t\t\trow.requestId = data.requestId;\n\t\t\t\t\treturn row\n\t\t\t\t} else if (resp.status == 404) {\n\t\t\t\t\tconsole.log('404');\n\t\t\t\t\treturn row;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tactivityReportCsv(acctNumber: string, req: ActivityReportCSVRequest): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(this.config.districtApiUrl + '/districts/' + acctNumber + '/reports/activity/export/csv',req, { headers: headers })\n\t\t\t.timeout(35000)\n\t\t\t.map(resp => {\n\t\t\t\tvar row: ActivityReportCSV = new ActivityReportCSV();\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\tvar data = resp.json()\n\t\t\t\t\trow.downloadUrls = data.downloadUrls;\n\t\t\t\t\trow.requestId = data.requestId;\n\t\t\t\t\treturn row\n\t\t\t\t} else if (resp.status == 404) {\n\t\t\t\t\tconsole.log('404');\n\t\t\t\t\treturn row;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tcountActivityReportApi(acctNumber: string, req: FindActivityReport): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/reports/activity/count`,req, { headers: headers })\n\t\t\t.timeout(35000)\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\tlet data = resp.json()\n\t\t\t\t\treturn parseInt(data.count)\n\t\t\t\t} else if (resp.status == 404) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tactivityReportApi(acctNumber: string, req: FindActivityReport): Observable {\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(this.config.districtApiUrl + '/districts/' + acctNumber + '/reports/activity', req, { headers: headers })\n\t\t\t.timeout(35000)\n\t\t\t.map(resp => {\n\t\t\t\tvar rows: ActivityReportRow[] = [];\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\tvar data = resp.json().list\n\t\t\t\t\tfor (var v in data) {\n\t\t\t\t\t\tvar row: ActivityReportRow = new ActivityReportRow();\n\t\t\t\t\t\trow.id = data[v].id;\n\t\t\t\t\t\trow.name = data[v].name;\n\t\t\t\t\t\trow.badgeName = data[v].badgeName;\n\t\t\t\t\t\trow.loginTime = rfc3339ToDate(data[v].loginTime);\n\t\t\t\t\t\tif (isDateSet(rfc3339ToDate(data[v].logoutTime))) {\n\t\t\t\t\t\t\trow.logoutTime = rfc3339ToDate(data[v].logoutTime);\n\t\t\t\t\t\t}\n\t\t\t\t\t\trow.additionalInfo1 = data[v].additionalInfo1;\n\t\t\t\t\t\trow.additionalInfo2 = data[v].additionalInfo2;\n\t\t\t\t\t\trow.additionalInfo3 = data[v].additionalInfo3;\n\t\t\t\t\t\trow.additionalInfo4 = data[v].additionalInfo4;\n\t\t\t\t\t\tif (data[v].images) {\n\t\t\t\t\t\t\trow.images = [];\n\t\t\t\t\t\t\tfor (var i in data[v].images) {\n\t\t\t\t\t\t\t\trow.images.push({ imgType: data[v].images[i].type, link: data[v].images[i].link });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\trow.images = [];\n\t\t\t\t\t\t}\n\t\t\t\t\t\trow.loginLocationId = data[v].loginLocationId;\n\t\t\t\t\t\tif (data[v].logoutLocationId) {\n\t\t\t\t\t\t\trow.logoutLocationId = data[v].logoutLocationId;\n\t\t\t\t\t\t}\n\t\t\t\t\t\trow.schoolName = data[v].schoolName;\n\t\t\t\t\t\trow.stationName = data[v].stationName;\n\t\t\t\t\t\trow.badgeId = data[v].badgeId;\n\t\t\t\t\t\tif(data[v].dataSource){\n\t\t\t\t\t\t\tif(data[v].dataSource.student){\n\t\t\t\t\t\t\t\trow.dataSource.student.studentId = data[v].dataSource.student.studentId;\n\t\t\t\t\t\t\t\trow.dataSource.student.sisStudentId = data[v].dataSource.student.sisStudentId;\n\t\t\t\t\t\t\t\trow.dataSource.student.field1 = data[v].dataSource.student.field1;\n\t\t\t\t\t\t\t\trow.dataSource.student.field2 = data[v].dataSource.student.field2;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif(data[v].dataSource.rfidUser){\n\t\t\t\t\t\t\t\trow.dataSource.rfidUser.cardId = data[v].dataSource.rfidUser.cardId;\n\t\t\t\t\t\t\t\trow.dataSource.rfidUser.field1 = data[v].dataSource.rfidUser.field1;\n\t\t\t\t\t\t\t\trow.dataSource.rfidUser.field2 = data[v].dataSource.rfidUser.field2;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif(data[v].dataSource.studentContact){\n\t\t\t\t\t\t\t\trow.dataSource.studentContact.cardId = data[v].dataSource.studentContact.cardId;\n\t\t\t\t\t\t\t\trow.dataSource.studentContact.name = data[v].dataSource.studentContact.name;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif(data[v].dataSource.preloaded){\n\t\t\t\t\t\t\t\trow.dataSource.preloaded.field1 = data[v].dataSource.preloaded.field1;\n\t\t\t\t\t\t\t\trow.dataSource.preloaded.field2 = data[v].dataSource.preloaded.field2;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\trows.push(row);\n\t\t\t\t\t}\n\t\t\t\t\treturn rows\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tactivityReportExportCSVStatus(acctNumber: string,req: ActivityReportExportCSVStatusRequest){\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/reports/activity/export/csv/status`, req, { headers: headers })\n\t\t\t.timeout(35000)\n\t\t\t.retryWhen(error => this.httpRetry(error))\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\tactivityReportExportPDFStatus(acctNumber: string,req: ActivityReportExportPDFStatusRequest){\n\t\tvar token = this.getToken();\n\t\tvar headers = new Headers();\n\t\theaders.append('Content-Type', 'application/json');\n\t\theaders.append('Authorization', token.tokenType + ' ' + token.accessToken);\n\t\treturn this.http.post(`${this.config.districtApiUrl}/districts/${acctNumber}/reports/activity/export/pdf/status`, req, { headers: headers })\n\t\t\t.timeout(35000)\n\t\t\t.retryWhen(error => this.httpRetry(error))\n\t\t\t.map(resp => {\n\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\treturn resp.json()\n\t\t\t\t} else {\n\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tlet er = this.getError(err);\n\t\t\t\treturn Observable.throw(er);\n\t\t\t});\n\t}\n\n\thttpRetry(o: Observable): Observable {\n\t\treturn o\n\t\t\t.flatMap((error: any) => {\n\t\t\t\treturn Observable.of(error).delay(this.delay);\n\t\t\t})\n\t\t\t.take(this.retry)\n\t\t\t.concat(Observable.throw(this.getError(o)));\n\t}\n}\n\nexport function districtServiceFactory(\n\thttp: HttpService,\n\taccount: Account,\n\tconfig: Config\n) {\n\treturn (environment.isMoc) ? new DistrictServiceMoc(http, account, config) : new DistrictService(http, account, config);\n}\n","export class DistrictUser {\n\troles: string[];\n\tuserId: string;\n\tfirstName: string;\n\tlastName: string;\n\temail: string;\n\topenAddRole: boolean; //from js\n\tstatus: string;\n\towner: string;\n\n\tconstructor() {\n\t\tthis.roles = [];\n\t\tthis.userId = '';\n\t\tthis.firstName = '';\n\t\tthis.lastName = '';\n\t\tthis.email = '';\n\t\tthis.openAddRole = false;\n\t\tthis.status = '';\n\t\tthis.owner = '';\n\t}\n}\n","export function elapsedHoursMinutes(startDate: Date, endDate: Date): Elapsed {\n let st = startDate;\n let et = endDate;\n //get minutes\n let timeDiff = et.getTime() - st.getTime();\n // strip the miliseconds\n timeDiff /= 1000;\n // get seconds\n let seconds = Math.round(timeDiff % 60);\n // remove seconds from the date\n timeDiff = Math.round(timeDiff / 60);\n // get minutes\n let minutes = Math.round(timeDiff % 60);\n // remove minutes from the date\n timeDiff = Math.floor(timeDiff / 60);\n // get hours\n let hours = Math.round(timeDiff % 24);\n return new Elapsed(0, hours, minutes, 0);\n}\n\nexport function elapsedDaysHoursMinutes(startDate: Date, endDate: Date): Elapsed {\n let st = startDate;\n let et = endDate;\n //get minutes\n let timeDiff = et.getTime() - st.getTime();\n // strip the miliseconds\n timeDiff /= 1000;\n // get seconds\n let seconds = Math.round(timeDiff % 60);\n // remove seconds from the date\n timeDiff = Math.round(timeDiff / 60);\n // get minutes\n let minutes = Math.round(timeDiff % 60);\n // remove minutes from the date\n timeDiff = Math.floor(timeDiff / 60);\n // get hours\n let hours = Math.round(timeDiff % 24);\n\n timeDiff = Math.round(timeDiff / 24);\n\n let days = timeDiff;\n return new Elapsed(days, hours, minutes, 0);\n}\n\nexport class Elapsed {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n\n constructor(days: number, hours: number, minutes: number, seconds: number) {\n this.days = days;\n this.hours = hours;\n this.minutes = minutes;\n this.seconds = seconds;\n }\n}\n","\n \n ","import { Component } from '@angular/core';\n\n@Component({\n selector: 'district-footer',\n template: `\n \n `\n})\n\nexport class FooterComponent {\n today: number;\n constructor() {\n this.today = Date.now();\n }\n}\n","\nimport {throwError as observableThrowError, Observable } from 'rxjs';\nimport { Http, Request, RequestOptions, RequestOptionsArgs, Response, ConnectionBackend, Headers } from \"@angular/http\";\nimport \"rxjs/add/observable/fromPromise\";\nimport \"rxjs/add/operator/mergeMap\";\n\nimport { Account } from './account.service';\nimport { Token } from './token';\nimport { Config } from './config';\nimport { TokenHelper } from './token_helper';\nimport { Injector, Injectable } from '@angular/core';\nimport { OAuthToken } from './oauth-token';\n\n\nexport interface InterceptorConfigOptional {\n\theaderName?: string;\n\theaderPrefix?: string;\n\tnoTokenError?: boolean;\n}\n\nconst DEFAULT_HEADER_NAME = 'Authorization';\nconst DEFAULT_HEADER_PREFIX_BEARER = 'Bearer';\n\nexport class InterceptorConfig {\n\n\theaderName: string = DEFAULT_HEADER_NAME;\n\theaderPrefix: string = DEFAULT_HEADER_PREFIX_BEARER;\n\tnoTokenError: boolean = false;\n\n\tconstructor(config?: InterceptorConfigOptional) {\n\t\tconfig = config || {};\n\t\t(Object).assign(this, config)\n\t}\n}\n\nexport abstract class HttpInterceptor extends Http {\n\n\tprivate origRequest: Request;\n\n\tconstructor(backend: ConnectionBackend, defaultOptions: RequestOptions, private config: InterceptorConfig) {\n\t\tsuper(backend, defaultOptions);\n\t}\n\n\tprivate getRequestOptionArgs(options?: RequestOptionsArgs): RequestOptionsArgs {\n\t\tif (options == null) {\n\t\t\toptions = new RequestOptions();\n\t\t}\n\t\tif (options.headers == null) {\n\t\t\toptions.headers = new Headers();\n\t\t}\n\t\toptions.headers.append('Content-Type', 'application/json');\n\t\treturn options;\n\t}\n\n\tprotected requestWithToken(req: Request, token: Token): Observable {\n\t\tthis.origRequest = req;\n\t\tif (!this.config.noTokenError && !token) {\n\t\t\treturn observableThrowError(new Error('No authorization token given'));\n\t\t} else {\n\t\t\treq.headers.set(this.config.headerName, this.config.headerPrefix + ' ' + token.accessToken);\n\t\t}\n\n\t\treturn super.request(req);\n\t}\n\n\trequest(url: string | Request, options?: RequestOptionsArgs): Observable {\n\t\tif (typeof url === 'string') {\n\t\t\treturn this.get(url, options);\n\t\t}\n\t\tlet req: Request = url as Request;\n\t\tlet token = this.getToken();\n\t\treturn token.mergeMap((token: Token) => this.requestWithToken(req, token));\n\t}\n\n\tget(url: string, options?: RequestOptionsArgs, noIntercept?: boolean): Observable {\n\t\tif (noIntercept) {\n\t\t\treturn super.get(url, options);\n\t\t}\n\t\treturn this.intercept(super.get(url, options));\n\t}\n\n\tpost(url: string, body: any, options?: RequestOptionsArgs, noIntercept?: boolean): Observable {\n\t\tif (noIntercept) {\n\t\t\treturn super.post(url, body, options);\n\t\t}\n\t\treturn this.intercept(super.post(url, body, this.getRequestOptionArgs(options)));\n\t}\n\n\tput(url: string, body: any, options?: RequestOptionsArgs, noIntercept?: boolean): Observable {\n\t\tif (noIntercept) {\n\t\t\treturn super.put(url, body, options);\n\t\t}\n\t\treturn this.intercept(super.put(url, body, this.getRequestOptionArgs(options)));\n\t}\n\n\tdelete(url: string, options?: RequestOptionsArgs, noIntercept?: boolean): Observable {\n\t\tif (noIntercept) {\n\t\t\treturn super.delete(url, options);\n\t\t}\n\t\treturn this.intercept(super.delete(url, options));\n\t}\n\n\tprotected intercept(observable: Observable): Observable {\n\t\treturn observable.catch((err, source) => {\n\t\t\tif (this.isErrUnauthorized(err)) {\n\t\t\t\tconsole.log(\"Unauthorised need to refresh token\");\n\n\t\t\t\t// check if we have refreshToken if yes do a refresh else return the error\n\t\t\t\treturn this.getToken()\n\t\t\t\t\t.mergeMap(tk => {\n\t\t\t\t\t\tlet t = new Token();\n\t\t\t\t\t\tif (tk) {\n\t\t\t\t\t\t\tt = tk;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (t.refreshToken !== '') {\n\n\t\t\t\t\t\t\tlet orig = this.origRequest;\n\t\t\t\t\t\t\treturn this.refreshToken()\n\t\t\t\t\t\t\t\t.catch(err => {\n\t\t\t\t\t\t\t\t\t// check in case of an error could not get token due to deletion or token into db\n\t\t\t\t\t\t\t\t\tif (err.message && err.message.indexOf('cannot fetch token') !== -1) {\n\t\t\t\t\t\t\t\t\t\treturn observableThrowError(new Error('unauthorized'));\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn observableThrowError(err);\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.mergeMap(data => {\n\t\t\t\t\t\t\t\t\tif (data && data.accessToken) {\n\n\t\t\t\t\t\t\t\t\t\tlet th = new TokenHelper();\n\t\t\t\t\t\t\t\t\t\tt.accessToken = data.accessToken;\n\t\t\t\t\t\t\t\t\t\tt.refreshToken = data.refreshToken;\n\t\t\t\t\t\t\t\t\t\tt.tokenType = data.tokenType;\n\t\t\t\t\t\t\t\t\t\tt.expiresIn = data.expiresIn;\n\t\t\t\t\t\t\t\t\t\tt.expiresAt = th.getExpiresAt(data.expiresIn);\n\n\t\t\t\t\t\t\t\t\t\treturn this.saveToken(t);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn observableThrowError(new Error('unauthorized'));\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.mergeMap(token => {\n\t\t\t\t\t\t\t\t\treturn this.requestWithToken(orig, token);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn observableThrowError(err);\n\t\t\t\t\t});\n\t\t\t}\n\t\t\treturn observableThrowError(err);\n\t\t});\n\t}\n\n\tprotected abstract getToken(): Observable;\n\n\tprotected abstract saveToken(token: Token): Observable;\n\n\tprotected abstract refreshToken(): Observable;\n\n\tprotected abstract isErrUnauthorized(resp: Response): boolean;\n}\n\n\n@Injectable()\nexport class HttpService extends HttpInterceptor {\n\n\tconstructor(backend: ConnectionBackend, defaultOptions: RequestOptions, private injector: Injector) {\n\t\tsuper(backend, defaultOptions, new InterceptorConfig({ noTokenError: true }));\n\t}\n\n\tprotected getToken(): Observable {\n\t\tlet t = this.account().getToken();\n\t\tif (!t) {\n\t\t\tt = new Token();\n\t\t}\n\n\t\treturn Observable.of(t);\n\t}\n\n\tprotected saveToken(token: Token): Observable {\n\t\tthis.account().setToken(token);\n\t\treturn Observable.of(token);\n\t}\n\n\tprotected refreshToken(): Observable {\n\t\treturn this.getToken()\n\t\t\t.mergeMap(t => {\n\t\t\t\treturn super.post(`${this.cfg().districtApiUrl}/oauth2/token`, { refreshToken: t.refreshToken }, null, true)\n\t\t\t\t\t.map(resp => {\n\t\t\t\t\t\tif (resp.status == 200) {\n\t\t\t\t\t\t\treturn resp.json()\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow this.getError(resp);\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.catch(err => {\n\t\t\t\t\t\tlet er = this.getError(err);\n\t\t\t\t\t\treturn observableThrowError(er);\n\t\t\t\t\t});\n\t\t\t});\n\t}\n\n\tprotected account(): Account {\n\t\treturn this.injector.get(Account);\n\t}\n\n\tprotected cfg(): Config {\n\t\treturn this.injector.get(Config);\n\t}\n\n\tprotected isErrUnauthorized(resp: Response): boolean {\n\t\tlet err = this.getError(resp);\n\t\tif (err.message == 'unauthorized') {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate getError(err: any): Error {\n\t\tvar er: any;\n\t\tvar msg = 'no connection';\n\t\tif (typeof (err.json) === 'function') {\n\t\t\ter = err.json();\n\t\t\tif (er.message != null && er.message != null && er.message != '') {\n\t\t\t\tmsg = er.message;\n\t\t\t} else if (er.error != null && er.error != null && er.error != '') {\n\t\t\t\tmsg = er.error;\n\t\t\t} else {\n\t\t\t\tconsole.log(err);\n\t\t\t}\n\t\t\treturn new Error(msg);\n\t\t} else if (err instanceof Error) {\n\t\t\treturn err;\n\t\t} else {\n\t\t\tconsole.log(err);\n\t\t}\n\t}\n}\n\n\nexport function getHttpService(backend: ConnectionBackend, defaultOptions: RequestOptions, injector: Injector) {\n\treturn new HttpService(backend, defaultOptions, injector);\n}\n","export class InviteUser {\n\temail: string;\n\n\tconstructor() {\n\t this.email = '';\n\t}\n }\n","
\n \n
","/// \nimport { Component, OnDestroy, OnInit } from '@angular/core';\nimport { Router, ActivatedRoute } from '@angular/router';\nimport { AppTitle } from './title';\nimport { Account, validateToken } from './account.service';\nimport { DistrictService } from './district.service';\nimport { Alert } from './alert';\nimport { Config } from './config';\nimport { AppService } from './app.service';\n\n@Component({\n\tselector: 'login',\n\ttemplate:\n\t\t`
\n \n
`\n})\n\nexport class LoginComponent implements OnInit, OnDestroy {\n\tpublic msg: Alert;\n\n\tconstructor(\n\t\tprivate router: Router,\n\t\tprivate title: AppTitle,\n\t\tprivate account: Account,\n\t\tprivate dvc: DistrictService,\n\t\tprivate config: Config,\n\t\tprivate app: AppService,\n\t) {\n\t\tthis.msg = new Alert();\n\t\ttitle.setTitles({ title: 'Login', dashboard: 'Login' });\n\t\ttitle.setBreadcrumbs([\n\t\t\t{ title: 'Login', link: '' }\n\t\t]);\n\t}\n\n\tngOnInit() {\n\t\tlet gotopage = this.config.goToPage();\n\n\t\tif (validateToken()) {\n\n\t\t\tthis.dvc.loadUser().subscribe(ur => {\n\n\t\t\t\tlet usr = this.dvc.userRoles();\n\t\t\t\tlet us = this.account.getUser();\n\t\t\t\tif (usr == null && us == null) {\n\t\t\t\t\tthis.msg.error('You don\\'t have access to this page.');\n\n\t\t\t\t\t// in case user login and token has being stored into localStorage but since this user is not allowed to view this page\n\t\t\t\t\t// and there is no logout link, we need to remove token and other kyes from localStorage for security reasons\n\t\t\t\t\tthis.account.removeLocalStorage();\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// trigger app component to reload some of the ui parts\n\t\t\t\tthis.app.onLoadApp.emit(null);\n\n\t\t\t\tif (!gotopage) {\n\t\t\t\t\tthis.router.navigateByUrl('/settings/' + ur.acctNumber);\n\t\t\t\t} else {\n\t\t\t\t\tthis.router.navigateByUrl(gotopage);\n\t\t\t\t}\n\n\t\t\t}, err => {\n\t\t\t\tif (err.message == 'unauthorized') {\n\t\t\t\t\tthis.msg.error('You don\\'t have access to this page.');\n\t\t\t\t} else {\n\t\t\t\t\tthis.msg.error('There is an error when processing this request, please try again.');\n\t\t\t\t}\n\t\t\t});\n\n\t\t} else {\n\t\t\tthis.msg.error('Invalid token, please logout and login again.');\n\t\t}\n\t}\n\n\tngOnDestroy() {\n\t\tthis.config.removeLocalStorage();\n\t}\n}\n","export class OAuthTokenRequest {\n\trefreshToken: string;\n\n\tconstructor() {\n\t\tthis.refreshToken = '';\n\t}\n}\n","export class OAuthToken {\n\trefreshToken: string;\n\taccessToken: string;\n\texpiresIn: number;\n\ttokenType: string;\n\n\tconstructor() {\n\t\tthis.refreshToken = '';\n\t\tthis.accessToken = '';\n\t\tthis.expiresIn = 0;\n\t\tthis.tokenType = '';\n\t}\n}\n","import { Token } from './token';\n\nexport class OAuthResponse {\n\taccessToken: string;\n\ttokenType: string;\n\tstate: string;\n\tscope: string;\n\texpiresIn: number;\n\texpiresAt: Date;\n\trefreshToken: string;\n\tconstructor() {\n\t\tthis.accessToken = '';\n\t\tthis.tokenType = '';\n\t\tthis.state = '';\n\t\tthis.scope = '';\n\t\tthis.expiresIn = 0;\n\t\tthis.refreshToken = '';\n\t}\n\n\tgetToken(): Token {\n\t\tlet t = new Token();\n\t\tt.accessToken = this.accessToken;\n\t\tt.tokenType = this.tokenType;\n\t\tt.state = this.state;\n\t\tt.scope = this.scope;\n\t\tt.expiresIn = this.expiresIn;\n\t\tt.expiresAt = this.expiresAt;\n\t\tt.refreshToken = this.refreshToken;\n\t\treturn t;\n\t}\n}\n","import { Directive, Host, Input } from '@angular/core';\n\n@Directive({\n selector: '[offClick]',\n host: {\n '(click)': 'onClick($event)',\n }\n})\n\nexport class OffClickDirective {\n @Input('offClick') offClickHandler;\n\n constructor() {\n }\n\n ngOnInit() {\n let self = this;\n setTimeout(() => { document.addEventListener('click', self.offClickHandler); }, 0);\n }\n\n ngOnDestroy() {\n let self = this;\n document.removeEventListener('click', self.offClickHandler);\n }\n\n onClick($event) {\n $event.stopPropagation();\n }\n}\n","\n\t