export interface ConfigModel { puzzle: { solution: string; first: string; next: string | null; last: string; end: string; seed: string; }; calendar: { config_file: string; background: string; }; image: { size: number; border: number; fonts: { file: string; size: number }[]; }; webdav: { url: string; cache_ttl: number; config_file: string; }; } export interface NumStrDict { [key: number]: string; } export interface DoorSaved { day: number; x1: number; y1: number; x2: number; y2: number; } export type DoorsSaved = DoorSaved[]; export type Credentials = [username: string, password: string]; export function objForEach( obj: T, f: (k: keyof T, v: T[keyof T]) => void, ): void { for (const k in obj) { if (Object.prototype.hasOwnProperty.call(obj, k)) { f(k, obj[k]); } } }