Aniruddha7 commited on
Commit
19dfd32
·
verified ·
1 Parent(s): bd59875

Full deploy of QueryLensV2 (code + demo db) to a fresh Space

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .dockerignore +89 -0
  2. .env.example +29 -0
  3. .gitattributes +2 -0
  4. .pytest_cache/.gitignore +2 -0
  5. .pytest_cache/CACHEDIR.TAG +4 -0
  6. .pytest_cache/README.md +8 -0
  7. .pytest_cache/v/cache/lastfailed +5 -0
  8. .pytest_cache/v/cache/nodeids +1 -0
  9. .vscode/settings.json +4 -0
  10. Agent/agentic_workflow.py +0 -0
  11. Agent/chart_contract.py +237 -0
  12. Agent/db_uri.py +159 -0
  13. Agent/invariants.py +499 -0
  14. Agent/mcp_server.py +630 -0
  15. Agent/schema_profile.py +332 -0
  16. Agent/tools/granite_vision.py +121 -0
  17. Agent/tools/groq_vision_health.py +33 -0
  18. Agent/worker.py +543 -0
  19. Dockerfile +42 -0
  20. README.md +630 -6
  21. app.py +187 -0
  22. docker-compose.yml +84 -0
  23. employee-sample-database/.gitignore +11 -0
  24. employee-sample-database/CLAUDE.md +77 -0
  25. employee-sample-database/LICENSE +21 -0
  26. employee-sample-database/README.md +1 -0
  27. employee-sample-database/mysql/Dockerfile.small +7 -0
  28. employee-sample-database/mysql/README.md +220 -0
  29. employee-sample-database/mysql/dataset_small/01_employee.sql +125 -0
  30. employee-sample-database/mysql/dataset_small/load_department.sql +10 -0
  31. employee-sample-database/mysql/dataset_small/load_dept_emp.sql +1103 -0
  32. employee-sample-database/mysql/dataset_small/load_dept_manager.sql +32 -0
  33. employee-sample-database/mysql/dataset_small/load_employee.sql +1000 -0
  34. employee-sample-database/mysql/dataset_small/load_salary1.sql +0 -0
  35. employee-sample-database/mysql/dataset_small/load_title.sql +1470 -0
  36. employee-sample-database/mysql/dataset_small/object.sql +225 -0
  37. employee-sample-database/mysql/dataset_small/show_elapsed.sql +5 -0
  38. employee-sample-database/mysql/dataset_small/test_employee_md5.sql +115 -0
  39. employee-sample-database/mysql/install_dataset_small.sh +11 -0
  40. employee-sample-database/mysql/schema.png +3 -0
  41. employee-sample-database/postgres/README.md +22 -0
  42. employee-sample-database/postgres/dataset_small/01_employee.sql +221 -0
  43. employee-sample-database/postgres/dataset_small/load_department.sql +10 -0
  44. employee-sample-database/postgres/dataset_small/load_dept_emp.sql +1103 -0
  45. employee-sample-database/postgres/dataset_small/load_dept_manager.sql +32 -0
  46. employee-sample-database/postgres/dataset_small/load_employee.sql +1000 -0
  47. employee-sample-database/postgres/dataset_small/load_salary1.sql +0 -0
  48. employee-sample-database/postgres/dataset_small/load_title.sql +1470 -0
  49. employee-sample-database/sqlite/README.md +34 -0
  50. employee-sample-database/sqlite/dataset_small/employee.db +3 -0
.dockerignore ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Exclude heavy folders from Docker image
2
+ **/__pycache__
3
+ **/.venv
4
+ **/.git
5
+ **/.ipynb_checkpoints
6
+ **/hf_cache
7
+ **/node_modules
8
+
9
+ # Exclude local database data
10
+ **/postgres-data
11
+ **/mysql-data
12
+
13
+ # Exclude large model weights and research artifacts
14
+ Agent/Gemma3_1B_weights
15
+ Agent/merged_gemma1b_text2Sql
16
+ Agent/merged_gemma3_1b_text2Sql
17
+ Agent/Qwen2.5_3b_weights
18
+ Agent/Qwen2.5-3B-Instruct
19
+ merged_qwen2_5_3b_text2sql
20
+ merged_gemma3_1b_text2sql
21
+ .venv-merge/
22
+
23
+ # Exclude all Jupyter Notebooks EXCEPT the proof-of-work notebook
24
+ **/*.ipynb
25
+ !Fine_Tuning_Qwen_2_5_3B.ipynb
26
+ **/.ipynb_checkpoints
27
+
28
+ # Exclude redundant project clutter
29
+ backups/
30
+ debug_files/
31
+ test_files/
32
+ test_results/
33
+ dump-mysql.bat
34
+ dump-postgres.bat
35
+ agentic_improvements.md
36
+ invariants_analysis.md
37
+ progress_summary.txt
38
+ mcp_server.log
39
+ merge.log
40
+ response.json
41
+ run-dev.ps1
42
+ setup_ollama.bat
43
+
44
+
45
+ # Exclude experimental/redundant Python scripts
46
+ Agent/trial*.py
47
+ Agent/test*.py
48
+ Agent/old_*.py
49
+ Agent/OLLAMA_GPU_NOTES.md
50
+ **/debug_*.py
51
+
52
+ # Exclude local uploads and generated files (keep empty folder)
53
+ chat_store/*
54
+ !chat_store/.gitkeep
55
+ !uploads/.gitkeep
56
+
57
+ # Exclude local configuration (Hugging Face uses Secrets instead)
58
+ .env
59
+ .env.local
60
+
61
+ # Exclude local logs and IDE settings
62
+ *.log
63
+ .vscode/
64
+ .idea/
65
+ .DS_Store
66
+
67
+ # Exclude Python build artifacts
68
+ __pycache__/
69
+ *.pyc
70
+ *.pyo
71
+ *.pyd
72
+ .Python
73
+ env/
74
+ venv/
75
+ .venv/
76
+ pip-log.txt
77
+ pip-delete-this-directory.txt
78
+ .toast
79
+ .mypy_cache/
80
+ .pytest_cache/
81
+ .hypothesis/
82
+
83
+ # Exclude large local data
84
+ uploads/*
85
+ !uploads/.gitkeep
86
+ chat_store/*
87
+ !chat_store/docs/.gitkeep
88
+ !chat_store/.gitkeep
89
+ .idea/
.env.example ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Core DB
2
+ # DB_CONNECTION_URL=postgresql://user:pass@localhost:5432/dbname
3
+
4
+ # ── Text-to-SQL LLM ──────────────────────────────────────────────
5
+ # Recommended: HF Inference API (same as the Hugging Face Spaces deployment).
6
+ # Set USE_HF_CLOUD=1 to force cloud-only. With USE_HF_CLOUD=0 the local Ollama
7
+ # model is still preferred, but if it is not installed and HF_API_TOKEN is set,
8
+ # the worker auto-falls back to HF Inference automatically.
9
+ USE_HF_CLOUD=1
10
+ HF_API_TOKEN=
11
+ HF_LLM_MODEL=Qwen/Qwen2.5-Coder-7B-Instruct
12
+
13
+ # Cloud VQA via Groq (free tier)
14
+ GROQ_API_KEY=
15
+ GROQ_VISION_MODEL=qwen/qwen3.8-27b
16
+
17
+ # Local Ollama (optional — only when models are installed locally)
18
+ # USE_HF_CLOUD=0
19
+ # OLLAMA_BASE_URL=http://localhost:11434
20
+ # OLLAMA_MODEL_NAME=qwen2.5-coder:1.5b
21
+ # GRANITE_MODEL_PATH=qwen3.5:2b
22
+ # OLLAMA_OCR_QA_MODEL=gemma3:1b-it-qat
23
+ # GRANITE_MODEL=qwen3.5:2b
24
+
25
+ # Workers/timeouts
26
+ WORKER_PORT=8700
27
+ MCP_PORT=8701
28
+ OCR_QA_TIMEOUT=45
29
+ INVARIANTS_BASE_TIMEOUT=180
.gitattributes CHANGED
@@ -33,3 +33,5 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ employee-sample-database/mysql/schema.png filter=lfs diff=lfs merge=lfs -text
37
+ employee-sample-database/sqlite/dataset_small/employee.db filter=lfs diff=lfs merge=lfs -text
.pytest_cache/.gitignore ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ # Created by pytest automatically.
2
+ *
.pytest_cache/CACHEDIR.TAG ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ Signature: 8a477f597d28d172789f06886806bc55
2
+ # This file is a cache directory tag created by pytest.
3
+ # For information about cache directory tags, see:
4
+ # https://bford.info/cachedir/spec.html
.pytest_cache/README.md ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ # pytest cache directory #
2
+
3
+ This directory contains data from the pytest's cache plugin,
4
+ which provides the `--lf` and `--ff` options, as well as the `cache` fixture.
5
+
6
+ **Do not** commit this to version control.
7
+
8
+ See [the docs](https://docs.pytest.org/en/stable/how-to/cache.html) for more information.
.pytest_cache/v/cache/lastfailed ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ {
2
+ "Agent/test_adapter_weights.py": true,
3
+ "Agent/test_query_runner.py": true,
4
+ "Agent/test_merged_model.py": true
5
+ }
.pytest_cache/v/cache/nodeids ADDED
@@ -0,0 +1 @@
 
 
1
+ []
.vscode/settings.json ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ {
2
+ "python-envs.defaultEnvManager": "ms-python.python:conda",
3
+ "python-envs.defaultPackageManager": "ms-python.python:conda"
4
+ }
Agent/agentic_workflow.py ADDED
The diff for this file is too large to render. See raw diff
 
Agent/chart_contract.py ADDED
@@ -0,0 +1,237 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Chart contract — turns query result rows into a rendering-agnostic chart spec.
3
+
4
+ The text2SQL pipeline produces plain result rows. This module detects rows that
5
+ visualize well (category breakdowns, time series, comparisons) and produces a
6
+ compact JSON spec embedded in the answer text as:
7
+
8
+ <<<CHART_JSON>>>{...spec...}<<<END_CHART_JSON>>>
9
+
10
+ The worker strips the marker out of the user-visible answer and ships the spec
11
+ separately. The web UI renders it with ECharts in the sepia palette. If no
12
+ reliable vega-like shape is found, no marker is added and the UI falls back to
13
+ tables/text — chart detection must never corrupt a correct answer.
14
+ """
15
+ from __future__ import annotations
16
+
17
+ import json
18
+ import re
19
+ from datetime import date, datetime
20
+ from decimal import Decimal
21
+ from typing import Any, Dict, List, Optional, Tuple
22
+
23
+ CHART_OPEN = "<<<CHART_JSON>>>"
24
+ CHART_CLOSE = "<<<END_CHART_JSON>>>"
25
+
26
+ MAX_CHART_ROWS = 60 # cap categories drawn
27
+ MAX_LABEL_LEN = 40 # truncate long labels
28
+ PIE_MAX_ROWS = 8 # pies stay readable up to ~8 slices
29
+
30
+ SERIES_NAME_HINTS = (
31
+ ("count", "count"), ("total", "total"), ("sum", "total"),
32
+ ("avg", "average"), ("average", "average"), ("min", "minimum"),
33
+ ("max", "maximum"), ("salary", "value"), ("amount", "value"),
34
+ )
35
+
36
+ DATE_RE = re.compile(
37
+ r"^\d{4}([-/.]\d{1,2}([-/.]\d{1,2})?)?$" # 2024 / 2024-01 / 2024-01-01
38
+ )
39
+
40
+
41
+ # ---------------------------------------------------------------------------
42
+ # Helpers
43
+ # ---------------------------------------------------------------------------
44
+ def _num(v: Any) -> Optional[float]:
45
+ if isinstance(v, bool):
46
+ return None
47
+ if isinstance(v, (int, float)) and v == v: # NaN guard
48
+ return float(v)
49
+ if isinstance(v, Decimal):
50
+ try:
51
+ return float(v)
52
+ except Exception:
53
+ return None
54
+ if isinstance(v, str):
55
+ s = v.strip().replace(",", "")
56
+ if re.fullmatch(r"-?\d+(\.\d+)?", s):
57
+ try:
58
+ return float(s)
59
+ except ValueError:
60
+ return None
61
+ return None
62
+
63
+
64
+ def _label(v: Any) -> str:
65
+ if v is None:
66
+ return "(none)"
67
+ if isinstance(v, (date, datetime)):
68
+ return str(v)[:MAX_LABEL_LEN]
69
+ s = str(v).strip()
70
+ if len(s) > MAX_LABEL_LEN:
71
+ s = s[: MAX_LABEL_LEN - 1] + "…"
72
+ return s
73
+
74
+
75
+ def _is_dateish(v: Any) -> bool:
76
+ if isinstance(v, (date, datetime)):
77
+ return True
78
+ s = str(v).strip()
79
+ return bool(s) and bool(DATE_RE.match(s))
80
+
81
+
82
+ def _nice_series_name(col: str) -> str:
83
+ c = (col or "").strip()
84
+ cl = c.lower()
85
+ for key, nice in SERIES_NAME_HINTS:
86
+ if key in cl:
87
+ base = c.split("(")[0].strip() # strip "AVG(" noise in aliases
88
+ return base or nice
89
+ return c
90
+
91
+
92
+ # ---------------------------------------------------------------------------
93
+ # Detection
94
+ # ---------------------------------------------------------------------------
95
+ def detect_chart_spec(results: List[Dict[str, Any]], question: str = "") -> Optional[Dict[str, Any]]:
96
+ """Return a chart spec dict when `results` visualize well, else None.
97
+
98
+ Spec shape (ECharts-friendly, library-agnostic):
99
+ {
100
+ "type": "pie" | "bar" | "line",
101
+ "title": str, # derived from the question
102
+ "xlabel": str, "ylabel": str,
103
+ "x": [labels], # categories or time points
104
+ "series": [{"name": str, "values": [numbers]}],
105
+ "rows_in_result": int
106
+ }
107
+ """
108
+ if not results or not isinstance(results, list):
109
+ return None
110
+ if not isinstance(results[0], dict) or results[0].get("error"):
111
+ return None
112
+
113
+ rows = [r for r in results if isinstance(r, dict)]
114
+ if len(rows) > MAX_CHART_ROWS:
115
+ return None
116
+
117
+ cols = list(rows[0].keys())
118
+ if not cols:
119
+ return None
120
+
121
+ label_col: Optional[str] = None
122
+ time_col: Optional[str] = None
123
+ numeric_cols: List[str] = []
124
+
125
+ for c in cols:
126
+ vals = [r.get(c) for r in rows]
127
+ non_none = [v for v in vals if v is not None]
128
+ if not non_none:
129
+ continue
130
+ # Date-like strings take precedence over numeric-string coercion
131
+ # (a "2020"/"2024-01" column is a time axis, not a measurement).
132
+ all_dateish = all(_is_dateish(v) for v in non_none)
133
+ if all_dateish and time_col is None and label_col is None:
134
+ time_col = c
135
+ continue
136
+ nums = [_num(v) for v in vals]
137
+ n_numeric = sum(1 for n in nums if n is not None)
138
+ if n_numeric == len(non_none):
139
+ numeric_cols.append(c)
140
+ elif label_col is None:
141
+ uniq = {str(v) for v in non_none}
142
+ if 0 < len(uniq) <= MAX_CHART_ROWS: # degenerate constant columns still ok
143
+ label_col = c
144
+
145
+ if time_col:
146
+ label_col = time_col
147
+
148
+ if label_col is None or not numeric_cols:
149
+ return None
150
+
151
+ labels = [_label(r.get(label_col)) for r in rows]
152
+
153
+ series: List[Dict[str, Any]] = []
154
+ for c in numeric_cols[:3]: # at most 3 series keeps charts readable
155
+ values: List[Optional[float]] = []
156
+ ok = True
157
+ for r in rows:
158
+ n = _num(r.get(c))
159
+ if n is None:
160
+ ok = False
161
+ break
162
+ values.append(n)
163
+ if ok and any(v != 0 for v in values):
164
+ values = [round(v, 6) for v in values]
165
+ series.append({"name": _nice_series_name(c), "values": values})
166
+
167
+ if not series:
168
+ return None
169
+
170
+ # Chart type selection --------------------------------------------------
171
+ ql = (question or "").lower()
172
+ proportion_intent = any(
173
+ k in ql for k in ("distribution", "share", "percentage", "percent", "proportion", "%", "breakdown", "split")
174
+ )
175
+ trend_intent = time_col is not None or any(
176
+ k in ql for k in ("trend", "over time", "per year", "by year", "per month", "by month", "growth")
177
+ )
178
+
179
+ single_series = len(series) == 1
180
+ if single_series and len(labels) <= PIE_MAX_ROWS and (proportion_intent or trend_intent is False):
181
+ chart_type = "pie"
182
+ elif trend_intent:
183
+ chart_type = "line"
184
+ elif single_series and len(labels) <= PIE_MAX_ROWS and len(rows) <= PIE_MAX_ROWS:
185
+ chart_type = "pie"
186
+ else:
187
+ chart_type = "bar"
188
+
189
+ title = (question or "").strip().rstrip("?").strip()
190
+ if len(title) > 80:
191
+ title = title[:79] + "…"
192
+
193
+ return {
194
+ "type": chart_type,
195
+ "title": title or "Query result",
196
+ "xlabel": _nice_series_name(label_col),
197
+ "ylabel": series[0]["name"] if single_series else "value",
198
+ "x": labels,
199
+ "series": series,
200
+ "rows_in_result": len(rows),
201
+ }
202
+
203
+
204
+ # ---------------------------------------------------------------------------
205
+ # Embedding / extraction
206
+ # ---------------------------------------------------------------------------
207
+ def embed_chart_marker(answer_text: str, spec: Optional[Dict[str, Any]]) -> str:
208
+ """Append the chart marker to an answer. Safe to call with spec=None."""
209
+ if not spec:
210
+ return answer_text
211
+ try:
212
+ payload = json.dumps(spec, ensure_ascii=False, separators=(",", ":"), default=str)
213
+ except (TypeError, ValueError):
214
+ return answer_text
215
+ return f"{answer_text}\n{CHART_OPEN}{payload}{CHART_CLOSE}"
216
+
217
+
218
+ def extract_chart_marker(text: Optional[str]) -> Tuple[Optional[str], Optional[Dict[str, Any]]]:
219
+ """Split an answer into (clean_text, chart_spec|None).
220
+
221
+ Never throws; on malformed payloads the marker text is left in the answer
222
+ if extraction fails (chart simply won't render).
223
+ """
224
+ if not text or CHART_OPEN not in text:
225
+ return text, None
226
+ head, rest = text.split(CHART_OPEN, 1)
227
+ if CHART_CLOSE not in rest:
228
+ return text, None
229
+ payload, tail = rest.split(CHART_CLOSE, 1)
230
+ clean = (head.rstrip() + ("\n" + tail.strip() if tail.strip() else "")).strip()
231
+ try:
232
+ spec = json.loads(payload)
233
+ if isinstance(spec, dict) and spec.get("type") in ("pie", "bar", "line") and spec.get("series"):
234
+ return clean, spec
235
+ except (ValueError, TypeError):
236
+ pass
237
+ return text, None
Agent/db_uri.py ADDED
@@ -0,0 +1,159 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Database-agnostic URI normalization for SQLAlchemy.
3
+
4
+ QueryLens is architected to interface with PostgreSQL, MySQL, SQLite,
5
+ MS SQL Server and Oracle. Users habitually type bare scheme URLs such as
6
+ `mysql://user:pass@host/db`, but SQLAlchemy resolves bare schemes to
7
+ dialects whose drivers may not be installed (`mysqldb`, `pyodbc`,
8
+ `cx_Oracle`). This module maps every commonly typed scheme onto the
9
+ drivers the project actually ships:
10
+
11
+ postgres:// / postgresql:// .... postgresql+psycopg2 (sync) | postgresql+asyncpg (async)
12
+ mysql:// / mariadb:// .......... mysql+pymysql (sync) | mysql+aiomysql (async)
13
+ mssql:// / sqlserver:// ........ mssql+pymssql (sync) | no async driver exists
14
+ oracle:// ...................... oracle+oracledb thin (sync) | no stable async dialect
15
+ sqlite:///path ................. sqlite (sync) | sqlite+aiosqlite (async)
16
+
17
+ URLs that already pin a dialect driver (`scheme+driver://`) are respected:
18
+ the pinned driver is kept for the layer it belongs to, and the other layer
19
+ gets its family's default driver. Fully unknown schemes are passed through
20
+ end to end so users can bring any SQLAlchemy-compatible database.
21
+
22
+ No heavy imports here: drivers are lazy-loaded by SQLAlchemy itself, so a
23
+ machine without (say) pymssql still boots and only fails when someone
24
+ actually connects to an MSSQL URL.
25
+ """
26
+ import re
27
+ from typing import Dict, Optional, Tuple
28
+
29
+ _SCHEME_RE = re.compile(r"^([a-zA-Z][a-zA-Z0-9+._-]*)://")
30
+
31
+ _FAMILY_BY_SCHEME = {
32
+ "postgres": "postgresql",
33
+ "postgresql": "postgresql",
34
+ "pg": "postgresql",
35
+ "mysql": "mysql",
36
+ "mariadb": "mysql",
37
+ "mssql": "mssql",
38
+ "sqlserver": "mssql",
39
+ "oracle": "oracle",
40
+ "sqlite": "sqlite",
41
+ }
42
+
43
+ _SYNC_DRIVERS = {
44
+ "postgresql": "psycopg2",
45
+ "mysql": "pymysql",
46
+ "mssql": "pymssql",
47
+ "oracle": "oracledb",
48
+ }
49
+ _ASYNC_DRIVERS = {
50
+ "postgresql": "asyncpg",
51
+ "mysql": "aiomysql",
52
+ "sqlite": "aiosqlite",
53
+ }
54
+ _PREFIXES_OF_ASYNC_DRIVERS = {"asyncpg", "aiomysql", "aiosqlite", "asyncpg+gssapi"}
55
+
56
+
57
+ def _parse(url: str) -> Tuple[Optional[str], Optional[str], str]:
58
+ """Split a URL into (sqlalchemy_family, pinned_driver|None, '://rest')."""
59
+ m = _SCHEME_RE.match(url or "")
60
+ if not m:
61
+ return None, None, url or ""
62
+ scheme = m.group(1).lower()
63
+ head, _, driver = scheme.partition("+")
64
+ family = _FAMILY_BY_SCHEME.get(head, head)
65
+ # '://' bytes remain part of the tail so callers can rebuild the URL
66
+ return family, (driver or None) or None, url[m.end(1):]
67
+
68
+
69
+ # libpq connection parameters that the shipped drivers cannot accept.
70
+ # psycopg2.connect() validates keyword arguments against its own whitelist and
71
+ # raises TypeError "connect() got an unexpected keyword argument '<name>'" for
72
+ # anything else; asyncpg behaves the same. Neon's current console template
73
+ # appends `channel_binding=require` to freshly copied connection strings,
74
+ # which trips both drivers even though the URL is otherwise valid - so strip
75
+ # the offending params here instead of asking users to hand-edit pasted
76
+ # credentials.
77
+ _DRIVER_UNSUPPORTED_QUERY_PARAMS = ("channel_binding",)
78
+
79
+
80
+ def sanitize_driver_query_params(raw_uri: str) -> str:
81
+ """Drop query parameters the shipped drivers reject (e.g. Neon's
82
+ `channel_binding=require` from freshly copied connection strings).
83
+
84
+ Scoped to the PostgreSQL family (the only dialect those libpq params
85
+ apply to); TLS via `sslmode` and the password are preserved verbatim.
86
+ Returns the URL unchanged when nothing needs stripping.
87
+ """
88
+ url = (raw_uri or "").strip()
89
+ if not url or "://" not in url:
90
+ return raw_uri or url
91
+ family, _, _ = _parse(url)
92
+ if family != "postgresql":
93
+ return url
94
+ try:
95
+ from sqlalchemy.engine import make_url # lazy: keep db_uri import-light
96
+ _u = make_url(url)
97
+ except Exception:
98
+ # Regex fallback for URLs make_url cannot parse.
99
+ out = url
100
+ for _name in _DRIVER_UNSUPPORTED_QUERY_PARAMS:
101
+ out = re.sub(r"[?&]" + re.escape(_name) + r"=[^&]*", "", out, flags=re.IGNORECASE)
102
+ if "?" not in out and "&" in out.split("//", 1)[-1]:
103
+ out = out.replace("&", "?", 1)
104
+ return out
105
+ query = dict(_u.query)
106
+ dropped = [k for k in _DRIVER_UNSUPPORTED_QUERY_PARAMS if k in query]
107
+ if not dropped:
108
+ return url
109
+ for k in dropped:
110
+ query.pop(k, None)
111
+ try:
112
+ return _u.set(query=query).render_as_string(hide_password=False)
113
+ except Exception:
114
+ # Older SQLAlchemy without render_as_string: render manually.
115
+ _pw = _u.password
116
+ _auth = (_u.username + (f":{_pw}" if _pw else "") + "@") if _u.username else ""
117
+ _hostport = (_u.host or "") + (f":{_u.port}" if _u.port else "")
118
+ _db = ("/" + _u.database) if _u.database else ""
119
+ _qs = "&".join(f"{k}={v}" for k, v in query.items()) if query else ""
120
+ return f"{_u.drivername}://{_auth}{_hostport}{_db}" + (f"?{_qs}" if _qs else "")
121
+
122
+
123
+ def normalize_db_uris(raw_uri: str) -> Dict[str, Optional[str]]:
124
+ """Normalize a user-supplied connection URL for dual-layer engine use.
125
+
126
+ Returns:
127
+ {
128
+ "family": "postgresql" | "mysql" | "mssql" | "oracle" | "sqlite" | None,
129
+ "sync_uri": URL for SQLAlchemy.create_engine (always set),
130
+ "async_uri": URL for create_async_engine, or None when the family
131
+ has no usable async driver (mssql / oracle / exotic),
132
+ }
133
+ """
134
+ url = sanitize_driver_query_params(str(raw_uri or "").strip())
135
+ if not url:
136
+ return {"family": None, "sync_uri": "", "async_uri": None}
137
+
138
+ family, pinned, tail = _parse(url)
139
+ if family is None:
140
+ # Not a scheme URL at all (plain path, DSN name, ...) — trust the
141
+ # caller verbatim but keep the async layer off (no async dialect).
142
+ return {"family": None, "sync_uri": url, "async_uri": None}
143
+
144
+ if pinned:
145
+ if pinned in _PREFIXES_OF_ASYNC_DRIVERS:
146
+ # User handed us an ASYNC URL; pin the sync layer to the family's
147
+ # sync driver and keep their async URL verbatim.
148
+ sync_uri = f"{family}+{_SYNC_DRIVERS[family]}{tail}" if family in _SYNC_DRIVERS else f"{family}{tail}"
149
+ return {"family": family, "sync_uri": sync_uri, "async_uri": url}
150
+ # Sync (or exotic) driver pinned: keep it verbatim so the user stays in
151
+ # full control; async layer uses the family default when one exists.
152
+ sync_uri = url
153
+ async_uri = f"{family}+{_ASYNC_DRIVERS[family]}{tail}" if family in _ASYNC_DRIVERS else None
154
+ return {"family": family, "sync_uri": sync_uri, "async_uri": async_uri}
155
+
156
+ # Bare scheme: map both layers onto the drivers this project ships.
157
+ sync_uri = f"{family}+{_SYNC_DRIVERS[family]}{tail}" if family in _SYNC_DRIVERS else url
158
+ async_uri = f"{family}+{_ASYNC_DRIVERS[family]}{tail}" if family in _ASYNC_DRIVERS else None
159
+ return {"family": family, "sync_uri": sync_uri, "async_uri": async_uri}
Agent/invariants.py ADDED
@@ -0,0 +1,499 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Invariant classification and enforcement for text2sql without hardcoded SQL templates.
2
+
3
+ All regeneration remains purely LLM-driven. We only express semantic/structural
4
+ constraints ("invariants") and ask the model to satisfy missing ones.
5
+
6
+ Categories:
7
+ MANAGER_LIST -> list current department managers
8
+ DEPARTMENT_LIST -> list department names
9
+ AVG_SALARY_BY_DEPT -> average current salary per department
10
+ TITLE_COUNT -> count employees with a given title (e.g. Senior Engineer)
11
+ GENERIC -> anything else (no special invariants)
12
+
13
+ Each invariant is represented as a dict:
14
+ {
15
+ 'name': short identifier,
16
+ 'description': human-readable guidance,
17
+ 'check': callable(sql:str)->bool
18
+ }
19
+
20
+ We DO NOT inject SQL fragments. We only:
21
+ - detect which invariants fail
22
+ - compile a focused regeneration prompt listing just the missing invariants
23
+ - request a corrected SQL (single statement ending with semicolon + LIMIT 100)
24
+
25
+ This preserves the "no hardcoded fallback query" policy.
26
+ """
27
+ from __future__ import annotations
28
+ import os
29
+ import re
30
+ from typing import List, Dict, Callable, Optional
31
+
32
+ CATEGORY_MANAGER_LIST = "MANAGER_LIST"
33
+ CATEGORY_DEPT_LIST = "DEPARTMENT_LIST"
34
+ CATEGORY_AVG_SALARY = "AVG_SALARY_BY_DEPT"
35
+ CATEGORY_TITLE_COUNT = "TITLE_COUNT"
36
+ CATEGORY_EMP_COUNT_BY_DEPT = "EMP_COUNT_BY_DEPT"
37
+ CATEGORY_GENERIC = "GENERIC"
38
+
39
+ # Newly added categories (extended taxonomy)
40
+ CATEGORY_SIMPLE_COUNT_EMP = "SIMPLE_COUNT_EMP"
41
+ CATEGORY_SIMPLE_COUNT_EMP_CURRENT = "SIMPLE_COUNT_EMP_CURRENT"
42
+ CATEGORY_SIMPLE_COUNT_DEPT = "SIMPLE_COUNT_DEPT"
43
+ CATEGORY_SALARY_EXTREMES_GLOBAL = "SALARY_EXTREMES_GLOBAL"
44
+ CATEGORY_SALARY_RANGE_BY_DEPT = "SALARY_RANGE_BY_DEPT"
45
+ CATEGORY_TOP_N_SALARIES = "TOP_N_SALARIES"
46
+ CATEGORY_DEPT_MANAGER_LIST = "DEPT_MANAGER_LIST" # dept + manager names
47
+ CATEGORY_MANAGER_TENURE = "MANAGER_TENURE"
48
+ CATEGORY_MANAGER_CHANGE_FREQUENCY = "MANAGER_CHANGE_FREQUENCY"
49
+ CATEGORY_TITLE_DISTINCT_COUNT = "TITLE_DISTINCT_COUNT"
50
+ CATEGORY_TITLE_SPECIFIC_COUNT = "TITLE_SPECIFIC_COUNT"
51
+ CATEGORY_TITLE_DISTRIBUTION_BY_DEPT = "TITLE_DISTRIBUTION_BY_DEPT"
52
+ CATEGORY_PROMOTION_PATH_ENGINEER_TO_SENIOR = "PROMOTION_PATH_ENGINEER_TO_SENIOR"
53
+ CATEGORY_EMP_TENURE_CURRENT_DEPT = "EMP_TENURE_CURRENT_DEPT"
54
+ CATEGORY_HIRING_TREND_BY_YEAR = "HIRING_TREND_BY_YEAR"
55
+ CATEGORY_SALARY_TREND_BY_YEAR = "SALARY_TREND_BY_YEAR"
56
+ CATEGORY_EMP_DEPT_CHANGES = "EMP_DEPT_CHANGES"
57
+ CATEGORY_GENDER_DIST_BY_DEPT = "GENDER_DIST_BY_DEPT"
58
+ CATEGORY_GENDER_PAY_GAP_BY_DEPT = "GENDER_PAY_GAP_BY_DEPT"
59
+ CATEGORY_FEMALE_MANAGERS_COUNT = "FEMALE_MANAGERS_COUNT"
60
+ CATEGORY_AVG_SALARY_BY_TITLE_AND_DEPT = "AVG_SALARY_BY_TITLE_AND_DEPT"
61
+ CATEGORY_GENDER_MANAGEMENT_COUNT = "GENDER_MANAGEMENT_COUNT"
62
+ CATEGORY_SENIOR_STAFF_SUPERLATIVE = "SENIOR_STAFF_SUPERLATIVE"
63
+
64
+ Category = str
65
+
66
+ # ---------------- Classification -----------------
67
+
68
+ def classify_question(question: str) -> Category:
69
+ q = question.lower()
70
+ # Specific order matters: more specialized patterns first
71
+ if any(k in q for k in ["top", "highest-paid", "highest paid"]) and "salary" in q:
72
+ return CATEGORY_TOP_N_SALARIES
73
+ if any(kw in q for kw in ["total number of employees", "total employees"]) or ("count" in q and "employee" in q and "department" not in q and "current" not in q):
74
+ return CATEGORY_SIMPLE_COUNT_EMP
75
+ if ("how many" in q or "count" in q) and "currently" in q and "employee" in q:
76
+ return CATEGORY_SIMPLE_COUNT_EMP_CURRENT
77
+ if ("how many" in q or "number of" in q or "count" in q) and "departments" in q and "manager" not in q:
78
+ return CATEGORY_SIMPLE_COUNT_DEPT
79
+ if any(w in q for w in ["highest", "lowest"]) and "salary" in q and "department" not in q:
80
+ return CATEGORY_SALARY_EXTREMES_GLOBAL
81
+ if "salary range" in q and "department" in q:
82
+ return CATEGORY_SALARY_RANGE_BY_DEPT
83
+ if "most employees" in q and "department" in q:
84
+ return CATEGORY_EMP_COUNT_BY_DEPT
85
+ if "highest average salary" in q and "department" in q:
86
+ return CATEGORY_AVG_SALARY
87
+ if any(k in q for k in ["manager", "managers"]) and "department" in q:
88
+ if "tenure" in q or "long" in q or "position" in q:
89
+ return CATEGORY_MANAGER_TENURE
90
+ if "changed" in q or "changes" in q or "frequently" in q:
91
+ return CATEGORY_MANAGER_CHANGE_FREQUENCY
92
+ if "list" in q and "manager" in q and "department" in q:
93
+ return CATEGORY_DEPT_MANAGER_LIST
94
+ return CATEGORY_MANAGER_LIST
95
+ if ("how many" in q or "count" in q) and "job title" in q and ("exist" in q or "different" in q):
96
+ return CATEGORY_TITLE_DISTINCT_COUNT
97
+ if ("how many" in q or "count" in q) and any(t in q for t in ["senior engineer", "senior engineers"]):
98
+ return CATEGORY_TITLE_SPECIFIC_COUNT
99
+ if "distribution" in q and "title" in q and "department" in q:
100
+ return CATEGORY_TITLE_DISTRIBUTION_BY_DEPT
101
+ if "promoted" in q and "engineer" in q and "senior engineer" in q:
102
+ return CATEGORY_PROMOTION_PATH_ENGINEER_TO_SENIOR
103
+ if ("how long" in q or "tenure" in q) and "current" in q and "department" in q and "employee" in q:
104
+ return CATEGORY_EMP_TENURE_CURRENT_DEPT
105
+ if ("hiring trend" in q) or ("hire" in q and "year" in q):
106
+ return CATEGORY_HIRING_TREND_BY_YEAR
107
+ if ("salaries" in q or "salary" in q) and "changed" in q and ("over time" in q or "year" in q):
108
+ return CATEGORY_SALARY_TREND_BY_YEAR
109
+ if "changed departments" in q or ("employees" in q and "changed" in q and "department" in q):
110
+ return CATEGORY_EMP_DEPT_CHANGES
111
+ if "gender distribution" in q and "department" in q:
112
+ return CATEGORY_GENDER_DIST_BY_DEPT
113
+ if "gender pay gap" in q and "department" in q:
114
+ return CATEGORY_GENDER_PAY_GAP_BY_DEPT
115
+ if ("female" in q and "manager" in q and ("how many" in q or "count" in q)):
116
+ return CATEGORY_FEMALE_MANAGERS_COUNT
117
+ if "average salary" in q and "title" in q and "department" in q:
118
+ return CATEGORY_AVG_SALARY_BY_TITLE_AND_DEPT
119
+ if ("gender" in q and "management" in q) or ("each gender" in q and "management" in q):
120
+ return CATEGORY_GENDER_MANAGEMENT_COUNT
121
+ if ("most" in q and "senior" in q and "staff" in q) or ("senior staff" in q and "most" in q):
122
+ return CATEGORY_SENIOR_STAFF_SUPERLATIVE
123
+ if any(k in q for k in ["list departments", "department names", "department name", "departments list"]):
124
+ return CATEGORY_DEPT_LIST
125
+ if "average" in q and "salary" in q and "department" in q:
126
+ return CATEGORY_AVG_SALARY
127
+ if ("count" in q or "how many" in q or "number of" in q) and any(t in q for t in ["engineer", "engineers", "title"]):
128
+ return CATEGORY_TITLE_COUNT
129
+ if ("count" in q or "how many" in q or "number of" in q or any(s in q for s in ["most", "largest", "highest", "fewest", "least"])) and "department" in q and ("employee" in q or "employees" in q):
130
+ return CATEGORY_EMP_COUNT_BY_DEPT
131
+ return CATEGORY_GENERIC
132
+
133
+ # --------------- Invariant Builders ---------------
134
+
135
+ def _regex(pattern: str) -> Callable[[str], bool]:
136
+ rx = re.compile(pattern, re.IGNORECASE)
137
+ return lambda sql: bool(rx.search(sql))
138
+
139
+ def _contains_all(*subs: str) -> Callable[[str], bool]:
140
+ def check(sql: str) -> bool:
141
+ l = sql.lower()
142
+ return all(s.lower() in l for s in subs)
143
+ return check
144
+
145
+ def build_invariants(category: Category, question: str) -> List[Dict[str, any]]:
146
+ inv: List[Dict[str, any]] = []
147
+ if category == CATEGORY_MANAGER_LIST:
148
+ inv += [
149
+ {"name": "has_department_join", "description": "Join department (alias d) with dept_manager (alias dm)", "check": lambda s: re.search(r"join\s+dept_manager", s, re.IGNORECASE) and re.search(r"from\s+department", s, re.IGNORECASE)},
150
+ {"name": "has_employee_join", "description": "Join employee (alias e) for manager names", "check": _regex(r"join\s+employee")},
151
+ {"name": "selects_names", "description": "Select employee first_name and last_name", "check": lambda s: all(x in s.lower() for x in ["first_name", "last_name"])},
152
+ {"name": "filters_current", "description": "Filter current managers dm.to_date='9999-01-01'", "check": _regex(r"dm\.to_date\s*=\s*'9999-01-01'")},
153
+ {"name": "limit_100", "description": "Ends with LIMIT 100 semicolon", "check": _regex(r"limit\s+100;?\s*$")},
154
+ ]
155
+ elif category == CATEGORY_DEPT_LIST:
156
+ inv += [
157
+ {"name": "from_department", "description": "Query FROM department table", "check": _regex(r"from\s+department")},
158
+ {"name": "select_dept_name", "description": "Select dept_name column", "check": _regex(r"dept_name")},
159
+ {"name": "limit_100", "description": "Ends with LIMIT 100", "check": _regex(r"limit\s+100;?\s*$")},
160
+ ]
161
+ elif category == CATEGORY_AVG_SALARY:
162
+ inv += [
163
+ {"name": "joins_salary", "description": "Join salary s (FROM salary s)", "check": _regex(r"from\s+salary\s+s")},
164
+ {"name": "joins_dept_emp", "description": "Join dept_emp de", "check": _regex(r"join\s+dept_emp")},
165
+ {"name": "joins_department", "description": "Join department d", "check": _regex(r"join\s+department")},
166
+ {"name": "avg_salary", "description": "Uses AVG(s.salary)", "check": _regex(r"avg\s*\(\s*s\.salary\s*\)")},
167
+ {"name": "current_filters", "description": "Filters current rows s.to_date='9999-01-01' and de.to_date='9999-01-01'", "check": lambda s: "s.to_date='9999-01-01'" in s.lower() and "de.to_date='9999-01-01'" in s.lower()},
168
+ {"name": "group_by_dept", "description": "GROUP BY department name", "check": _regex(r"group\s+by\s+.*dept_name")},
169
+ {"name": "limit_100", "description": "Ends with LIMIT 100", "check": _regex(r"limit\s+100;?\s*$")},
170
+ ]
171
+ elif category == CATEGORY_TITLE_COUNT:
172
+ # Attempt to infer canonical title (not used in invariants; regeneration prompt may hint)
173
+ inv += [
174
+ {"name": "from_title", "description": "FROM title table (alias t)", "check": _regex(r"from\s+title")},
175
+ {"name": "alias_t", "description": "Alias 't' used for title table", "check": _regex(r"from\s+title\s+(?:as\s+)?t")},
176
+ {"name": "current_rows", "description": "Filter current rows t.to_date='9999-01-01'", "check": _regex(r"t\.to_date\s*=\s*'9999-01-01'")},
177
+ {"name": "count_distinct", "description": "COUNT(DISTINCT t.emp_no)", "check": _regex(r"count\s*\(\s*distinct\s+t\.emp_no\s*\)")},
178
+ {"name": "has_title_filter", "description": "Filter on t.title = '<Some Title>'", "check": _regex(r"t\.title\s*=\s*'[^']+'")} ,
179
+ {"name": "limit_100", "description": "Ends with LIMIT 100", "check": _regex(r"limit\s+100;?\s*$")},
180
+ ]
181
+ elif category == CATEGORY_EMP_COUNT_BY_DEPT:
182
+ inv += [
183
+ {"name": "has_dept_emp_join", "description": "Join dept_emp de with department d", "check": lambda s: re.search(r"join\s+dept_emp", s, re.IGNORECASE) and re.search(r"join\s+department|from\s+department", s, re.IGNORECASE)},
184
+ {"name": "select_dept_name", "description": "Select d.dept_name", "check": _regex(r"d\.dept_name|dept_name")},
185
+ {"name": "select_count", "description": "Include COUNT(*) or COUNT(de.emp_no)", "check": _regex(r"count\s*\(")},
186
+ {"name": "group_by", "description": "GROUP BY d.dept_name present", "check": _regex(r"group\s+by\s+.*dept_name")},
187
+ {"name": "limit_100", "description": "Ends with LIMIT 100", "check": _regex(r"limit\s+100;?\s*$")},
188
+ {"name": "count_alias", "description": "Provide an explicit alias e.g. COUNT(*) AS employee_count", "check": _regex(r"count\s*\(.*\)\s+as\s+employee_count")},
189
+ ]
190
+ # If the question is superlative-oriented, encourage ordering
191
+ ql = question.lower()
192
+ if any(w in ql for w in ["most", "largest", "highest", "fewest", "least"]):
193
+ inv.append({"name": "order_by_count", "description": "ORDER BY employee_count DESC (or ASC for fewest/least)", "check": lambda s: ("fewest" in ql or "least" in ql and re.search(r"order\s+by\s+employee_count\s+asc", s, re.IGNORECASE)) or re.search(r"order\s+by\s+employee_count\s+desc", s, re.IGNORECASE)})
194
+ elif category == CATEGORY_SIMPLE_COUNT_EMP:
195
+ inv += [
196
+ {"name": "from_employee", "description": "FROM employee table", "check": _regex(r"from\s+employee")},
197
+ {"name": "count_all", "description": "COUNT(*) with alias total_employees", "check": _regex(r"count\s*\(\s*\*\s*\)\s+as\s+total_employees")},
198
+ {"name": "limit_100", "description": "Ends with LIMIT 100", "check": _regex(r"limit\s+100;?\s*$")},
199
+ ]
200
+ elif category == CATEGORY_SIMPLE_COUNT_EMP_CURRENT:
201
+ inv += [
202
+ {"name": "join_dept_emp", "description": "Join dept_emp de", "check": _regex(r"join\s+dept_emp")},
203
+ {"name": "current_filter", "description": "de.to_date='9999-01-01' filter", "check": _regex(r"de\.to_date\s*=\s*'9999-01-01'")},
204
+ {"name": "count_distinct_emp", "description": "COUNT(DISTINCT de.emp_no) alias current_employee_count", "check": _regex(r"count\s*\(\s*distinct\s+de\.emp_no\s*\)\s+as\s+current_employee_count")},
205
+ {"name": "limit_100", "description": "Ends with LIMIT 100", "check": _regex(r"limit\s+100;?\s*$")},
206
+ ]
207
+ elif category == CATEGORY_SIMPLE_COUNT_DEPT:
208
+ inv += [
209
+ {"name": "from_department", "description": "FROM department", "check": _regex(r"from\s+department")},
210
+ {"name": "count_depts", "description": "COUNT(*) AS department_count", "check": _regex(r"count\s*\(\s*\*\s*\)\s+as\s+department_count")},
211
+ {"name": "limit_100", "description": "Ends with LIMIT 100", "check": _regex(r"limit\s+100;?\s*$")},
212
+ ]
213
+ elif category == CATEGORY_SALARY_EXTREMES_GLOBAL:
214
+ # Extremely strict invariants for highest/lowest salary by department
215
+ inv += [
216
+ {"name": "from_salary_s", "description": "FROM salary s", "check": _regex(r"from\s+salary\s+s")},
217
+ {"name": "join_dept_emp_de", "description": "JOIN dept_emp de ON s.emp_no = de.emp_no", "check": _regex(r"join\s+dept_emp\s+de\s+on\s+s\.emp_no\s*=\s*de\.emp_no")},
218
+ {"name": "join_department_d", "description": "JOIN department d ON de.dept_no = d.dept_no", "check": _regex(r"join\s+department\s+d\s+on\s+de\.dept_no\s*=\s*d\.dept_no")},
219
+ {"name": "select_dept_name", "description": "SELECT d.dept_name", "check": _regex(r"select\s+d\.dept_name")},
220
+ {"name": "select_max_min_salary", "description": "SELECT MAX(s.salary) AS highest_salary, MIN(s.salary) AS lowest_salary", "check": lambda s: re.search(r"max\s*\(\s*s\.salary\s*\)\s+as\s+highest_salary", s, re.IGNORECASE) and re.search(r"min\s*\(\s*s\.salary\s*\)\s+as\s+lowest_salary", s, re.IGNORECASE)},
221
+ {"name": "group_by_dept_name", "description": "GROUP BY d.dept_name", "check": _regex(r"group\s+by\s+d\.dept_name")},
222
+ {"name": "limit_100", "description": "Ends with LIMIT 100", "check": _regex(r"limit\s+100;?\s*$")},
223
+ {"name": "no_unaliased_salary", "description": "Do not use MAX(salary) or MIN(salary) without s. alias", "check": lambda s: not re.search(r"max\s*\(\s*salary\s*\)", s, re.IGNORECASE) and not re.search(r"min\s*\(\s*salary\s*\)", s, re.IGNORECASE)},
224
+ {"name": "no_unaliased_dept_name", "description": "Do not use dept_name without d. alias", "check": lambda s: not re.search(r"[^a-zA-Z0-9_]dept_name", s) or re.search(r"d\.dept_name", s)},
225
+ ]
226
+ elif category == CATEGORY_SALARY_RANGE_BY_DEPT:
227
+ # Stricter invariants for salary range by department
228
+ inv += [
229
+ {"name": "joins_salary", "description": "FROM salary s", "check": _regex(r"from\s+salary\s+s")},
230
+ {"name": "joins_dept_emp", "description": "Join dept_emp de", "check": _regex(r"join\s+dept_emp")},
231
+ {"name": "joins_department", "description": "Join department d", "check": _regex(r"join\s+department")},
232
+ {"name": "select_dept_name", "description": "Select d.dept_name", "check": _regex(r"d\.dept_name")},
233
+ {"name": "min_max", "description": "MIN(s.salary) & MAX(s.salary)", "check": lambda s: re.search(r"min\s*\(\s*s\.salary", s, re.IGNORECASE) and re.search(r"max\s*\(\s*s\.salary", s, re.IGNORECASE)},
234
+ {"name": "dept_filter", "description": "Filter on d.dept_name=...", "check": _regex(r"d\.dept_name\s*=\s*'")},
235
+ {"name": "group_by_dept", "description": "GROUP BY d.dept_name", "check": _regex(r"group\s+by\s+.*d\.dept_name")},
236
+ {"name": "limit_100", "description": "Ends with LIMIT 100", "check": _regex(r"limit\s+100;?\s*$")},
237
+ ]
238
+ elif category == CATEGORY_TOP_N_SALARIES:
239
+ inv += [
240
+ {"name": "joins_salary", "description": "FROM salary s", "check": _regex(r"from\s+salary\s+s")},
241
+ {"name": "current_filter", "description": "s.to_date='9999-01-01'", "check": _regex(r"s\.to_date\s*=\s*'9999-01-01'")},
242
+ {"name": "order_desc", "description": "ORDER BY s.salary DESC", "check": _regex(r"order\s+by\s+s\.salary\s+desc")},
243
+ {"name": "limit_present", "description": "Has a LIMIT clause", "check": _regex(r"limit\s+\d+")},
244
+ ]
245
+ elif category == CATEGORY_DEPT_MANAGER_LIST:
246
+ inv += [
247
+ {"name": "joins_dept_manager", "description": "Join dept_manager dm", "check": _regex(r"join\s+dept_manager")},
248
+ {"name": "joins_employee", "description": "Join employee e", "check": _regex(r"join\s+employee")},
249
+ {"name": "select_names", "description": "Select manager first_name / last_name", "check": lambda s: "first_name" in s.lower() and "last_name" in s.lower()},
250
+ {"name": "dept_name", "description": "Select dept_name", "check": _regex(r"dept_name")},
251
+ {"name": "current_filter", "description": "dm.to_date='9999-01-01'", "check": _regex(r"dm\.to_date\s*=\s*'9999-01-01'")},
252
+ {"name": "limit_100", "description": "Ends with LIMIT 100", "check": _regex(r"limit\s+100;?\s*$")},
253
+ ]
254
+ elif category == CATEGORY_MANAGER_TENURE:
255
+ inv += [
256
+ {"name": "joins_dept_manager", "description": "Join dept_manager dm", "check": _regex(r"join\s+dept_manager")},
257
+ {"name": "current_filter", "description": "dm.to_date='9999-01-01'", "check": _regex(r"dm\.to_date\s*=\s*'9999-01-01'")},
258
+ {"name": "tenure_expr", "description": "Contains dm.from_date for tenure calc", "check": _regex(r"dm\.from_date")},
259
+ {"name": "limit_100", "description": "Ends with LIMIT 100", "check": _regex(r"limit\s+100;?\s*$")},
260
+ ]
261
+ elif category == CATEGORY_MANAGER_CHANGE_FREQUENCY:
262
+ inv += [
263
+ {"name": "from_dept_manager", "description": "FROM dept_manager", "check": _regex(r"from\s+dept_manager")},
264
+ {"name": "group_by_dept", "description": "GROUP BY dept_no or dept", "check": _regex(r"group\s+by\s+.*dept")},
265
+ {"name": "count_changes", "description": "COUNT(*) or COUNT(DISTINCT emp_no)", "check": _regex(r"count\s*\(")},
266
+ {"name": "order_desc", "description": "ORDER BY count desc", "check": _regex(r"order\s+by\s+.*count.*desc")},
267
+ {"name": "limit_100", "description": "Ends with LIMIT 100", "check": _regex(r"limit\s+100;?\s*$")},
268
+ ]
269
+ elif category == CATEGORY_TITLE_DISTINCT_COUNT:
270
+ inv += [
271
+ {"name": "from_title", "description": "FROM title t", "check": _regex(r"from\s+title")},
272
+ {"name": "count_distinct_titles", "description": "COUNT(DISTINCT t.title) alias title_count", "check": _regex(r"count\s*\(\s*distinct\s+t\.title\s*\)\s+as\s+title_count")},
273
+ {"name": "limit_100", "description": "Ends with LIMIT 100", "check": _regex(r"limit\s+100;?\s*$")},
274
+ ]
275
+ elif category == CATEGORY_TITLE_SPECIFIC_COUNT:
276
+ inv += [
277
+ {"name": "from_title", "description": "FROM title t", "check": _regex(r"from\s+title")},
278
+ {"name": "title_filter", "description": "Filter t.title='Senior Engineer'", "check": _regex(r"t\.title\s*=\s*'senior engineer'")},
279
+ {"name": "current_filter", "description": "t.to_date='9999-01-01'", "check": _regex(r"t\.to_date\s*=\s*'9999-01-01'")},
280
+ {"name": "count_distinct_emp", "description": "COUNT(DISTINCT t.emp_no)", "check": _regex(r"count\s*\(\s*distinct\s+t\.emp_no")},
281
+ {"name": "limit_100", "description": "Ends with LIMIT 100", "check": _regex(r"limit\s+100;?\s*$")},
282
+ ]
283
+ elif category == CATEGORY_TITLE_DISTRIBUTION_BY_DEPT:
284
+ inv += [
285
+ {"name": "joins_title", "description": "Join title t", "check": _regex(r"join\s+title")},
286
+ {"name": "joins_dept_emp", "description": "Join dept_emp de", "check": _regex(r"join\s+dept_emp")},
287
+ {"name": "joins_department", "description": "Join department d", "check": _regex(r"join\s+department")},
288
+ {"name": "current_filters", "description": "t.to_date & de.to_date current filters", "check": lambda s: "t.to_date='9999-01-01'" in s.lower() and "de.to_date='9999-01-01'" in s.lower()},
289
+ {"name": "group_by", "description": "GROUP BY dept and title", "check": _regex(r"group\s+by\s+.*(dept|title).*(title|dept)")},
290
+ {"name": "limit_100", "description": "Ends with LIMIT 100", "check": _regex(r"limit\s+100;?\s*$")},
291
+ ]
292
+ elif category == CATEGORY_PROMOTION_PATH_ENGINEER_TO_SENIOR:
293
+ inv += [
294
+ {"name": "dual_title_refs", "description": "References title table twice (t1, t2)", "check": _regex(r"title\s+t1.*title\s+t2|title\s+t2.*title\s+t1")},
295
+ {"name": "promotion_condition", "description": "t1.title='Engineer' AND t2.title='Senior Engineer'", "check": _regex(r"t1\.title\s*=\s*'engineer'.*t2\.title\s*=\s*'senior engineer'|t2\.title\s*=\s*'senior engineer'.*t1\.title\s*=\s*'engineer'")},
296
+ {"name": "temporal_order", "description": "t1.from_date < t2.from_date", "check": _regex(r"t1\.from_date\s*<\s*t2\.from_date")},
297
+ {"name": "distinct_emp", "description": "DISTINCT emp_no selected", "check": _regex(r"select\s+distinct\s+t1\.emp_no|select\s+distinct\s+t2\.emp_no")},
298
+ {"name": "limit_100", "description": "Ends with LIMIT 100", "check": _regex(r"limit\s+100;?\s*$")},
299
+ ]
300
+ elif category == CATEGORY_EMP_TENURE_CURRENT_DEPT:
301
+ inv += [
302
+ {"name": "joins_dept_emp", "description": "FROM dept_emp de", "check": _regex(r"from\s+dept_emp")},
303
+ {"name": "current_filter", "description": "de.to_date='9999-01-01'", "check": _regex(r"de\.to_date\s*=\s*'9999-01-01'")},
304
+ {"name": "tenure_expr", "description": "Uses de.from_date", "check": _regex(r"de\.from_date")},
305
+ {"name": "limit_100", "description": "Ends with LIMIT 100", "check": _regex(r"limit\s+100;?\s*$")},
306
+ ]
307
+ elif category == CATEGORY_HIRING_TREND_BY_YEAR:
308
+ inv += [
309
+ {"name": "from_employee", "description": "FROM employee e", "check": _regex(r"from\s+employee")},
310
+ {"name": "year_extract", "description": "EXTRACT(YEAR FROM hire_date)", "check": _regex(r"extract\s*\(\s*year\s+from\s+.*hire_date")},
311
+ {"name": "group_by_year", "description": "GROUP BY year", "check": _regex(r"group\s+by\s+.*year")},
312
+ {"name": "limit_100", "description": "Ends with LIMIT 100", "check": _regex(r"limit\s+100;?\s*$")},
313
+ ]
314
+ elif category == CATEGORY_SALARY_TREND_BY_YEAR:
315
+ inv += [
316
+ {"name": "from_salary", "description": "FROM salary s", "check": _regex(r"from\s+salary")},
317
+ {"name": "year_extract", "description": "EXTRACT(YEAR FROM s.from_date)", "check": _regex(r"extract\s*\(\s*year\s+from\s+s\.from_date")},
318
+ {"name": "avg_salary", "description": "AVG(s.salary)", "check": _regex(r"avg\s*\(\s*s\.salary")},
319
+ {"name": "group_by_year", "description": "GROUP BY year", "check": _regex(r"group\s+by\s+.*year")},
320
+ {"name": "limit_100", "description": "Ends with LIMIT 100", "check": _regex(r"limit\s+100;?\s*$")},
321
+ ]
322
+ elif category == CATEGORY_EMP_DEPT_CHANGES:
323
+ inv += [
324
+ {"name": "from_dept_emp", "description": "FROM dept_emp de", "check": _regex(r"from\s+dept_emp")},
325
+ {"name": "group_by_emp", "description": "GROUP BY de.emp_no", "check": _regex(r"group\s+by\s+.*emp_no")},
326
+ {"name": "having_multiple", "description": "HAVING COUNT(DISTINCT dept_no) > 1", "check": _regex(r"having\s+count\s*\(\s*distinct\s+dept_no\s*\)\s*>\s*1")},
327
+ {"name": "limit_100", "description": "Ends with LIMIT 100", "check": _regex(r"limit\s+100;?\s*$")},
328
+ ]
329
+ elif category == CATEGORY_GENDER_DIST_BY_DEPT:
330
+ inv += [
331
+ {"name": "joins_employee", "description": "Join employee e", "check": _regex(r"join\s+employee")},
332
+ {"name": "joins_dept_emp", "description": "Join dept_emp de", "check": _regex(r"join\s+dept_emp")},
333
+ {"name": "joins_department", "description": "Join department d", "check": _regex(r"join\s+department")},
334
+ {"name": "current_filter", "description": "de.to_date='9999-01-01'", "check": _regex(r"de\.to_date\s*=\s*'9999-01-01'")},
335
+ {"name": "group_by_dept_gender", "description": "GROUP BY dept & gender", "check": _regex(r"group\s+by\s+.*(dept|gender).*(gender|dept)")},
336
+ {"name": "limit_100", "description": "Ends with LIMIT 100", "check": _regex(r"limit\s+100;?\s*$")},
337
+ ]
338
+ elif category == CATEGORY_GENDER_PAY_GAP_BY_DEPT:
339
+ inv += [
340
+ {"name": "joins_salary", "description": "Join salary s", "check": _regex(r"join\s+salary")},
341
+ {"name": "joins_employee", "description": "Join employee e", "check": _regex(r"join\s+employee")},
342
+ {"name": "joins_dept_emp", "description": "Join dept_emp de", "check": _regex(r"join\s+dept_emp")},
343
+ {"name": "joins_department", "description": "Join department d", "check": _regex(r"join\s+department")},
344
+ {"name": "current_filters", "description": "Current rows s.to_date & de.to_date", "check": lambda s: "s.to_date='9999-01-01'" in s.lower() and "de.to_date='9999-01-01'" in s.lower()},
345
+ {"name": "avg_salary", "description": "AVG(s.salary)", "check": _regex(r"avg\s*\(\s*s\.salary")},
346
+ {"name": "group_by_dept_gender", "description": "GROUP BY dept & gender", "check": _regex(r"group\s+by\s+.*(dept|gender).*(gender|dept)")},
347
+ {"name": "limit_100", "description": "Ends with LIMIT 100", "check": _regex(r"limit\s+100;?\s*$")},
348
+ ]
349
+ elif category == CATEGORY_FEMALE_MANAGERS_COUNT:
350
+ inv += [
351
+ {"name": "joins_dept_manager", "description": "Join dept_manager dm", "check": _regex(r"join\s+dept_manager")},
352
+ {"name": "joins_employee", "description": "Join employee e", "check": _regex(r"join\s+employee")},
353
+ {"name": "female_filter", "description": "e.gender='F'", "check": _regex(r"e\.gender\s*=\s*'f'")},
354
+ {"name": "current_filter", "description": "dm.to_date='9999-01-01'", "check": _regex(r"dm\.to_date\s*=\s*'9999-01-01'")},
355
+ {"name": "count_distinct_mgr", "description": "COUNT(DISTINCT dm.emp_no)", "check": _regex(r"count\s*\(\s*distinct\s+dm\.emp_no")},
356
+ {"name": "limit_100", "description": "Ends with LIMIT 100", "check": _regex(r"limit\s+100;?\s*$")},
357
+ ]
358
+ elif category == CATEGORY_AVG_SALARY_BY_TITLE_AND_DEPT:
359
+ inv += [
360
+ {"name": "joins_salary", "description": "Join salary s", "check": _regex(r"join\s+salary")},
361
+ {"name": "joins_title", "description": "Join title t", "check": _regex(r"join\s+title")},
362
+ {"name": "joins_dept_emp", "description": "Join dept_emp de", "check": _regex(r"join\s+dept_emp")},
363
+ {"name": "joins_department", "description": "Join department d", "check": _regex(r"join\s+department")},
364
+ {"name": "current_filters", "description": "Current rows for s,de,t", "check": lambda s: all(x in s.lower() for x in ["s.to_date='9999-01-01'", "de.to_date='9999-01-01'", "t.to_date='9999-01-01'"])},
365
+ {"name": "avg_salary", "description": "AVG(s.salary)", "check": _regex(r"avg\s*\(\s*s\.salary")},
366
+ {"name": "group_by", "description": "GROUP BY dept & title", "check": _regex(r"group\s+by\s+.*(dept|title).*(title|dept)")},
367
+ {"name": "limit_100", "description": "Ends with LIMIT 100", "check": _regex(r"limit\s+100;?\s*$")},
368
+ ]
369
+ elif category == CATEGORY_GENDER_MANAGEMENT_COUNT:
370
+ inv += [
371
+ {"name": "joins_dept_manager", "description": "Join dept_manager dm", "check": _regex(r"join\s+dept_manager")},
372
+ {"name": "joins_employee", "description": "Join employee e", "check": _regex(r"join\s+employee")},
373
+ {"name": "current_filter", "description": "dm.to_date='9999-01-01'", "check": _regex(r"dm\.to_date\s*=\s*'9999-01-01'")},
374
+ {"name": "group_by_gender", "description": "GROUP BY gender", "check": _regex(r"group\s+by\s+.*gender")},
375
+ {"name": "count_mgr", "description": "COUNT(*) or COUNT(dm.emp_no)", "check": _regex(r"count\s*\(")},
376
+ {"name": "limit_100", "description": "Ends with LIMIT 100", "check": _regex(r"limit\s+100;?\s*$")},
377
+ ]
378
+ elif category == CATEGORY_SENIOR_STAFF_SUPERLATIVE:
379
+ inv += [
380
+ {"name": "joins_title", "description": "Join title t", "check": _regex(r"join\s+title")},
381
+ {"name": "joins_dept_emp", "description": "Join dept_emp de", "check": _regex(r"join\s+dept_emp")},
382
+ {"name": "joins_department", "description": "Join department d", "check": _regex(r"join\s+department")},
383
+ {"name": "senior_filter", "description": "t.title LIKE 'Senior%'", "check": _regex(r"t\.title\s+like\s+'senior%'")},
384
+ {"name": "current_filters", "description": "Current rows de.to_date & t.to_date", "check": lambda s: "de.to_date='9999-01-01'" in s.lower() and "t.to_date='9999-01-01'" in s.lower()},
385
+ {"name": "group_by_dept", "description": "GROUP BY d.dept_name", "check": _regex(r"group\s+by\s+.*dept_name")},
386
+ {"name": "order_desc", "description": "ORDER BY count desc", "check": _regex(r"order\s+by\s+.*count.*desc")},
387
+ {"name": "limit_100", "description": "Ends with LIMIT 100", "check": _regex(r"limit\s+100;?\s*$")},
388
+ ]
389
+ return inv
390
+
391
+ # --------------- Enforcement -----------------
392
+
393
+ def evaluate_invariants(sql: str, invariants: List[Dict[str, any]]) -> List[Dict[str, any]]:
394
+ failures = []
395
+ for inv in invariants:
396
+ try:
397
+ ok = inv['check'](sql)
398
+ except Exception:
399
+ ok = False
400
+ if not ok:
401
+ failures.append(inv)
402
+ return failures
403
+
404
+
405
+ # More explicit prompt for join-based salary extremes queries
406
+ REGEN_PROMPT_TEMPLATE = (
407
+ "You produced SQL for the user question. Some required invariants are missing.\n"
408
+ "Regenerate a SINGLE valid PostgreSQL SQL query that satisfies ALL listed invariants.\n"
409
+ "Return ONLY the SQL (no commentary). Must end with LIMIT 100; and a semicolon.\n"
410
+ "If the question is about highest/lowest salary by department, you MUST:\n"
411
+ "- Use FROM salary s\n"
412
+ "- JOIN dept_emp de ON s.emp_no = de.emp_no\n"
413
+ "- JOIN department d ON de.dept_no = d.dept_no\n"
414
+ "- SELECT d.dept_name, MAX(s.salary) AS highest_salary, MIN(s.salary) AS lowest_salary\n"
415
+ "- GROUP BY d.dept_name\n"
416
+ "- Use correct table aliases everywhere (no unaliased salary or dept_name)\n"
417
+ "- Do NOT reference columns that do not exist in the schema\n"
418
+ "User Question: {question}\n"
419
+ "Previous Attempt: {previous_sql}\n"
420
+ "Missing Invariants:\n{invariant_lines}\n"
421
+ "Regenerate now:"
422
+ )
423
+
424
+
425
+ def regenerate_with_constraints(question: str, previous_sql: str, missing: List[Dict[str, any]], llm, run_llm_fn, attempt: int) -> Optional[str]:
426
+ invariant_lines = "\n".join(f"- {m['name']}: {m['description']}" for m in missing)
427
+ prompt = REGEN_PROMPT_TEMPLATE.format(question=question, previous_sql=previous_sql, invariant_lines=invariant_lines)
428
+ # Use proper timeout values instead of hardcoded ones
429
+ # Start with a good timeout and decrease gradually for subsequent attempts
430
+ base_timeout = float(os.environ.get("INVARIANTS_BASE_TIMEOUT", 90)) # Start with 90s
431
+ timeout = max(30.0, base_timeout - attempt * 20.0) # Decrease by 20s per attempt, minimum 30s
432
+ try:
433
+ raw = run_llm_fn(llm, prompt, timeout=max(8.0, timeout), retries=0)
434
+ # Normalize raw response to text
435
+ raw_text = getattr(raw, 'text', None)
436
+ if raw_text is None:
437
+ raw_text = str(raw)
438
+ # Extract first SELECT ... ;
439
+ m = re.search(r"(SELECT[\s\S]+?;)", raw_text, flags=re.IGNORECASE)
440
+ candidate = m.group(1) if m else raw_text.strip()
441
+ # Clean markdown fences
442
+ candidate = re.sub(r"```(?:sql)?|```", "", candidate, flags=re.IGNORECASE).strip()
443
+ # Ensure single statement & required LIMIT 100 at end
444
+ # Collapse accidental mid-statement semicolon before LIMIT
445
+ candidate = re.sub(r";\s*(LIMIT\s+\d+)", r" \1", candidate, flags=re.IGNORECASE)
446
+ # Append LIMIT 100 if missing (invariants will still verify)
447
+ if 'limit' not in candidate.lower():
448
+ if candidate.endswith(';'):
449
+ candidate = candidate[:-1] + ' LIMIT 100;'
450
+ else:
451
+ candidate += ' LIMIT 100;'
452
+ # Guarantee trailing semicolon
453
+ if not candidate.strip().endswith(';'):
454
+ candidate += ';'
455
+ return candidate
456
+ except Exception as e:
457
+ print(f"[INVARIANTS] Regeneration failed: {e}")
458
+ return None
459
+
460
+
461
+ def enforce_invariants(question: str, sql: str, llm, run_llm_fn, max_regen: int = 2) -> Dict[str, any]:
462
+ category = classify_question(question)
463
+ if category == CATEGORY_GENERIC:
464
+ return {"category": category, "final_sql": sql, "regenerations": []}
465
+ # Dynamic schema support: the invariant catalog is purpose-built for the
466
+ # employee demo schema. For any other database, enforcement is bypassed
467
+ # and only the generic structural validation pipeline applies.
468
+ try:
469
+ try:
470
+ from .agentic_workflow import ACTIVE_SCHEMA_PROFILE as _asp
471
+ except Exception:
472
+ import Agent.agentic_workflow as _aw
473
+ _asp = getattr(_aw, "ACTIVE_SCHEMA_PROFILE", None)
474
+ if _asp is not None and not getattr(_asp, "is_employee_db", True):
475
+ print(f"[INVARIANTS] Bypassed for non-employee schema '{getattr(_asp, 'name', '?')}' (category={category})")
476
+ return {"category": CATEGORY_GENERIC, "final_sql": sql, "regenerations": []}
477
+ except Exception:
478
+ pass # Profile unavailable — default legacy behavior (enforce)
479
+ invariants = build_invariants(category, question)
480
+ regenerations = []
481
+ current_sql = sql
482
+ # Increase max_regen to 5 for more LLM attempts
483
+ for attempt in range(max_regen + 4):
484
+ missing = evaluate_invariants(current_sql, invariants)
485
+ if not missing:
486
+ return {"category": category, "final_sql": current_sql, "regenerations": regenerations}
487
+ if attempt == max_regen:
488
+ # Give up, return last with missing list for transparency
489
+ return {"category": category, "final_sql": current_sql, "regenerations": regenerations, "remaining_missing": [m['name'] for m in missing]}
490
+ regen_sql = regenerate_with_constraints(question, current_sql, missing, llm, run_llm_fn, attempt)
491
+ if not regen_sql:
492
+ return {"category": category, "final_sql": current_sql, "regenerations": regenerations, "remaining_missing": [m['name'] for m in missing]}
493
+ regenerations.append({
494
+ "attempt": attempt + 1,
495
+ "missing_before": [m['name'] for m in missing],
496
+ "sql": regen_sql
497
+ })
498
+ current_sql = regen_sql
499
+ return {"category": category, "final_sql": current_sql, "regenerations": regenerations}
Agent/mcp_server.py ADDED
@@ -0,0 +1,630 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import FastAPI, HTTPException
2
+ from pydantic import BaseModel
3
+ from typing import Any, Dict, Optional, List
4
+ import asyncio
5
+ import importlib
6
+ import uuid
7
+ import os
8
+ import re
9
+
10
+ # Attempt to import agent workflow for schema/inspector & utilities (optional)
11
+ try:
12
+ import Agent.agentic_workflow as aw
13
+ print(f"[MCP STARTUP] Successfully imported Agent.agentic_workflow")
14
+ except Exception as e:
15
+ print(f"[MCP STARTUP] Failed to import Agent.agentic_workflow: {e}")
16
+ aw = None
17
+
18
+ app = FastAPI(title="Minimal MCP Server (dev)")
19
+
20
+ # Simple tool registry
21
+ TOOLS: Dict[str, Any] = {}
22
+
23
+
24
+ class CompleteRequest(BaseModel):
25
+ prompt: str
26
+ context: Optional[Dict[str, Any]] = None
27
+ timeout: Optional[float] = 30.0
28
+
29
+
30
+ def register_tool(name: str, fn: Any):
31
+ TOOLS[name] = fn
32
+
33
+
34
+ async def _call_tool(name: str, args: Dict[str, Any]) -> Any:
35
+ if name not in TOOLS:
36
+ raise KeyError(f"Tool '{name}' not registered")
37
+ fn = TOOLS[name]
38
+ if asyncio.iscoroutinefunction(fn):
39
+ return await fn(**(args or {}))
40
+ else:
41
+ # run sync in threadpool
42
+ loop = asyncio.get_running_loop()
43
+ return await loop.run_in_executor(None, lambda: fn(**(args or {})))
44
+
45
+
46
+ @app.on_event("startup")
47
+ async def _startup():
48
+ # Register built-in/mock tools lazily to avoid importing heavy modules at import time
49
+ # Try to register a real document scanner implementation; otherwise register a mock
50
+ ds_registered = None
51
+ try:
52
+ from .tools import document_scanner as ds
53
+ register_tool("document_scanner.process", ds.process_image)
54
+ ds_registered = f"Agent.tools.document_scanner.process_image (relative import)"
55
+ except Exception:
56
+ # If relative import fails (running as script), try absolute import
57
+ try:
58
+ import Agent.tools.document_scanner as ds2
59
+ register_tool("document_scanner.process", ds2.process_image)
60
+ ds_registered = f"Agent.tools.document_scanner.process_image (absolute import)"
61
+ except Exception:
62
+ # Register a fallback mock tool
63
+ def _mock_doc(**kwargs):
64
+ # Accept arbitrary keyword args (image_url, image_bytes, etc.) to be tolerant
65
+ return {"doc_id": str(uuid.uuid4()), "text": "(mock OCR output)", "metadata": {"pages": 1, "confidence": 0.0}, "received_args": kwargs}
66
+ register_tool("document_scanner.process", _mock_doc)
67
+ ds_registered = "mock(document_scanner.process)"
68
+
69
+ # Log which document scanner implementation was registered for easier debugging
70
+ try:
71
+ print(f"[MCP STARTUP] Registered document_scanner.process -> {ds_registered}")
72
+ except Exception:
73
+ pass
74
+
75
+ # Optional Groq Vision health check in cloud mode
76
+ try:
77
+ from .tools import groq_vision_health
78
+ hc = groq_vision_health.health_check()
79
+ if not hc.get("ok", True):
80
+ print(f"[MCP STARTUP] Groq Vision health warning: {hc.get('error')} (model={hc.get('model')})")
81
+ else:
82
+ print(f"[MCP STARTUP] Groq Vision health: ok (model={hc.get('model')})")
83
+ except Exception as e:
84
+ print(f"[MCP STARTUP] Groq Vision health check skipped: {e}")
85
+
86
+ # Register Granite Vision direct visual Q&A tool
87
+ gv_registered = None
88
+ try:
89
+ from .tools import granite_vision as gv
90
+ register_tool("granite_vision.qa", gv.qa)
91
+ gv_registered = "Agent.tools.granite_vision.qa (relative import)"
92
+ except Exception as e1:
93
+ print(f"[MCP STARTUP] granite_vision relative import FAILED: {type(e1).__name__}: {e1}")
94
+ try:
95
+ import Agent.tools.granite_vision as gv2
96
+ register_tool("granite_vision.qa", gv2.qa)
97
+ gv_registered = "Agent.tools.granite_vision.qa (absolute import)"
98
+ except Exception as e2:
99
+ print(f"[MCP STARTUP] granite_vision absolute import FAILED: {type(e2).__name__}: {e2}")
100
+ def _mock_gv(**kwargs):
101
+ return {"answer": "(granite_vision unavailable - mock)", "model": "mock", "received_args": kwargs}
102
+ register_tool("granite_vision.qa", _mock_gv)
103
+ gv_registered = "mock(granite_vision.qa)"
104
+ print(f"[MCP STARTUP] Registered granite_vision.qa -> {gv_registered}")
105
+
106
+
107
+ # Register OCR QA composite tool: runs OCR then runs the agent OCR QA helper
108
+ try:
109
+ # Use the global aw variable instead of re-importing
110
+ if not aw:
111
+ raise ImportError("Agent workflow not available")
112
+
113
+ async def _ocr_qa_tool(image_url: Optional[str] = None, image_bytes: Optional[bytes] = None, question: Optional[str] = None, **kwargs):
114
+ # Call the document scanner tool first (use the registered one to allow mocks)
115
+ ds_fn = TOOLS.get("document_scanner.process")
116
+ if not ds_fn:
117
+ raise RuntimeError("document_scanner.process not registered")
118
+
119
+ loop = asyncio.get_running_loop()
120
+ try:
121
+ if asyncio.iscoroutinefunction(ds_fn):
122
+ tool_res = await ds_fn(image_url=image_url, image_bytes=image_bytes, options=kwargs)
123
+ else:
124
+ tool_res = await loop.run_in_executor(None, lambda: ds_fn(image_url=image_url, image_bytes=image_bytes, options=kwargs))
125
+ except Exception as e:
126
+ return {"error": f"OCR tool failed: {e}"}
127
+
128
+ doc_id = tool_res.get("doc_id") if isinstance(tool_res, dict) else None
129
+ ocr_text = (tool_res.get("text") if isinstance(tool_res, dict) else str(tool_res)) or ""
130
+
131
+ # Persist OCR text so downstream callers can retrieve it via doc_id
132
+ try:
133
+ if doc_id and ocr_text:
134
+ docs_dir = os.path.join("chat_store", "docs")
135
+ os.makedirs(docs_dir, exist_ok=True)
136
+ doc_path = os.path.join(docs_dir, f"{doc_id}.txt")
137
+ # Write file (overwrite if exists)
138
+ with open(doc_path, "w", encoding="utf-8") as df:
139
+ df.write(ocr_text)
140
+ # Also add a short history entry if agent chat store available
141
+ try:
142
+ if hasattr(aw, 'chat_store_private') and hasattr(aw, 'ChatMessage') and hasattr(aw, 'MessageRole'):
143
+ user_msg = aw.ChatMessage(role=aw.MessageRole.USER, content=f"Uploaded document {doc_id}")
144
+ assistant_msg = aw.ChatMessage(role=aw.MessageRole.ASSISTANT, content=f"OCR stored: {ocr_text[:400]}")
145
+ aw.chat_store_private.add_message(key="conversation", message=user_msg)
146
+ aw.chat_store_private.add_message(key="conversation", message=assistant_msg)
147
+ try:
148
+ aw.chat_store_private.persist(str(aw.private_store_path))
149
+ except Exception:
150
+ pass
151
+ except Exception:
152
+ pass
153
+ except Exception:
154
+ # Non-fatal: continue even if persistence fails
155
+ pass
156
+
157
+ # If a question was provided, answer it using the agent helper (run in executor to avoid blocking)
158
+ if question:
159
+ try:
160
+ # Use executor if helper is sync to avoid blocking event loop
161
+ if callable(getattr(aw, 'ocr_agent_qa', None)):
162
+ answer = await loop.run_in_executor(None, lambda: aw.ocr_agent_qa(question, doc_id))
163
+ return {"doc_id": doc_id, "answer": answer}
164
+ else:
165
+ return {"doc_id": doc_id, "answer": "ocr_agent_qa not available"}
166
+ except Exception as e:
167
+ return {"error": f"ocr_agent_qa failed: {e}", "tool_result": tool_res}
168
+
169
+ # No question: return the OCR result and doc_id
170
+ return {"doc_id": doc_id, "ocr_text": ocr_text}
171
+
172
+ register_tool("ocr_qa", _ocr_qa_tool)
173
+ print(f"[MCP STARTUP] Registered ocr_qa -> real _ocr_qa_tool (agent available)")
174
+ except Exception:
175
+ # If agent import fails, register a tolerant mock tool
176
+ def _ocr_qa_mock(**kwargs):
177
+ return {"doc_id": str(uuid.uuid4()), "answer": "(ocr_qa unavailable - mock response)", "received_args": kwargs}
178
+ register_tool("ocr_qa", _ocr_qa_mock)
179
+ print(f"[MCP STARTUP] Registered ocr_qa -> mock(ocr_qa)")
180
+
181
+ # ------------------------------------------------------------------
182
+ # Deterministic schema-aware SQL helper tools (agentic compliant)
183
+ # ------------------------------------------------------------------
184
+ ENABLE_FAST_SQL = os.environ.get("ENABLE_MCP_FAST_TOOLS", "1") in ("1","true","True")
185
+ if not ENABLE_FAST_SQL:
186
+ print("[MCP STARTUP] Fast SQL tools disabled via ENABLE_MCP_FAST_TOOLS=0")
187
+ return
188
+
189
+ # Initialize database connection if not already done
190
+ if not aw:
191
+ print("[MCP STARTUP][FAST] Agent workflow not available; skipping fast SQL tool registration.")
192
+ return
193
+
194
+ if not getattr(aw, 'inspector', None) or not getattr(aw, 'available_tables', None):
195
+ print("[MCP STARTUP][FAST] Database not initialized; attempting to initialize...")
196
+ try:
197
+ # Initialize database connection - use await since we're in async context.
198
+ # Priority chain mirrors worker startup: 1) env DB 2) active schema
199
+ # profile from the registry 3) bundled demo employee SQLite file.
200
+ db_uri = os.environ.get("DB_CONNECTION_URL")
201
+ if not db_uri:
202
+ demo_db_path = os.path.join(
203
+ os.path.dirname(os.path.dirname(os.path.abspath(__file__))),
204
+ "employee-sample-database", "sqlite", "dataset_small", "employee.db",
205
+ )
206
+ try:
207
+ from .schema_profile import profile_registry as _reg
208
+ _active = _reg.active() or {}
209
+ db_uri = _active.get("db_url")
210
+ except Exception:
211
+ db_uri = None
212
+ if not db_uri and os.path.isfile(demo_db_path):
213
+ db_uri = f"sqlite:///{demo_db_path.replace(os.sep, '/')}"
214
+ print("[MCP STARTUP][FAST] Using bundled demo employee database.")
215
+ if not db_uri:
216
+ print("[MCP STARTUP][FAST] No DB env, active profile, or bundled demo found; skipping fast SQL tool registration.")
217
+ return
218
+ db_result = await aw.initialize_database(db_uri)
219
+ if db_result.get("tables"):
220
+ print(f"[MCP STARTUP][FAST] Database initialized with {len(db_result['tables'])} tables")
221
+ else:
222
+ print("[MCP STARTUP][FAST] Database initialization failed; skipping fast SQL tool registration.")
223
+ return
224
+ except Exception as db_err:
225
+ print(f"[MCP STARTUP][FAST] Database initialization error: {db_err}; skipping fast SQL tool registration.")
226
+ return
227
+
228
+ inspector = aw.inspector
229
+ available_tables = aw.available_tables
230
+
231
+ def _colnames(table: str) -> List[str]:
232
+ try:
233
+ return [c['name'] for c in inspector.get_columns(table_name=table)]
234
+ except Exception:
235
+ return []
236
+
237
+ def _has_tables(*tables: str) -> bool:
238
+ at_lower = {t.lower() for t in available_tables}
239
+ return all(t.lower() in at_lower for t in tables)
240
+
241
+ # Simple validation & sanitization re-use
242
+ validate_sql_query = getattr(aw, 'validate_sql_query', lambda q: {"valid": True})
243
+ fix_common_sql_errors = getattr(aw, 'fix_common_sql_errors', lambda q: q)
244
+
245
+ async def _verify_sql(sql: str, question: str, tag: str) -> str:
246
+ """Optional light LLM verification (short prompt) if LLM available."""
247
+ if not aw or not getattr(aw, 'Settings', None) or not getattr(aw.Settings, 'llm', None):
248
+ return sql
249
+ try:
250
+ _schema_block = ""
251
+ try:
252
+ if aw.ACTIVE_SCHEMA_PROFILE.is_employee_db:
253
+ _schema_block = aw.EMPLOYEE_DB_SCHEMA
254
+ else:
255
+ _schema_block = aw.ACTIVE_SCHEMA_PROFILE.build_digest(max_tables=10)
256
+ except Exception:
257
+ _schema_block = ""
258
+ prompt = (
259
+ (f"{_schema_block}\n\n" if _schema_block else "")
260
+ + "You are an SQL verifier."
261
+ + f" Tag={tag}."
262
+ + " If the candidate SQL is valid and uses only existing tables/columns keep it."
263
+ " If SMALL fixes (alias, LIMIT 100, semicolon) needed, fix them. Never invent tables/columns."
264
+ f"\nQuestion: {question}\nCandidate SQL:\n{sql}\nReturn ONLY final SQL." )
265
+ resp = aw.Settings.llm.complete(prompt=prompt)
266
+ txt = getattr(resp, 'text', str(resp)).strip()
267
+ if '```' in txt:
268
+ parts = re.split(r"```(?:sql)?", txt, flags=re.IGNORECASE)
269
+ txt = '\n'.join(p for p in parts if 'select' in p.lower() or 'with' in p.lower())
270
+ if txt.lower().startswith('sql'):
271
+ txt = txt[3:].strip()
272
+ txt = fix_common_sql_errors(txt)
273
+ v = validate_sql_query(txt)
274
+ if v.get('valid'):
275
+ return txt
276
+ except Exception as ve:
277
+ print(f"[FAST][VERIFY][WARN] Verification failed: {ve}; using original SQL")
278
+ return sql
279
+
280
+ def _build_sql(select_cols: List[str], base_table: str, joins: Optional[List[str]] = None,
281
+ where: Optional[List[str]] = None, group_by: Optional[List[str]] = None,
282
+ order_by: Optional[str] = None, limit: Optional[int] = 100) -> str:
283
+ parts = ["SELECT " + ", ".join(select_cols), "FROM " + base_table]
284
+ for j in (joins or []):
285
+ parts.append(j)
286
+ if where:
287
+ parts.append("WHERE " + " AND ".join(where))
288
+ if group_by:
289
+ parts.append("GROUP BY " + ", ".join(group_by))
290
+ if order_by:
291
+ parts.append("ORDER BY " + order_by)
292
+ if limit is not None:
293
+ parts.append(f"LIMIT {limit}")
294
+ sql = " ".join(parts)
295
+ if not sql.strip().endswith(';'):
296
+ sql += ';'
297
+ return sql
298
+
299
+ async def tool_list_departments(question: str = ""):
300
+ if not _has_tables('department'):
301
+ return {"error": "department table not available"}
302
+ cols = _colnames('department')
303
+ name_col = 'dept_name' if 'dept_name' in cols else (cols[0] if cols else 'dept_name')
304
+ sql = _build_sql([f"d.{name_col} AS department_name"], 'department d', order_by='department_name ASC')
305
+ sql = fix_common_sql_errors(sql)
306
+ sql = await _verify_sql(sql, question or 'List departments', 'list_departments')
307
+ return {"sql": sql}
308
+
309
+ async def tool_count_employees(question: str = ""):
310
+ if not _has_tables('employee'):
311
+ return {"error": "employee table not available"}
312
+ sql = _build_sql(["COUNT(*) AS total_employees"], 'employee e', limit=None)
313
+ sql = fix_common_sql_errors(sql)
314
+ sql = await _verify_sql(sql, question or 'Total employees', 'count_employees')
315
+ return {"sql": sql}
316
+
317
+ async def tool_employee_count_by_department(question: str = ""):
318
+ if not _has_tables('department','dept_emp'):
319
+ return {"error": "required tables missing"}
320
+ dcols = _colnames('department'); decols = _colnames('dept_emp')
321
+ dept_name = 'dept_name' if 'dept_name' in dcols else (dcols[0] if dcols else 'dept_name')
322
+ dept_no = 'dept_no' if 'dept_no' in dcols or 'dept_no' in decols else 'dept_no'
323
+ emp_no = 'emp_no' if 'emp_no' in decols else 'emp_no'
324
+ where = []
325
+ if 'to_date' in decols:
326
+ where.append("de.to_date = '9999-01-01'")
327
+ sql = _build_sql([f"d.{dept_name} AS department_name", f"COUNT(DISTINCT de.{emp_no}) AS employee_count"],
328
+ 'department d', joins=[f"JOIN dept_emp de ON d.{dept_no} = de.{dept_no}"],
329
+ where=where, group_by=[f"d.{dept_name}"], order_by='employee_count DESC')
330
+ sql = fix_common_sql_errors(sql)
331
+ sql = await _verify_sql(sql, question or 'Employees per department', 'employee_count_by_department')
332
+ return {"sql": sql}
333
+
334
+ async def tool_gender_pay_gap(question: str = ""):
335
+ if not _has_tables('department','dept_emp','employee','salary'):
336
+ return {"error": "required tables missing"}
337
+ scolumns = _colnames('salary')
338
+ sval = 'salary' if 'salary' in scolumns else ('amount' if 'amount' in scolumns else (scolumns[0] if scolumns else 'salary'))
339
+ where = ["de.to_date = '9999-01-01'", "s.to_date = '9999-01-01'"]
340
+ sql = _build_sql([
341
+ "d.dept_name",
342
+ f"AVG(CASE WHEN e.gender='M' THEN s.{sval} END) AS avg_male_salary",
343
+ f"AVG(CASE WHEN e.gender='F' THEN s.{sval} END) AS avg_female_salary",
344
+ f"(AVG(CASE WHEN e.gender='M' THEN s.{sval} END) - AVG(CASE WHEN e.gender='F' THEN s.{sval} END)) AS gap",
345
+ f"CASE WHEN AVG(CASE WHEN e.gender='M' THEN s.{sval} END)=0 THEN NULL ELSE ((AVG(CASE WHEN e.gender='M' THEN s.{sval} END) - AVG(CASE WHEN e.gender='F' THEN s.{sval} END))/NULLIF(AVG(CASE WHEN e.gender='M' THEN s.{sval} END),0))*100 END AS pct_gap"
346
+ ], 'department d',
347
+ joins=['JOIN dept_emp de ON d.dept_no = de.dept_no','JOIN employee e ON de.emp_no = e.emp_no','JOIN salary s ON e.emp_no = s.emp_no'],
348
+ where=where, group_by=['d.dept_name'], order_by='gap DESC')
349
+ sql = fix_common_sql_errors(sql)
350
+ sql = await _verify_sql(sql, question or 'Gender pay gap', 'gender_pay_gap')
351
+ return {"sql": sql}
352
+
353
+ async def tool_salary_extremes(question: str = ""):
354
+ if not _has_tables('salary'):
355
+ return {"error": "salary table missing"}
356
+ scolumns = _colnames('salary'); sval = 'salary' if 'salary' in scolumns else ('amount' if 'amount' in scolumns else (scolumns[0] if scolumns else 'salary'))
357
+ where = ["s.to_date = '9999-01-01'"] if 'to_date' in scolumns else []
358
+ sql = _build_sql([f"MAX(s.{sval}) AS highest_salary", f"MIN(s.{sval}) AS lowest_salary"], 'salary s', where=where, limit=None)
359
+ sql = fix_common_sql_errors(sql)
360
+ sql = await _verify_sql(sql, question or 'Salary extremes', 'salary_extremes')
361
+ return {"sql": sql}
362
+
363
+ async def tool_salary_range_department(department_name: str = "Development", question: str = ""):
364
+ if not _has_tables('department','dept_emp','salary'):
365
+ return {"error": "required tables missing"}
366
+ scolumns = _colnames('salary'); sval = 'salary' if 'salary' in scolumns else ('amount' if 'amount' in scolumns else (scolumns[0] if scolumns else 'salary'))
367
+ # Escape single quotes in department_name for SQL safety (basic)
368
+ escaped_dept = department_name.replace("'", "''")
369
+ where = ["de.to_date = '9999-01-01'", "s.to_date = '9999-01-01'", f"d.dept_name = '{escaped_dept}'"]
370
+ sql = _build_sql(["d.dept_name", f"MAX(s.{sval}) AS max_salary", f"MIN(s.{sval}) AS min_salary"], 'department d',
371
+ joins=['JOIN dept_emp de ON d.dept_no = de.dept_no','JOIN salary s ON de.emp_no = s.emp_no'],
372
+ where=where, group_by=['d.dept_name'], limit=None)
373
+ sql = fix_common_sql_errors(sql)
374
+ sql = await _verify_sql(sql, question or 'Department salary range', 'salary_range_department')
375
+ return {"sql": sql, "department": department_name}
376
+
377
+ async def tool_top_paid_employees(top_n: int = 10, question: str = ""):
378
+ if not _has_tables('employee','salary'):
379
+ return {"error": "required tables missing"}
380
+ scolumns = _colnames('salary'); sval = 'salary' if 'salary' in scolumns else (scolumns[0] if scolumns else 'salary')
381
+ where = ["s.to_date = '9999-01-01'"] if 'to_date' in scolumns else []
382
+ sql = _build_sql(["e.emp_no","e.first_name","e.last_name", f"s.{sval} AS salary"], 'employee e',
383
+ joins=['JOIN salary s ON e.emp_no = s.emp_no'], where=where,
384
+ order_by=f"s.{sval} DESC", limit=top_n)
385
+ sql = fix_common_sql_errors(sql)
386
+ sql = await _verify_sql(sql, question or 'Top paid employees', 'top_paid_employees')
387
+ return {"sql": sql, "top_n": top_n}
388
+
389
+ async def tool_department_highest_avg_salary(question: str = ""):
390
+ if not _has_tables('department','dept_emp','salary'):
391
+ return {"error": "required tables missing"}
392
+ scolumns = _colnames('salary'); sval = 'salary' if 'salary' in scolumns else (scolumns[0] if scolumns else 'salary')
393
+ where = ["de.to_date = '9999-01-01'", "s.to_date = '9999-01-01'"]
394
+ sql = _build_sql(["d.dept_name", f"AVG(s.{sval}) AS avg_salary"], 'department d',
395
+ joins=['JOIN dept_emp de ON d.dept_no = de.dept_no','JOIN salary s ON de.emp_no = s.emp_no'],
396
+ where=where, group_by=['d.dept_name'], order_by='avg_salary DESC', limit=1)
397
+ sql = fix_common_sql_errors(sql)
398
+ sql = await _verify_sql(sql, question or 'Department highest average salary', 'dept_highest_avg_salary')
399
+ return {"sql": sql}
400
+
401
+ async def tool_department_manager_listing(question: str = ""):
402
+ if not _has_tables('department','dept_manager','employee'):
403
+ return {"error": "required tables missing"}
404
+ where = ["dm.to_date = '9999-01-01'"]
405
+ sql = _build_sql(["d.dept_name AS department_name","e.first_name","e.last_name"], 'department d',
406
+ joins=['JOIN dept_manager dm ON d.dept_no = dm.dept_no','JOIN employee e ON dm.emp_no = e.emp_no'],
407
+ where=where, order_by='department_name ASC')
408
+ sql = fix_common_sql_errors(sql)
409
+ sql = await _verify_sql(sql, question or 'Department managers', 'department_manager_listing')
410
+ return {"sql": sql}
411
+
412
+ # NEW: Complex analytical tools for business intelligence
413
+ async def tool_gender_distribution_by_dept(question: str = ""):
414
+ if not _has_tables('department','dept_emp','employee'):
415
+ return {"error": "required tables missing"}
416
+ where = ["de.to_date = '9999-01-01'"]
417
+ sql = _build_sql([
418
+ "d.dept_name AS department_name",
419
+ "e.gender",
420
+ "COUNT(*) AS count",
421
+ "ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER (PARTITION BY d.dept_name), 2) AS percentage"
422
+ ], 'department d',
423
+ joins=['JOIN dept_emp de ON d.dept_no = de.dept_no','JOIN employee e ON de.emp_no = e.emp_no'],
424
+ where=where, group_by=['d.dept_name', 'e.gender'], order_by='department_name, gender')
425
+ sql = fix_common_sql_errors(sql)
426
+ sql = await _verify_sql(sql, question or 'Gender distribution by department', 'gender_distribution_by_dept')
427
+ return {"sql": sql}
428
+
429
+ async def tool_hiring_trend_by_year(question: str = ""):
430
+ if not _has_tables('employee'):
431
+ return {"error": "required table employee missing"}
432
+ sql = _build_sql([
433
+ "EXTRACT(YEAR FROM e.hire_date) AS hire_year",
434
+ "COUNT(*) AS employees_hired",
435
+ "COUNT(CASE WHEN e.gender='M' THEN 1 END) AS male_hires",
436
+ "COUNT(CASE WHEN e.gender='F' THEN 1 END) AS female_hires"
437
+ ], 'employee e', group_by=['EXTRACT(YEAR FROM e.hire_date)'], order_by='hire_year ASC')
438
+ sql = fix_common_sql_errors(sql)
439
+ sql = await _verify_sql(sql, question or 'Hiring trends by year', 'hiring_trend_by_year')
440
+ return {"sql": sql}
441
+
442
+ async def tool_employee_tenure_by_dept(question: str = ""):
443
+ if not _has_tables('department','dept_emp','employee'):
444
+ return {"error": "required tables missing"}
445
+ where = ["de.to_date = '9999-01-01'"]
446
+ sql = _build_sql([
447
+ "d.dept_name AS department_name",
448
+ "AVG(EXTRACT(DAYS FROM (CURRENT_DATE - e.hire_date))/365.25) AS avg_tenure_years",
449
+ "MIN(EXTRACT(DAYS FROM (CURRENT_DATE - e.hire_date))/365.25) AS min_tenure_years",
450
+ "MAX(EXTRACT(DAYS FROM (CURRENT_DATE - e.hire_date))/365.25) AS max_tenure_years"
451
+ ], 'department d',
452
+ joins=['JOIN dept_emp de ON d.dept_no = de.dept_no','JOIN employee e ON de.emp_no = e.emp_no'],
453
+ where=where, group_by=['d.dept_name'], order_by='avg_tenure_years DESC')
454
+ sql = fix_common_sql_errors(sql)
455
+ sql = await _verify_sql(sql, question or 'Employee tenure by department', 'employee_tenure_by_dept')
456
+ return {"sql": sql}
457
+
458
+ async def tool_female_managers_count(question: str = ""):
459
+ if not _has_tables('dept_manager','employee'):
460
+ return {"error": "required tables missing"}
461
+ where = ["dm.to_date = '9999-01-01'", "e.gender = 'F'"]
462
+ sql = _build_sql([
463
+ "COUNT(*) AS female_managers_count",
464
+ "COUNT(*) * 100.0 / (SELECT COUNT(*) FROM dept_manager dm2 WHERE dm2.to_date = '9999-01-01') AS percentage_female_managers"
465
+ ], 'dept_manager dm',
466
+ joins=['JOIN employee e ON dm.emp_no = e.emp_no'],
467
+ where=where, limit=None)
468
+ sql = fix_common_sql_errors(sql)
469
+ sql = await _verify_sql(sql, question or 'Female managers count', 'female_managers_count')
470
+ return {"sql": sql}
471
+
472
+ async def tool_avg_salary_by_title_dept(question: str = ""):
473
+ """Get average salary by title and department."""
474
+ if not _has_tables('department', 'dept_emp', 'salary', 'title', 'employee'):
475
+ return {"error": "required tables missing"}
476
+ where = ["de.to_date = '9999-01-01'", "s.to_date = '9999-01-01'", "t.to_date = '9999-01-01'"]
477
+ sql = _build_sql(["d.dept_name AS department_name", "t.title", "AVG(s.salary) AS avg_salary"], 'department d',
478
+ joins=['JOIN dept_emp de ON d.dept_no = de.dept_no',
479
+ 'JOIN employee e ON de.emp_no = e.emp_no',
480
+ 'JOIN salary s ON e.emp_no = s.emp_no',
481
+ 'JOIN title t ON e.emp_no = t.emp_no'],
482
+ where=where, group_by=['d.dept_name', 't.title'],
483
+ order_by='d.dept_name, avg_salary DESC', limit=100)
484
+ sql = fix_common_sql_errors(sql)
485
+ sql = await _verify_sql(sql, question or 'Average salary by title and department', 'avg_salary_by_title_dept')
486
+ return {"sql": sql}
487
+
488
+ # ---- Registration ----
489
+ # Dynamic schema support: the 14 fast_sql.* tools are purpose-built SQL
490
+ # skeletons for the employee demo schema. Register them only when the
491
+ # active profile IS the employee demo. Otherwise, register the generic
492
+ # schema-grounded tools that work on ANY database.
493
+ is_employee_profile = bool(
494
+ getattr(aw, 'ACTIVE_SCHEMA_PROFILE', None)
495
+ and aw.ACTIVE_SCHEMA_PROFILE.is_employee_db
496
+ )
497
+
498
+ if is_employee_profile:
499
+ register_tool('fast_sql.list_departments', tool_list_departments)
500
+ register_tool('fast_sql.count_employees', tool_count_employees)
501
+ register_tool('fast_sql.employee_count_by_department', tool_employee_count_by_department)
502
+ register_tool('fast_sql.gender_pay_gap', tool_gender_pay_gap) # RE-ENABLED: Complex analytical queries
503
+ register_tool('fast_sql.salary_extremes', tool_salary_extremes)
504
+ register_tool('fast_sql.salary_range_department', tool_salary_range_department)
505
+ register_tool('fast_sql.top_paid_employees', tool_top_paid_employees)
506
+ register_tool('fast_sql.department_highest_avg_salary', tool_department_highest_avg_salary)
507
+ register_tool('fast_sql.department_manager_listing', tool_department_manager_listing)
508
+
509
+ # Register new complex analytical tools
510
+ register_tool('fast_sql.gender_distribution_by_dept', tool_gender_distribution_by_dept)
511
+ register_tool('fast_sql.hiring_trend_by_year', tool_hiring_trend_by_year)
512
+ register_tool('fast_sql.employee_tenure_by_dept', tool_employee_tenure_by_dept)
513
+ register_tool('fast_sql.female_managers_count', tool_female_managers_count)
514
+ register_tool('fast_sql.avg_salary_by_title_dept', tool_avg_salary_by_title_dept)
515
+ print('[MCP STARTUP] Registered employee-demo fast SQL tools: '
516
+ + ', '.join([k for k in TOOLS if k.startswith('fast_sql.')]))
517
+ else:
518
+ # ---------- Generic schema-grounded tools (any database) ----------
519
+ def tool_schema_list_tables(**kwargs):
520
+ return {"tables": list(available_tables)}
521
+
522
+ def tool_schema_describe_table(table: str = "", **kwargs):
523
+ if not table:
524
+ return {"error": "table is required", "tables": list(available_tables)}
525
+ cols = _colnames(table)
526
+ if not cols:
527
+ # Case-insensitive retry
528
+ lower_map = {t.lower(): t for t in available_tables}
529
+ table = lower_map.get(table.lower())
530
+ if table:
531
+ cols = _colnames(table)
532
+ return {"table": table, "exists": bool(cols), "columns": cols}
533
+
534
+ def tool_schema_sample_data(table: str = "", limit: int = 3, **kwargs):
535
+ if not table:
536
+ return {"error": "table is required"}
537
+ try:
538
+ from sqlalchemy import text as _sa_text
539
+ safe_limit = max(1, min(int(limit), 10))
540
+ with aw.sql_database.connect() as conn:
541
+ rows = conn.execute(
542
+ _sa_text(f'SELECT * FROM "{table}" LIMIT {safe_limit}')
543
+ ).mappings().all()
544
+ return {"table": table, "rows": [dict(r) for r in rows]}
545
+ except Exception:
546
+ try:
547
+ from sqlalchemy import text as _sa_text
548
+ safe_limit = max(1, min(int(limit), 10))
549
+ with aw.sql_database.connect() as conn:
550
+ rows = conn.execute(
551
+ _sa_text(f"SELECT * FROM {table} LIMIT {safe_limit}")
552
+ ).mappings().all()
553
+ return {"table": table, "rows": [dict(r) for r in rows]}
554
+ except Exception as e2:
555
+ return {"table": table, "error": str(e2)}
556
+
557
+ async def tool_sql_build_select(select_cols: Optional[List[str]] = None, base_table: str = "",
558
+ joins: Optional[List[str]] = None, where: Optional[List[str]] = None,
559
+ group_by: Optional[List[str]] = None, order_by: Optional[str] = None,
560
+ limit: Optional[int] = 100, question: str = "", **kwargs):
561
+ """Deterministic schema-grounded SELECT builder: validates requested
562
+ columns against the live table, uses SQLAlchemy inspector, then an
563
+ optional light LLM refinement. Returns a validated SQL hint."""
564
+ cols = _colnames(base_table)
565
+ if not cols:
566
+ lower_map = {t.lower(): t for t in available_tables}
567
+ base_table = lower_map.get((base_table or "").lower(), base_table)
568
+ cols = _colnames(base_table)
569
+ if not cols:
570
+ return {"error": f"Unknown table '{base_table}'",
571
+ "tables": list(available_tables)}
572
+ _cols_lower = {str(c).lower(): str(c) for c in cols}
573
+ for raw in (select_cols or []):
574
+ # tokens like alias.col, col, COUNT(col) etc.
575
+ for tok in re.findall(r"[A-Za-z_][\w]*(?:\.[A-Za-z_]\w*)?", str(raw)):
576
+ t_, sep, c_ = tok.partition('.')
577
+ if sep and c_.lower() not in _cols_lower and c_.lower() != '1':
578
+ return {"error": f"Unknown column '{tok}' in table '{base_table}'",
579
+ "columns": cols,
580
+ "hint": "select base_table.column for aggregate args, e.g. COUNT(col)"}
581
+ sql = _build_sql(select_cols=select_cols, base_table=base_table, joins=joins,
582
+ where=where, group_by=group_by, order_by=order_by, limit=limit)
583
+ sql = fix_common_sql_errors(sql)
584
+ sql = await _verify_sql(sql, question or f"SELECT from {base_table}", f"build_select_{base_table}")
585
+ return {"sql": sql, "table": base_table, "columns": cols}
586
+
587
+ register_tool('schema.list_tables', tool_schema_list_tables)
588
+ register_tool('schema.describe_table', tool_schema_describe_table)
589
+ register_tool('schema.sample_data', tool_schema_sample_data)
590
+ register_tool('sql.build_select', tool_sql_build_select)
591
+ print('[MCP STARTUP] Registered GENERIC schema tools: '
592
+ + ', '.join([k for k in TOOLS if k.startswith('schema.') or k.startswith('sql.')]))
593
+ print('[MCP STARTUP] Skipping employee-demo fast_sql.* tools (non-employee schema active)')
594
+
595
+
596
+
597
+ @app.post("/complete")
598
+ async def complete(req: CompleteRequest):
599
+ """Minimal completion endpoint:
600
+ - If context contains {'tool_call': {'name': ..., 'args': {...}}}, the server will run the tool and return its result.
601
+ - Otherwise it returns a simple echo of the prompt under 'text'.
602
+ This scaffold is purposely small so you can extend tool orchestration later.
603
+ """
604
+ ctx = req.context or {}
605
+ # Tool invocation flow
606
+ if 'tool_call' in ctx:
607
+ tc = ctx['tool_call']
608
+ name = tc.get('name')
609
+ args = tc.get('args', {})
610
+ try:
611
+ tool_res = await _call_tool(name, args)
612
+ return {"text": f"Tool '{name}' executed.", "tool_result": tool_res}
613
+ except KeyError as ke:
614
+ raise HTTPException(status_code=404, detail=str(ke))
615
+ except Exception as e:
616
+ raise HTTPException(status_code=500, detail=f"Tool call failed: {e}")
617
+
618
+ # No tool requested: return a simple completion echo for now
619
+ # Future: integrate a local model here and tool loop orchestration
620
+ return {"text": req.prompt}
621
+
622
+
623
+ @app.get("/tools")
624
+ def list_tools():
625
+ return {"tools": list(TOOLS.keys())}
626
+
627
+
628
+ @app.get("/health")
629
+ def health():
630
+ return {"status": "ok", "tools_registered": len(TOOLS)}
Agent/schema_profile.py ADDED
@@ -0,0 +1,332 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import json
3
+ import time
4
+ import uuid
5
+ import threading
6
+ from typing import Any, Dict, List, Optional
7
+
8
+
9
+ class SchemaProfile:
10
+ """
11
+ Runtime schema profile representing the active database.
12
+ Stores tables, columns, PK/FK metadata, row counts, sample rows, and
13
+ a digest string suitable for injecting into LLM prompts.
14
+ """
15
+
16
+ SAMPLE_ROW_LIMIT = 3
17
+ MAX_DIGEST_TABLES = 40
18
+ MAX_DIGEST_COLUMNS = 25
19
+
20
+ def __init__(self, name: str, db_url: Optional[str] = None, is_demo: bool = False,
21
+ notes: str = ""):
22
+ self.name = name
23
+ self.db_url = db_url
24
+ self.is_demo = is_demo
25
+ # Owner-supplied schema notes (domain hints): column semantics, business
26
+ # rules, aliases. Injected verbatim into LLM prompts alongside the
27
+ # introspected digest. Stays empty unless the database owner writes it.
28
+ self.notes = (notes or "").strip()
29
+ self.tables: List[str] = []
30
+ self.columns_by_table: Dict[str, List[Dict[str, Any]]] = {}
31
+ self.pk_by_table: Dict[str, List[str]] = {}
32
+ self.fk_by_table: Dict[str, List[Dict[str, Any]]] = {}
33
+ self.row_counts: Dict[str, int] = {}
34
+ self.sample_rows: Dict[str, List[Dict[str, Any]]] = {}
35
+ self.available_tables_set: set = set()
36
+
37
+ @property
38
+ def is_employee_db(self) -> bool:
39
+ # Treat as employee demo if explicitly marked or name matches
40
+ if self.is_demo:
41
+ return True
42
+ n = (self.name or "").lower()
43
+ return "employee" in n or n == "demo_employee"
44
+
45
+ # ------------------------------------------------------------------
46
+ # Population
47
+ # ------------------------------------------------------------------
48
+ def populate_from_inspector(self, inspector: Any, engine: Optional[Any] = None) -> None:
49
+ """Fill all metadata from a SQLAlchemy inspector (and optionally sample
50
+ row counts / preview rows via a sync engine connection)."""
51
+ try:
52
+ tables = list(
53
+ t for t in (inspector.get_table_names() + inspector.get_view_names())
54
+ if not t.startswith("_")
55
+ )
56
+ except Exception as e:
57
+ print(f"[SCHEMA-PROFILE] inspector table listing failed: {e}")
58
+ tables = []
59
+
60
+ self.tables = sorted(tables)
61
+ self.available_tables_set = set(self.tables)
62
+ self.columns_by_table = {}
63
+ self.pk_by_table = {}
64
+ self.fk_by_table = {}
65
+
66
+ for t in self.tables:
67
+ try:
68
+ self.columns_by_table[t] = inspector.get_columns(t)
69
+ except Exception:
70
+ self.columns_by_table[t] = []
71
+ try:
72
+ pks = inspector.get_pk_constraint(t)
73
+ self.pk_by_table[t] = (pks or {}).get("constrained_columns", []) or []
74
+ except Exception:
75
+ self.pk_by_table[t] = []
76
+ try:
77
+ self.fk_by_table[t] = inspector.get_foreign_keys(t) or []
78
+ except Exception:
79
+ self.fk_by_table[t] = []
80
+
81
+ if engine is not None:
82
+ self._collect_row_stats(engine)
83
+
84
+ def _collect_row_stats(self, engine: Any) -> None:
85
+ """Best-effort row counts + small sample rows using a sync engine.
86
+
87
+ Dialect-aware so row previews also work on databases whose syntax for
88
+ limiting differs (mssql uses TOP, oracle 12c+ uses FETCH FIRST, mysql
89
+ prefers backtick-quoted identifiers, standard SQL uses LIMIT).
90
+ """
91
+ from sqlalchemy import text as sql_text
92
+
93
+ # Identifier quoting + limit syntax per dialect (best-effort)
94
+ dname = ""
95
+ try:
96
+ dname = (getattr(engine, "dialect", None).name or "").lower()
97
+ except Exception:
98
+ dname = ""
99
+
100
+ def q(name: str) -> str:
101
+ if dname == "mssql":
102
+ return f"[{name}]"
103
+ if dname in ("mysql", "mariadb"):
104
+ return f"`{name}`"
105
+ return f'"{name}"'
106
+
107
+ def sample_candidates(table: str):
108
+ limit = self.SAMPLE_ROW_LIMIT
109
+ quoted = q(table)
110
+ if dname == "mssql":
111
+ return [f"SELECT TOP {limit} * FROM {quoted}"]
112
+ if dname == "oracle":
113
+ # 12c+ thin driver supports FETCH FIRST; legacy ROWNUM fallback
114
+ return [
115
+ f"SELECT * FROM {quoted} FETCH FIRST {limit} ROWS ONLY",
116
+ f"SELECT * FROM {quoted} WHERE ROWNUM <= {limit}",
117
+ ]
118
+ # postgres / mysql / sqlite / everything else
119
+ return [
120
+ f"SELECT * FROM {quoted} LIMIT {limit}",
121
+ f"SELECT * FROM {table} LIMIT {limit}",
122
+ ]
123
+
124
+ self.row_counts = {}
125
+ self.sample_rows = {}
126
+ try:
127
+ with engine.connect() as conn:
128
+ for t in self.tables:
129
+ # Row count (quoted identifier first, unquoted fallback)
130
+ try:
131
+ cnt = conn.execute(sql_text(f"SELECT COUNT(*) FROM {q(t)}")).scalar()
132
+ self.row_counts[t] = int(cnt) if cnt is not None else 0
133
+ except Exception:
134
+ try:
135
+ cnt = conn.execute(sql_text(f"SELECT COUNT(*) FROM {t}")).scalar()
136
+ self.row_counts[t] = int(cnt) if cnt is not None else 0
137
+ except Exception:
138
+ self.row_counts[t] = 0
139
+ # Sample rows (first successful candidate wins)
140
+ if self.row_counts.get(t, 0) > 0:
141
+ for sql_c in sample_candidates(t):
142
+ try:
143
+ result = conn.execute(sql_text(sql_c))
144
+ rows = result.mappings().all()
145
+ self.sample_rows[t] = [
146
+ {k: _json_safe(v) for k, v in dict(r).items()} for r in rows
147
+ ]
148
+ break
149
+ except Exception:
150
+ continue
151
+ else:
152
+ self.sample_rows[t] = []
153
+ else:
154
+ self.sample_rows[t] = []
155
+ except Exception as e:
156
+ print(f"[SCHEMA-PROFILE] row stats collection failed: {e}")
157
+
158
+ # ------------------------------------------------------------------
159
+ # Digest for LLM prompts
160
+ # ------------------------------------------------------------------
161
+ def build_digest(self, max_tables: Optional[int] = None) -> str:
162
+ max_tables = max_tables or self.MAX_DIGEST_TABLES
163
+ lines: List[str] = []
164
+ lines.append(f"Database schema name: {self.name}")
165
+ lines.append(f"Number of tables/views: {len(self.tables)}")
166
+ lines.append("Tables and columns:")
167
+ for t in self.tables[:max_tables]:
168
+ cols = self.columns_by_table.get(t, [])
169
+ col_parts = []
170
+ for c in cols[: self.MAX_DIGEST_COLUMNS]:
171
+ ctype = str(c.get("type", ""))[:24]
172
+ col_parts.append(f"{c.get('name')} {ctype}".strip())
173
+ colstr = ", ".join(col_parts) if col_parts else "(no columns)"
174
+ rc = self.row_counts.get(t)
175
+ lines.append(f" - {t} ({colstr}) [rows={rc if rc is not None else '?'}]")
176
+ fks = self.fk_by_table.get(t, [])
177
+ for fk in fks[:4]:
178
+ ref = fk.get("referred_table")
179
+ lcols = fk.get("constrained_columns") or []
180
+ rcols = fk.get("referred_columns") or []
181
+ if ref:
182
+ lines.append(f" FK: {lcols} -> {ref}({rcols})")
183
+ if len(cols) > self.MAX_DIGEST_COLUMNS:
184
+ lines.append(f" ... {len(cols) - self.MAX_DIGEST_COLUMNS} more columns")
185
+ if len(self.tables) > max_tables:
186
+ lines.append(f" ... {len(self.tables) - max_tables} more tables")
187
+ return "\n".join(lines)
188
+
189
+ def summarize(self) -> Dict[str, Any]:
190
+ """Compact JSON-friendly summary (for API responses / UI)."""
191
+ return {
192
+ "name": self.name,
193
+ "db_url": self.db_url,
194
+ "is_demo": self.is_demo,
195
+ "is_employee_db": self.is_employee_db,
196
+ "notes": self.notes,
197
+ "tables": [
198
+ {
199
+ "name": t,
200
+ "row_count": self.row_counts.get(t),
201
+ "columns": [c.get("name") for c in self.columns_by_table.get(t, [])],
202
+ "sample_rows": self.sample_rows.get(t, []),
203
+ }
204
+ for t in self.tables
205
+ ],
206
+ }
207
+
208
+
209
+ def _json_safe(v: Any) -> Any:
210
+ try:
211
+ json.dumps(v)
212
+ return v
213
+ except (TypeError, ValueError):
214
+ return str(v)
215
+
216
+
217
+ class ProfileRegistry:
218
+ """
219
+ Registry of user-registered database profiles.
220
+
221
+ Each registry entry stores lightweight metadata (id, name, db_url, kind).
222
+ Full introspection happens lazily when a profile is switched to (the
223
+ agent's initialize_database walks the schema at that moment).
224
+ """
225
+
226
+ def __init__(self, store_path: str):
227
+ self.store_path = store_path
228
+ self._lock = threading.Lock()
229
+ self.profiles: Dict[str, Dict[str, Any]] = {}
230
+ self.active_id: Optional[str] = None
231
+ self.load()
232
+
233
+ # ------------------------------------------------------------------
234
+ def load(self) -> None:
235
+ try:
236
+ if os.path.exists(self.store_path):
237
+ with open(self.store_path, "r", encoding="utf-8") as fh:
238
+ data = json.load(fh)
239
+ self.profiles = data.get("profiles", {})
240
+ self.active_id = data.get("active_id")
241
+ except Exception as e:
242
+ print(f"[PROFILE-REGISTRY] load failed: {e}")
243
+ self.profiles = {}
244
+ self.active_id = None
245
+
246
+ def save(self) -> None:
247
+ with self._lock:
248
+ try:
249
+ os.makedirs(os.path.dirname(self.store_path), exist_ok=True)
250
+ with open(self.store_path, "w", encoding="utf-8") as fh:
251
+ json.dump(
252
+ {"profiles": self.profiles, "active_id": self.active_id},
253
+ fh,
254
+ indent=2,
255
+ )
256
+ except Exception as e:
257
+ print(f"[PROFILE-REGISTRY] save failed: {e}")
258
+
259
+ # ------------------------------------------------------------------
260
+ def list(self) -> List[Dict[str, Any]]:
261
+ out = []
262
+ for pid, p in self.profiles.items():
263
+ out.append(
264
+ {
265
+ "id": pid,
266
+ "name": p.get("name"),
267
+ "kind": p.get("kind", "user"),
268
+ "db_url": p.get("db_url"),
269
+ "created_at": p.get("created_at"),
270
+ "notes": p.get("notes", ""),
271
+ "active": pid == self.active_id,
272
+ }
273
+ )
274
+ return sorted(out, key=lambda p: (not p["active"], p.get("created_at") or 0))
275
+
276
+ def get(self, profile_id: str) -> Optional[Dict[str, Any]]:
277
+ return self.profiles.get(profile_id)
278
+
279
+ def active(self) -> Optional[Dict[str, Any]]:
280
+ if self.active_id and self.active_id in self.profiles:
281
+ return {"id": self.active_id, **self.profiles[self.active_id]}
282
+ return None
283
+
284
+ def add(
285
+ self,
286
+ name: str,
287
+ db_url: str,
288
+ kind: str = "user",
289
+ activate: bool = True,
290
+ notes: Optional[str] = None,
291
+ ) -> Dict[str, Any]:
292
+ pid = uuid.uuid4().hex[:12]
293
+ entry = {
294
+ "name": name,
295
+ "db_url": db_url,
296
+ "kind": kind,
297
+ "created_at": time.time(),
298
+ "notes": (notes or "").strip(),
299
+ }
300
+ with self._lock:
301
+ self.profiles[pid] = entry
302
+ if activate or self.active_id is None:
303
+ self.active_id = pid
304
+ self.save()
305
+ return {"id": pid, **entry}
306
+
307
+ def remove(self, profile_id: str) -> bool:
308
+ with self._lock:
309
+ if profile_id not in self.profiles:
310
+ return False
311
+ del self.profiles[profile_id]
312
+ if self.active_id == profile_id:
313
+ self.active_id = next(iter(self.profiles), None)
314
+ self.save()
315
+ return True
316
+
317
+ def switch(self, profile_id: str) -> Optional[Dict[str, Any]]:
318
+ with self._lock:
319
+ if profile_id not in self.profiles:
320
+ return None
321
+ self.active_id = profile_id
322
+ self.save()
323
+ return {"id": profile_id, **self.profiles[profile_id]}
324
+
325
+ def set_notes(self, profile_id: str, notes: str) -> bool:
326
+ """Persist owner-supplied schema notes (domain hints) for a profile."""
327
+ with self._lock:
328
+ if profile_id not in self.profiles:
329
+ return False
330
+ self.profiles[profile_id]["notes"] = (notes or "").strip()
331
+ self.save()
332
+ return True
Agent/tools/granite_vision.py ADDED
@@ -0,0 +1,121 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Vision MCP tool - visual Q&A via Groq Vision API.
3
+
4
+ Cloud path : image -> Groq Vision -> structured answer
5
+ Local path : image -> Ollama qwen2-vl -> answer (dev only)
6
+
7
+ Registered in mcp_server.py as 'granite_vision.qa'.
8
+ """
9
+ import os
10
+ import base64
11
+ import requests
12
+ from typing import Optional
13
+
14
+
15
+ def qa(image_path: str, question: str, model_path: Optional[str] = None) -> dict:
16
+ """Answer a question about a document image using Groq Vision or local Ollama."""
17
+
18
+ print(f"[vision.qa] image={image_path} question={question[:80]}")
19
+
20
+ # CLOUD MODE: Groq Vision API
21
+ if os.environ.get("USE_HF_CLOUD", "0") in ("1", "true", "True"):
22
+ groq_key = os.environ.get("GROQ_API_KEY")
23
+ groq_model = os.environ.get("GROQ_VISION_MODEL", "qwen/qwen3.8-27b")
24
+
25
+ if groq_key:
26
+ print(f"[granite_vision.qa] CLOUD MODE: {groq_model} via Groq")
27
+ try:
28
+ from groq import Groq
29
+
30
+ client = Groq(api_key=groq_key)
31
+
32
+ with open(image_path, "rb") as f:
33
+ img_b64 = base64.b64encode(f.read()).decode("utf-8")
34
+
35
+ ext = os.path.splitext(image_path)[-1].lower().lstrip(".")
36
+ mime = "image/jpeg" if ext in ("jpg", "jpeg") else f"image/{ext}"
37
+
38
+ response = client.chat.completions.create(
39
+ model=groq_model,
40
+ messages=[
41
+ {
42
+ "role": "user",
43
+ "content": [
44
+ {
45
+ "type": "text",
46
+ "text": (
47
+ "You are analyzing a document image. "
48
+ "Look carefully at the layout, tables, numbers, and text. "
49
+ "Answer the following question based only on what you see:\n\n"
50
+ + question
51
+ )
52
+ },
53
+ {
54
+ "type": "image_url",
55
+ "image_url": {
56
+ "url": f"data:{mime};base64,{img_b64}"
57
+ }
58
+ }
59
+ ]
60
+ }
61
+ ],
62
+ max_tokens=1024,
63
+ temperature=0.1
64
+ )
65
+
66
+ answer = response.choices[0].message.content.strip()
67
+ print(f"[granite_vision.qa] Groq answer ({len(answer)} chars): {answer[:200]}")
68
+ return {"answer": answer, "model": f"{groq_model} (Groq Vision)"}
69
+
70
+ except Exception as e:
71
+ print(f"[granite_vision.qa] Groq failed: {e}")
72
+ return {
73
+ "answer": f"Groq Vision error: {e}",
74
+ "model": groq_model,
75
+ "error": str(e)
76
+ }
77
+ else:
78
+ print("[granite_vision.qa] GROQ_API_KEY not set in HF secrets.")
79
+ return {
80
+ "answer": "GROQ_API_KEY is not configured. Please add it in HuggingFace Space secrets.",
81
+ "model": "none",
82
+ "error": "missing_groq_key"
83
+ }
84
+
85
+ # LOCAL MODE (dev only): Ollama
86
+ local_model = os.environ.get("GRANITE_MODEL_PATH", "qwen2-vl:2b")
87
+ print(f"[granite_vision.qa] LOCAL MODE: sending image to Ollama ({local_model})")
88
+
89
+ try:
90
+ with open(image_path, "rb") as f:
91
+ img_b64 = base64.b64encode(f.read()).decode("utf-8")
92
+
93
+ base_url = os.environ.get("OLLAMA_BASE_URL", "http://localhost:11434").rstrip("/")
94
+ url = f"{base_url}/api/chat"
95
+ payload = {
96
+ "model": local_model,
97
+ "messages": [
98
+ {
99
+ "role": "user",
100
+ "content": f"Carefully analyze this document image. {question}",
101
+ "images": [img_b64]
102
+ }
103
+ ],
104
+ "stream": False,
105
+ "keep_alive": 60,
106
+ "options": {"num_ctx": 1024, "temperature": 0.1}
107
+ }
108
+ r = requests.post(url, json=payload, timeout=300)
109
+ if r.status_code == 200:
110
+ answer = r.json().get("message", {}).get("content", "").strip()
111
+ print(f"[granite_vision.qa] Ollama answer ({len(answer)} chars): {answer[:200]}")
112
+ return {"answer": answer, "model": f"{local_model} (Ollama)"}
113
+ else:
114
+ msg = f"Ollama HTTP {r.status_code}: {r.text}"
115
+ print(f"[granite_vision.qa] {msg}")
116
+ return {"answer": msg, "model": f"{local_model} (Ollama)", "error": "http_error"}
117
+
118
+ except Exception as e:
119
+ msg = f"[ERROR] Ollama Q&A failed: {e}"
120
+ print(f"[granite_vision.qa] {msg}")
121
+ return {"answer": msg, "model": f"{local_model} (Ollama)", "error": str(e)}
Agent/tools/groq_vision_health.py ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import json
3
+ import base64
4
+ from typing import Optional
5
+
6
+
7
+ def health_check() -> dict:
8
+ """
9
+ Quick health check for Groq Vision model.
10
+ Returns {"ok": bool, "model": str, "error": Optional[str]}
11
+ """
12
+ if os.environ.get("USE_HF_CLOUD", "0") not in ("1", "true", "True"):
13
+ return {"ok": True, "model": "local-ollama", "error": None}
14
+
15
+ groq_key = os.environ.get("GROQ_API_KEY")
16
+ if not groq_key:
17
+ return {"ok": False, "model": "none", "error": "GROQ_API_KEY is not set"}
18
+
19
+ groq_model = os.environ.get("GROQ_VISION_MODEL", "qwen/qwen3.8-27b")
20
+ try:
21
+ from groq import Groq
22
+
23
+ client = Groq(api_key=groq_key)
24
+ # Try a minimal text-only call to verify model exists and is accessible
25
+ response = client.chat.completions.create(
26
+ model=groq_model,
27
+ messages=[{"role": "user", "content": "ping"}],
28
+ max_tokens=1,
29
+ temperature=0,
30
+ )
31
+ return {"ok": True, "model": groq_model, "error": None}
32
+ except Exception as e:
33
+ return {"ok": False, "model": groq_model, "error": str(e)}
Agent/worker.py ADDED
@@ -0,0 +1,543 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import asyncio
3
+ import io
4
+ import sys
5
+ import contextlib
6
+ from fastapi import FastAPI, HTTPException
7
+ from pydantic import BaseModel
8
+ from typing import Optional
9
+ from fastapi import File, Form, UploadFile
10
+ import base64
11
+ import uuid
12
+ import uvicorn
13
+
14
+ # Worker that imports the agent and exposes a simple HTTP API
15
+ app = FastAPI(title="Agent Worker")
16
+
17
+ # ---------------------------------------------------------------------------
18
+ # Schema profile registry (dynamic multi-DB support)
19
+ # ---------------------------------------------------------------------------
20
+ try:
21
+ from .schema_profile import ProfileRegistry
22
+ except Exception:
23
+ import Agent.schema_profile as _sp
24
+ ProfileRegistry = _sp.ProfileRegistry
25
+
26
+ SCHEMAS_DIR = os.path.join("uploads", "schemas")
27
+ PROFILE_STORE_PATH = os.path.join("chat_store", "schema_profiles.json")
28
+ profile_registry = ProfileRegistry(PROFILE_STORE_PATH)
29
+
30
+ SUPPORTED_DB_SUFFIXES = {".sqlite", ".db", ".sqlite3", ".csv"}
31
+
32
+
33
+ class AddSchemaJsonReq(BaseModel):
34
+ name: str
35
+ connection_url: str
36
+ activate: Optional[bool] = True
37
+ notes: Optional[str] = None
38
+
39
+
40
+ def _detect_demo_kind(name: str, tblset: Optional[set] = None) -> str:
41
+ """Classify a profile as the built-in employee demo or a user schema."""
42
+ n = (name or "").lower()
43
+ if "demo_employee" in n:
44
+ return "demo"
45
+ if tblset and all(
46
+ t in tblset for t in ["employee", "department", "salary", "dept_emp"]
47
+ ):
48
+ return "demo"
49
+ # Connection URL pointing at employee-ish database
50
+ if "employee" in (name or ""):
51
+ return "demo"
52
+ return "user"
53
+
54
+ class QueryReq(BaseModel):
55
+ question: str
56
+ doc_id: Optional[str] = None
57
+ mode: Optional[str] = None # 'text2sql' or 'ocr_qa'
58
+
59
+
60
+ class UploadResp(BaseModel):
61
+ doc_id: str
62
+ text_preview: str
63
+ image_url: str
64
+
65
+ class OcrQAReq(BaseModel):
66
+ question: str
67
+ doc_id: str
68
+
69
+ class OcrQAResp(BaseModel):
70
+ doc_id: str
71
+ answer: str
72
+ used_llm: bool
73
+
74
+ # Lazy import agent module (do at startup so heavy init happens in worker)
75
+ agent = None
76
+ # Lock to prevent concurrent capture of stdout/stderr which would interleave logs
77
+ capture_lock = asyncio.Lock()
78
+
79
+ @app.on_event("startup")
80
+ async def startup_event():
81
+ global agent
82
+ # Import here so the LLM and DB init occur inside the worker process
83
+ # Use package-relative import so we load Agent.agentic_workflow (not a top-level file)
84
+ try:
85
+ from . import agentic_workflow as agentic_workflow
86
+ except Exception:
87
+ # fallback to absolute package import
88
+ import Agent.agentic_workflow as agentic_workflow
89
+ agent = agentic_workflow
90
+
91
+ # ------------------------------------------------------------------
92
+ # Built-in demo employee database: ALWAYS available as a profile.
93
+ # Sourced from the authentic employees sample dataset bundled in the repo
94
+ # (employee-sample-database/sqlite/dataset_small/employee.db). Used as the
95
+ # active database out of the box when no DB_CONNECTION_URL is provided.
96
+ # ------------------------------------------------------------------
97
+ demo_db_url = None
98
+ demo_db_path = os.path.join(
99
+ os.path.dirname(os.path.dirname(os.path.abspath(__file__))),
100
+ "employee-sample-database", "sqlite", "dataset_small", "employee.db",
101
+ )
102
+ if os.path.isfile(demo_db_path):
103
+ demo_db_url = f"sqlite:///{demo_db_path.replace(os.sep, '/')}"
104
+ try:
105
+ has_demo = any((p or {}).get("kind") == "demo"
106
+ for p in profile_registry.profiles.values())
107
+ if not has_demo:
108
+ profile_registry.add(name="demo_employee", db_url=demo_db_url,
109
+ kind="demo", activate=False)
110
+ print("[WORKER] Registered built-in demo profile 'demo_employee'")
111
+ except Exception as reg_err:
112
+ print(f"[WORKER] demo profile registration skipped: {reg_err}")
113
+ else:
114
+ print(f"[WORKER] Bundled demo employee DB not found at {demo_db_path}")
115
+
116
+ # ------------------------------------------------------------------
117
+ # Decide which database to initialize against:
118
+ # 1. DB_CONNECTION_URL (env/compose wins) 2. last active profile 3. demo
119
+ # ------------------------------------------------------------------
120
+ db_url = os.environ.get("DB_CONNECTION_URL")
121
+ active = profile_registry.active()
122
+ target_uri = db_url or (active or {}).get("db_url") or demo_db_url
123
+
124
+ if target_uri:
125
+ try:
126
+ # Re-attach owner schema notes stored on the matching profile, so a
127
+ # restarted server carries the domain hints with no re-registration.
128
+ _pre = next(
129
+ (p for p in profile_registry.list()
130
+ if ((p.get("db_url") or "").replace("\\", "/") == target_uri.replace("\\", "/"))),
131
+ None,
132
+ )
133
+ await agent.initialize_database(uri=target_uri, schema_notes=(_pre or {}).get("notes"))
134
+ # Keep the registry's active entry in sync with what we connected to.
135
+ # IMPORTANT: force the booted database to OWN the active slot — the
136
+ # demo registration above grabs "active" on a fresh store (ProfileRegistry
137
+ # .add() activates when no active exists), which left Space deployments
138
+ # showing the demo DB even though the env DB_CONNECTION_URL booted.
139
+ try:
140
+ entries = profile_registry.list()
141
+ match = next(
142
+ (p for p in entries
143
+ if ((p.get("db_url") or "").replace("\\", "/") == target_uri.replace("\\", "/"))),
144
+ None,
145
+ )
146
+ if match is None:
147
+ prof = getattr(agent, "ACTIVE_SCHEMA_PROFILE", None)
148
+ _from_env = bool(db_url and target_uri == db_url)
149
+ _kind = "user" if _from_env else (
150
+ "demo" if (prof and getattr(prof, "is_employee_db", False)) else "user")
151
+ _name = (getattr(prof, "name", None) if prof else None) or (
152
+ "Employee_DB" if _from_env else "demo_employee")
153
+ pid = f"boot_{uuid.uuid4().hex[:8]}"
154
+ profile_registry.profiles[pid] = {
155
+ "name": _name,
156
+ "db_url": target_uri,
157
+ "kind": _kind,
158
+ "created_at": __import__("time").time(),
159
+ }
160
+ profile_registry.active_id = pid
161
+ profile_registry.save()
162
+ print(f"[WORKER] Registered ACTIVE schema profile '{_name}' (kind={_kind}) for env DB")
163
+ else:
164
+ if profile_registry.active_id != match["id"]:
165
+ profile_registry.switch(match["id"])
166
+ print(f"[WORKER] Active profile switched to '{match['name']}'")
167
+ else:
168
+ print(f"[WORKER] Active profile already '{match['name']}'")
169
+ except Exception as reg_err:
170
+ print(f"[WORKER] profile bootstrap skipped: {reg_err}")
171
+ except Exception as e:
172
+ # Log but continue; agentic_workflow has fallback behavior
173
+ print(f"Worker: initialize_database failed: {e}")
174
+ else:
175
+ print("Worker: no database available (no env DB, no profiles, no demo bundle)")
176
+ # Optional Groq Vision health check in cloud mode
177
+ try:
178
+ from .tools import groq_vision_health
179
+ hc = groq_vision_health.health_check()
180
+ if not hc.get("ok", True):
181
+ print(f"[WORKER] Groq Vision health warning: {hc.get('error')} (model={hc.get('model')})")
182
+ else:
183
+ print(f"[WORKER] Groq Vision health: ok (model={hc.get('model')})")
184
+ except Exception as e:
185
+ print(f"[WORKER] Groq Vision health check skipped: {e}")
186
+
187
+ @app.get("/health")
188
+ async def health():
189
+ return {"status": "ok"}
190
+
191
+
192
+ @app.post("/query")
193
+ async def query(req: QueryReq):
194
+ global agent
195
+ if agent is None:
196
+ raise HTTPException(status_code=503, detail="Agent not initialized")
197
+ q = req.question
198
+ doc_id = getattr(req, 'doc_id', None)
199
+ mode = getattr(req, 'mode', None)
200
+ # Capture stdout/stderr produced by the agent for this request
201
+ buf_out = io.StringIO()
202
+ buf_err = io.StringIO()
203
+ async with capture_lock:
204
+ try:
205
+ with contextlib.redirect_stdout(buf_out), contextlib.redirect_stderr(buf_err):
206
+ # Robust mode switch: if mode is 'ocr_qa' or doc_id is present, use OCR agent; else use SQL logic
207
+ if (mode == 'ocr_qa') or (doc_id and (mode is None or mode == 'auto')):
208
+ # Use OCR Q&A agent
209
+ # ocr_agent_qa may be sync, so run in executor
210
+ import asyncio
211
+ answer = await asyncio.get_event_loop().run_in_executor(
212
+ None, lambda: agent.ocr_agent_qa(q, doc_id)
213
+ )
214
+ result = answer
215
+ sql_out = None # No SQL for OCR Q&A
216
+ else:
217
+ # Use standard Text-to-SQL agentic workflow
218
+ result = await agent.agentic_query_process(q, None)
219
+ try:
220
+ sql_out = getattr(agent, 'LAST_GENERATED_SQL', None)
221
+ except Exception:
222
+ sql_out = None
223
+ except ValueError as ve:
224
+ # Treat known generation failures as normal answers so UI doesn't show nested JSON error
225
+ err_msg = str(ve)
226
+ if "Unable to generate SQL query" in err_msg:
227
+ result = err_msg # Provide user-visible plain text
228
+ sql_out = None
229
+ else:
230
+ import traceback
231
+ traceback.print_exc(file=buf_err)
232
+ raise HTTPException(status_code=500, detail=err_msg)
233
+ except Exception as e:
234
+ import traceback
235
+ traceback.print_exc(file=buf_err)
236
+ raise HTTPException(status_code=500, detail=str(e))
237
+ logs = buf_out.getvalue()
238
+ errlogs = buf_err.getvalue()
239
+ if errlogs:
240
+ logs = logs + "\n" + errlogs
241
+ # Chart contract: strip the embedded chart marker from the answer and
242
+ # expose it as a first-class field for the web UI (ECharts).
243
+ chart_out = None
244
+ try:
245
+ from .chart_contract import extract_chart_marker
246
+ clean_answer, chart_out = extract_chart_marker(result)
247
+ if chart_out is not None:
248
+ result = clean_answer
249
+ except Exception:
250
+ chart_out = None
251
+ return {"answer": result, "logs": logs, "sql": sql_out, "chart": chart_out}
252
+
253
+
254
+ @app.post("/ocr-qa", response_model=OcrQAResp)
255
+ async def ocr_qa(req: OcrQAReq):
256
+ """Answer a question about a previously uploaded document using its doc_id.
257
+
258
+ This uses the agent's ocr_agent_qa helper which pulls stored OCR text and
259
+ consults the LLM (or returns a low-memory fallback excerpt).
260
+ """
261
+ global agent
262
+ if agent is None:
263
+ raise HTTPException(status_code=503, detail="Agent not initialized")
264
+ question = req.question
265
+ doc_id = req.doc_id
266
+ # Run potentially blocking OCR QA in thread pool if it's sync
267
+ try:
268
+ answer = await asyncio.get_event_loop().run_in_executor(
269
+ None, lambda: agent.ocr_agent_qa(question, doc_id)
270
+ )
271
+ except Exception as e:
272
+ raise HTTPException(status_code=500, detail=f"ocr_qa failed: {e}")
273
+ used_llm = not answer.startswith("[Low memory]") and not answer.startswith("No OCR text") and not answer.startswith("Error while")
274
+ return OcrQAResp(doc_id=doc_id, answer=answer, used_llm=used_llm)
275
+
276
+
277
+ @app.post("/upload-image", response_model=UploadResp)
278
+ async def upload_image(file: UploadFile = File(...)):
279
+ """Accept an image, save locally, call MCP document_scanner.process eagerly,
280
+ persist OCR to private chat store, and return a doc_id plus preview.
281
+ """
282
+ global agent
283
+ if agent is None:
284
+ raise HTTPException(status_code=503, detail="Agent not initialized")
285
+
286
+ # Ensure uploads directory exists
287
+ uploads_dir = "uploads"
288
+ os.makedirs(uploads_dir, exist_ok=True)
289
+
290
+ # Save uploaded file
291
+ filename = f"{uuid.uuid4()}_{file.filename}"
292
+ path = os.path.join(uploads_dir, filename)
293
+ try:
294
+ contents = await file.read()
295
+ with open(path, "wb") as f:
296
+ f.write(contents)
297
+ except Exception as e:
298
+ raise HTTPException(status_code=500, detail=f"Failed to save upload: {e}")
299
+
300
+ # Call MCP document_scanner tool eagerly with base64 payload to avoid exposing file server
301
+ b64 = base64.b64encode(contents).decode('utf-8')
302
+ try:
303
+ from .mcp_client import mcp_call_tool
304
+ ctx = {"tool_call": {"name": "document_scanner.process", "args": {"image_bytes": b64}}}
305
+ resp = mcp_call_tool(prompt="run document scanner", timeout=60.0, context=ctx)
306
+ # Expect tool_result in response
307
+ tool_result = resp.get("tool_result") if isinstance(resp, dict) else None
308
+ except Exception:
309
+ # Fall back to local direct call if MCP unavailable or tool failed
310
+ tool_result = None
311
+ try:
312
+ if agent and hasattr(agent, 'tools') and hasattr(agent.tools, 'document_scanner'):
313
+ try:
314
+ tool_result = agent.tools.document_scanner.process_image(image_bytes=b64)
315
+ except Exception:
316
+ tool_result = None
317
+ except Exception:
318
+ tool_result = None
319
+ if not tool_result:
320
+ tool_result = {"doc_id": str(uuid.uuid4()), "text": "(ocr unavailable)", "metadata": {}}
321
+
322
+ # Persist OCR to private chat store file for retrieval by doc_id
323
+ doc_id = tool_result.get("doc_id") if isinstance(tool_result, dict) and tool_result.get("doc_id") else str(uuid.uuid4())
324
+ ocr_text = tool_result.get("text", "") if isinstance(tool_result, dict) else str(tool_result)
325
+
326
+ # Save to docs/ and also to chat_store_private for history
327
+ docs_dir = os.path.join("chat_store", "docs")
328
+ os.makedirs(docs_dir, exist_ok=True)
329
+ doc_path = os.path.join(docs_dir, f"{doc_id}.txt")
330
+ try:
331
+ with open(doc_path, "w", encoding="utf-8") as df:
332
+ df.write(ocr_text)
333
+ except Exception as e:
334
+ print(f"Failed to persist OCR text: {e}")
335
+
336
+ # Also persist the original image path so Granite Vision can do direct visual Q&A
337
+ img_path_file = os.path.join(docs_dir, f"{doc_id}.img_path")
338
+ try:
339
+ abs_img_path = os.path.abspath(path)
340
+ with open(img_path_file, "w", encoding="utf-8") as ipf:
341
+ ipf.write(abs_img_path)
342
+ print(f"[upload] Saved image path for doc_id={doc_id}: {abs_img_path}")
343
+ except Exception as e:
344
+ print(f"[upload] Failed to persist image path: {e}")
345
+
346
+ # Also add a short entry to chat_store_private for traceability
347
+ try:
348
+ try:
349
+ from .agentic_workflow import chat_store_private, ChatMessage, MessageRole
350
+ except ImportError:
351
+ from Agent.agentic_workflow import chat_store_private, ChatMessage, MessageRole
352
+ # Create minimal messages
353
+ user_msg = ChatMessage(role=MessageRole.USER, content=f"Uploaded document {doc_id}")
354
+ assistant_msg = ChatMessage(role=MessageRole.ASSISTANT, content=f"OCR stored: {ocr_text[:400]}")
355
+ chat_store_private.add_message(key="conversation", message=user_msg)
356
+ chat_store_private.add_message(key="conversation", message=assistant_msg)
357
+ chat_store_private.persist(str("chat_store/chat_store_private.json"))
358
+ except Exception:
359
+ pass
360
+
361
+ # Return doc id and small preview
362
+ preview = ocr_text[:400]
363
+ image_url = path
364
+ return UploadResp(doc_id=doc_id, text_preview=preview, image_url=image_url)
365
+
366
+
367
+ # ---------------------------------------------------------------------------
368
+ # Schema profile endpoints — dynamic multi-database support
369
+ # ---------------------------------------------------------------------------
370
+
371
+ @app.get("/schemas")
372
+ async def schemas_list():
373
+ return {"profiles": profile_registry.list(), "active_id": profile_registry.active_id}
374
+
375
+
376
+ @app.post("/schemas/add")
377
+ async def schemas_add_json(req: AddSchemaJsonReq):
378
+ """Register a database via connection URL (postgres/mysql/sqlite)."""
379
+ global agent
380
+ name = (req.name or "").strip()[:80]
381
+ if not name or not req.connection_url:
382
+ raise HTTPException(status_code=400, detail="name and connection_url are required")
383
+ entry = profile_registry.add(
384
+ name=name,
385
+ db_url=req.connection_url,
386
+ kind=_detect_demo_kind(name),
387
+ activate=bool(req.activate),
388
+ notes=req.notes,
389
+ )
390
+ if bool(req.activate) and agent is not None:
391
+ try:
392
+ await agent.initialize_database(uri=req.connection_url, schema_notes=req.notes)
393
+ except Exception as e:
394
+ raise HTTPException(status_code=400, detail=f"Profile saved, but DB init failed: {e}")
395
+ # Return full schema digest preview
396
+ return {"profile": entry, "schema": agent.ACTIVE_SCHEMA_PROFILE.summarize() if agent else None}
397
+
398
+
399
+ @app.post("/schemas/add-file")
400
+ async def schemas_add_file(file: UploadFile = File(...), name: Optional[str] = Form(None),
401
+ activate: bool = Form(True), notes: Optional[str] = Form(None)):
402
+ """Register a database via file upload (.sqlite/.db/.sqlite3 or .csv)."""
403
+ global agent
404
+ fname = file.filename or "upload"
405
+ ext = os.path.splitext(fname)[-1].lower()
406
+ if ext not in SUPPORTED_DB_SUFFIXES:
407
+ raise HTTPException(
408
+ status_code=400,
409
+ detail=f"Unsupported file type '{ext}'. Supported: {sorted(SUPPORTED_DB_SUFFIXES)}",
410
+ )
411
+ display_name = (name or os.path.splitext(fname)[0]).strip()[:80] or "user_schema"
412
+
413
+ os.makedirs(SCHEMAS_DIR, exist_ok=True)
414
+
415
+ if ext == ".csv":
416
+ # Convert CSV into a single-table SQLite database
417
+ import pandas as pd
418
+ import tempfile
419
+
420
+ sqlite_path = os.path.join(SCHEMAS_DIR, f"{uuid.uuid4().hex}.db")
421
+ try:
422
+ contents = await file.read()
423
+ df = pd.read_csv(io.BytesIO(contents))
424
+ except Exception as e:
425
+ raise HTTPException(status_code=400, detail=f"CSV parse failed: {e}")
426
+ table_name = "".join(ch for ch in display_name if ch.isalnum() or ch == "_") or "data"
427
+ try:
428
+ engine_path = os.path.abspath(sqlite_path).replace("\\", "/")
429
+ df.to_sql(table_name, f"sqlite:///{engine_path}", index=False, if_exists="replace")
430
+ except Exception as e:
431
+ raise HTTPException(status_code=500, detail=f"CSV→SQLite conversion failed: {e}")
432
+ db_url = f"sqlite:///{engine_path}"
433
+ kind = "user"
434
+ else:
435
+ # Copy uploaded SQLite file into schemas dir
436
+ sqlite_path = os.path.join(SCHEMAS_DIR, f"{uuid.uuid4().hex}{ext}")
437
+ try:
438
+ contents = await file.read()
439
+ with open(sqlite_path, "wb") as fh:
440
+ fh.write(contents)
441
+ except Exception as e:
442
+ raise HTTPException(status_code=500, detail=f"Failed to save upload: {e}")
443
+ engine_path = sqlite_path.replace("\\", "/")
444
+ db_url = f"sqlite:///{engine_path}"
445
+ # Poke the file to validate it is really a SQLite database
446
+ try:
447
+ import sqlite3
448
+
449
+ conn = sqlite3.connect(sqlite_path)
450
+ tblset = {r[0] for r in conn.execute(
451
+ "SELECT name FROM sqlite_master WHERE type IN ('table','view')"
452
+ ).fetchall()}
453
+ conn.close()
454
+ except Exception as e:
455
+ raise HTTPException(status_code=400, detail=f"Invalid SQLite file: {e}")
456
+ kind = _detect_demo_kind(display_name, tblset)
457
+
458
+ entry = profile_registry.add(name=display_name, db_url=db_url, kind=kind,
459
+ activate=activate, notes=notes)
460
+ if activate and agent is not None:
461
+ try:
462
+ await agent.initialize_database(uri=db_url, schema_notes=notes)
463
+ except Exception as e:
464
+ raise HTTPException(status_code=400, detail=f"Profile saved, but DB init failed: {e}")
465
+ return {"profile": entry, "schema": agent.ACTIVE_SCHEMA_PROFILE.summarize() if agent else None}
466
+
467
+
468
+ @app.post("/schemas/switch/{profile_id}")
469
+ async def schemas_switch(profile_id: str):
470
+ """Switch the active database profile and re-initialize the agent against it."""
471
+ global agent
472
+ if agent is None:
473
+ raise HTTPException(status_code=503, detail="Agent not initialized")
474
+ entry = profile_registry.switch(profile_id)
475
+ if not entry:
476
+ raise HTTPException(status_code=404, detail="Profile not found")
477
+ # Dispose previous async engine best-effort
478
+ try:
479
+ if getattr(agent, "async_engine", None) is not None:
480
+ await agent.async_engine.dispose()
481
+ except Exception:
482
+ pass
483
+ try:
484
+ await agent.initialize_database(uri=entry["db_url"], schema_notes=entry.get("notes"))
485
+ except Exception as e:
486
+ raise HTTPException(status_code=400, detail=f"Switch failed: {e}")
487
+ return {"profile": entry, "schema": agent.ACTIVE_SCHEMA_PROFILE.summarize()}
488
+
489
+
490
+ class SetSchemaNotesReq(BaseModel):
491
+ notes: str = ""
492
+
493
+
494
+ @app.post("/schemas/{profile_id}/notes")
495
+ async def schemas_set_notes(profile_id: str, req: SetSchemaNotesReq):
496
+ """Persist owner-supplied schema notes (domain hints) for a profile.
497
+
498
+ Notes are injected verbatim into every agent prompt for that database,
499
+ supplying the semantics that live introspection cannot infer.
500
+ """
501
+ notes = (req.notes or "").strip()[:4000]
502
+ if not profile_registry.set_notes(profile_id, notes):
503
+ raise HTTPException(status_code=404, detail="Profile not found")
504
+ # Live effect on the running agent when the profile is currently active
505
+ # (no re-initialization needed).
506
+ if agent is not None and profile_id == profile_registry.active_id:
507
+ try:
508
+ if getattr(agent, "ACTIVE_SCHEMA_PROFILE", None) is not None:
509
+ agent.ACTIVE_SCHEMA_PROFILE.notes = notes
510
+ except Exception:
511
+ pass
512
+ return {"id": profile_id, "notes": notes}
513
+
514
+
515
+ @app.delete("/schemas/{profile_id}")
516
+ async def schemas_delete(profile_id: str):
517
+ entry = profile_registry.get(profile_id)
518
+ if not entry:
519
+ raise HTTPException(status_code=404, detail="Profile not found")
520
+ # Remove uploaded backing file for file-based profiles
521
+ db_url = entry.get("db_url") or ""
522
+ try:
523
+ if db_url.startswith("sqlite:///"):
524
+ p = db_url.replace("sqlite:///", "", 1)
525
+ if os.path.exists(p) and str(SCHEMAS_DIR) in p:
526
+ os.remove(p)
527
+ except Exception:
528
+ pass
529
+ profile_registry.remove(profile_id)
530
+ return {"deleted": profile_id}
531
+
532
+
533
+ @app.get("/schema/current")
534
+ async def schema_current():
535
+ """Current active schema summary (tables/columns/samples) for the UI."""
536
+ global agent
537
+ if agent is None:
538
+ raise HTTPException(status_code=503, detail="Agent not initialized")
539
+ return agent.ACTIVE_SCHEMA_PROFILE.summarize()
540
+
541
+ if __name__ == '__main__':
542
+ port = int(os.environ.get("WORKER_PORT", 8700))
543
+ uvicorn.run(app, host="127.0.0.1", port=port)
Dockerfile ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # ☁️ Dockerfile for Hugging Face Spaces — Cloud-Only (Lightweight)
2
+ # Image size: ~500MB (no Ollama, no local models)
3
+ # All LLM inference is handled by Groq API and HF Inference API via USE_HF_CLOUD=1
4
+ FROM python:3.11-slim
5
+
6
+ # Prevent Python from writing pyc files and buffering stdout/stderr
7
+ ENV PYTHONDONTWRITEBYTECODE=1
8
+ ENV PYTHONUNBUFFERED=1
9
+
10
+ # Cloud mode: all LLM calls go to Groq / HF Inference — no local Ollama needed
11
+ ENV USE_HF_CLOUD=1
12
+
13
+ # Install system dependencies (Tesseract for OCR fallback only)
14
+ RUN apt-get update && apt-get install -y \
15
+ curl \
16
+ zstd \
17
+ tesseract-ocr \
18
+ libtesseract-dev \
19
+ gcc \
20
+ libpq-dev \
21
+ && rm -rf /var/lib/apt/lists/*
22
+
23
+ WORKDIR /app
24
+
25
+ # Install Python dependencies
26
+ COPY requirements.txt .
27
+ RUN pip install --no-cache-dir --upgrade pip && \
28
+ pip install --no-cache-dir -r requirements.txt && \
29
+ pip install --no-cache-dir llama-index-llms-huggingface-api huggingface_hub
30
+
31
+ # Copy application code
32
+ COPY . .
33
+
34
+ # Hugging Face Spaces requires port 7860
35
+ EXPOSE 7860
36
+
37
+ # Fix line endings and permissions on startup script
38
+ RUN sed -i 's/\r$//' start_hf.sh && chmod +x start_hf.sh
39
+ RUN useradd -m -u 1000 appuser && chown -R appuser:appuser /app 2>/dev/null || true
40
+ USER appuser
41
+
42
+ CMD ["./start_hf.sh"]
README.md CHANGED
@@ -1,13 +1,637 @@
1
  ---
2
- title: QueryLensV2b
3
- emoji: 🏆
4
- colorFrom: blue
5
- colorTo: pink
6
  sdk: gradio
7
  sdk_version: 6.30.0
8
- python_version: '3.12'
9
  app_file: app.py
10
  pinned: false
 
 
 
11
  ---
12
 
13
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: QueryLens V2
3
+ emoji: '🤖'
4
+ colorFrom: yellow
5
+ colorTo: red
6
  sdk: gradio
7
  sdk_version: 6.30.0
8
+ python_version: 3.11
9
  app_file: app.py
10
  pinned: false
11
+ tags:
12
+ - agents
13
+ - mcp
14
  ---
15
 
16
+ # Agentic Text2SQL & Document VQA
17
+ Multi-Agent System
18
+
19
+ ![Architecture](https://img.shields.io/badge/Architecture-Multi--Agent-blue)
20
+ ![Database](https://img.shields.io/badge/Database-Agnostic-success)
21
+ ![LLM](https://img.shields.io/badge/LLMs-Qwen%20%7C%20Ollama-orange)
22
+ ![Protocol](https://img.shields.io/badge/Protocol-MCP-purple)
23
+
24
+ An advanced, hardware-optimized AI pipeline built on a multi-agent orchestration architecture. This system seamlessly integrates natural language Text-to-SQL generation with a Vision-Language Model (VLM) for Optical Character Recognition (OCR) and Visual Question Answering (VQA).
25
+
26
+ By leveraging the Model Context Protocol (MCP), local LLMs via Ollama, and intelligent memory management, this project achieves production-grade data extraction and database querying running entirely on local hardware within tight memory constraints.
27
+
28
+ ---
29
+
30
+ ## Key Features
31
+
32
+ - **Multi-Agent Orchestration:** A dynamic routing system featuring specialized agents — MemoryAgent, QueryCraftAgent, and ResultPresenterAgent — each with a clearly defined role in the pipeline.
33
+ - **Dynamic Database Profiles:** Connect any database by connection string, or upload a `.sqlite`/`.db`/`.csv` file directly from the UI. Profiles are registered, switchable, and deletable at runtime via the `Database` panel or the `/api/schemas` REST surface — the built-in employee sample DB ships as one profile (`demo_employee`) among many.
34
+ - **Schema-Aware Generic Agents:** The agent pipeline reads a live introspected schema profile (tables, columns, PK/FK, row counts, sample rows) instead of assuming a fixed schema. The fourteen employee-specific `fast_sql` templates activate only when the employee demo is the active profile; every other database gets generic `schema.list_tables / schema.describe_table / schema.sample_data / sql.build_select` MCP tools and profile-aware prompts, validators, and reducers.
35
+ - **Interactive Charts:** Query results that visualize well (category breakdowns, comparisons, time series) are detected automatically and rendered as ECharts visualizations — pie, bar, or line — in a sepia-toned palette. Chart specs ride in the query response as a first-class `chart` field; detection is conservative and never corrupts a textual answer.
36
+ - **Modern Sepia UI:** A Claude-inspired coffee/sepia interface with serif headings and a warm terracotta accent, wrapping the multi-agent trace panels (Memory / QueryCraft / ResultPresenter), live schema browsing, and charting.
37
+ - **Vision-Language Question Answering:** VQA/OCR extraction from invoices and unstructured documents. Served locally via Ollama (`qwen2-vl:2b`) or — in cloud mode — through Groq's `qwen/qwen3.8-27b` vision model (free tier).
38
+ - **Three-Level Text-to-SQL Engine:** Translates natural language questions into syntactically valid SQL through a progressive reasoning architecture, with automatic self-correction at each escalation level.
39
+ - **Semantic Gatekeeping:** A multi-layer validation pipeline filters hallucinated SQL, undefined aliases, missing joins, and incorrect aggregation patterns before any query reaches the database.
40
+ - **Dynamic VRAM Orchestration:** Custom memory management algorithms automatically load and unload models from GPU VRAM to prevent out-of-memory crashes, enabling concurrent AI workloads on consumer hardware.
41
+ - **Unified MCP Integration:** All external data sources — relational databases and vision models alike — are accessed through a single, uniform Model Context Protocol interface.
42
+ - **Database Agnostic Design:** Architected to interface with PostgreSQL, MySQL, SQLite, MS SQL Server, and Oracle via SQLAlchemy. Live introspection supplies every prompt with real structure (tables, columns, keys, sample rows); optional per-database **Schema Notes** let the database owner state semantics — column meanings, aliases, business rules — that are persisted with the profile and injected verbatim into every prompt.
43
+ - **Conversational Interface:** A full Web UI supporting natural language interaction with persistent session context.
44
+
45
+ ---
46
+
47
+ ## Dynamic Databases & Visual Analytics
48
+
49
+ ### Database profiles
50
+
51
+ Any database the worker can reach via SQLAlchemy becomes a first-class profile:
52
+
53
+ | Endpoint | Method | Purpose |
54
+ |---|---|---|
55
+ | `/api/schemas` | GET | List registered profiles + active id |
56
+ | `/api/schemas/add` | POST | Register via `name` + `connection_url` (postgres/mysql/sqlite) |
57
+ | `/api/schemas/add-file` | POST | Upload `.sqlite`/`.db` (used as-is) or `.csv` (converted to a single-table SQLite DB) |
58
+ | `/api/schemas/switch/{id}` | POST | Activate a profile and re-initialize the agent against it |
59
+ | `/api/schemas/{id}` | DELETE | Remove a profile (+ its uploaded backing file) |
60
+ | `/api/schema/current` | GET | Live summary of the active schema (tables, columns, row counts, sample rows) |
61
+
62
+ Profiles persist in `chat_store/schema_profiles.json` and survive restarts; uploaded files are stored under `uploads/schemas/`. On startup, the worker auto-registers the `DB_CONNECTION_URL` database as the initial active profile.
63
+
64
+ ### Chart contract
65
+
66
+ When a query returns rows that visualize well, the ResultPresenter embeds a chart spec (pie/bar/line, labels + numeric series) that the worker exposes as `{"chart": {...}}` alongside the text `answer`. Selection heuristics: date-like first column + numeric series → line; ≤8 categories with a single numeric series → pie; otherwise bar. Detection caps at 60 points and never mutates the answer text.
67
+
68
+ ### Working against the demo employee database
69
+
70
+ The built-in employee sample (MySQL/PostgreSQL containers in `docker-compose.yml`, or the `demo_employee` profile) keeps all battle-tested heuristics: `to_date = '9999-01-01'` current-row filters, the manager/department join knowledge, the 14 `fast_sql` MCP templates, and the invariant enforcement layer.
71
+
72
+ ---
73
+
74
+ ## System Architecture and Agentic Workflow
75
+
76
+ The project employs a decoupled, asynchronous microservices architecture. The Web UI communicates with a backend worker, which orchestrates all agent requests through the Model Context Protocol.
77
+
78
+ ### The Three-Agent Pipeline
79
+
80
+ **1. MemoryAgent**
81
+
82
+ The MemoryAgent acts as the entry point for all user queries. It performs three functions before any SQL generation occurs: checking whether the current query can be satisfied from historical conversation context, rephrasing ambiguous or under-specified queries based on prior interactions, and routing validated new queries to the appropriate downstream agent. This layer prevents redundant computation and improves response latency for repeated or related questions.
83
+
84
+ **2. QueryCraftAgent — The Three-Level Text-to-SQL Engine**
85
+
86
+ The QueryCraftAgent is the core reasoning engine of the system. It implements a progressive escalation architecture that balances inference speed with accuracy:
87
+
88
+ - **Level 1 — Pure LLM Intelligence:** Zero-shot semantic translation of natural language to SQL using Qwen 2.5 Coder. The generated query passes through a semantic validation pipeline that checks alias correctness, required table joins, aggregation integrity, and department or entity filters before being accepted.
89
+
90
+ - **Level 2 — LLM with SQL Fixer:** When Level 1 fails validation, the agent enters an autonomous self-correction loop. The SQL Fixer applies a deterministic set of targeted transformations — normalizing aliases, injecting missing to_date filters, repairing phantom column references, and enforcing PostgreSQL-compliant GROUP BY clauses — before re-validating the output.
91
+
92
+ - **Level 3 — LLM with MCP Schema-Grounded SQL Generation:** The deepest reasoning level, reserved for queries that fail both prior levels. For the built-in employee demo, the agent calls one of fourteen registered `fast_sql` MCP tools, each of which queries the live database schema via SQLAlchemy's inspector to retrieve actual column names and table structures, then programmatically constructs a valid SQL template grounded in the real schema. For any user-registered database, the agent instead grounds itself through the generic `schema.list_tables` / `schema.describe_table` / `schema.sample_data` MCP tools, producing a verified live-schema + sample-data hint that applies to any database. In both cases the template is passed as a verified hint to the LLM, which refines it before the Fixer loop runs. Because the hint is built from the actual schema rather than the LLM's training data, this level eliminates the class of failures caused by hallucinated column names or missing joins.
93
+
94
+ **3. ResultPresenterAgent**
95
+
96
+ The ResultPresenterAgent executes the validated SQL query against the target database, translates raw result sets into natural conversational responses, handles execution errors and edge cases, and persists the interaction to the conversation history for future MemoryAgent lookups.
97
+
98
+ ### Multi-Agent Orchestration Flow
99
+
100
+ ```mermaid
101
+ graph TD
102
+ User([User]) --> Web["Web Application\nPort 8000"]
103
+
104
+ Web -->|Image Upload| Worker["Backend Worker\nPort 8700"]
105
+ Web -->|Text Query| Worker
106
+
107
+ subgraph MCP["MCP Tool Server — Port 8701"]
108
+ DocScan["document_scanner.process\nTesseract OCR"]
109
+ FastSQL["fast_sql tools\nSchema-Grounded SQL Generation"]
110
+ VisionQA["granite_vision.qa\nQwen 3.5 2B Vision"]
111
+ end
112
+
113
+ Worker -->|"Upload: MCP tool call"| DocScan
114
+ DocScan -->|"doc_id + OCR text + image path"| Store[("Document Store\nchat_store/docs/")]
115
+
116
+ Worker -->|"OCR Q&A mode\ndoc_id present"| VisionQA
117
+ Store -->|image path| VisionQA
118
+ VisionQA --> OllamaV(["Ollama\nQwen 3.5 2B Vision"])
119
+ OllamaV --> Presenter
120
+
121
+ Worker -->|Text Query| Memory["MemoryAgent"]
122
+ Memory -->|Cached answer| Presenter["ResultPresenterAgent"]
123
+ Memory -->|New query| QCAgent["QueryCraftAgent"]
124
+
125
+ QCAgent -->|"Level 1 and 2\nDirect Ollama call"| OllamaSQL(["Ollama\nQwen 2.5 Coder"])
126
+ QCAgent -->|"Level 3\nMCP tool call"| FastSQL
127
+ FastSQL -->|"Schema-validated SQL hint"| OllamaSQL
128
+ OllamaSQL -->|Raw SQL| Fixer["SQL Fixer +\nSemantic Validator"]
129
+ Fixer -->|"Validated SQL\nvia SQLAlchemy"| DB[("PostgreSQL / MySQL / SQLite / MS SQL / Oracle")]
130
+
131
+ DB --> Presenter
132
+ Presenter -->|Persist to history| Memory
133
+ Presenter --> Answer(["Natural Language Answer"])
134
+ ```
135
+
136
+ ---
137
+
138
+ ## Infrastructure and Deployment Architecture
139
+
140
+ ### Containerized Microservices
141
+
142
+ The system is implemented as a Dockerized microservices architecture, with each component running as an isolated, independently deployable service. Docker Compose orchestrates three services: the main application and agent worker, the MCP tool server, and the relational databases (PostgreSQL and MySQL). Database containers are provisioned with health checks using `pg_isready` and `mysqladmin ping`, and the application container is configured with `condition: service_healthy` dependencies to eliminate the startup race condition inherent in naive `depends_on` configurations.
143
+
144
+ ### Native-Bridge Hybrid Offloading
145
+
146
+ For peak inference performance, the system uses a hybrid offloading strategy. The application logic and MCP servers run inside Docker containers for portability and isolation, while Ollama and all GPU inference are offloaded to the native Windows host and accessed by the containers over the WSL2 host bridge network (`OLLAMA_BASE_URL=http://<wsl2-host-ip>:11434`).
147
+
148
+ This architecture eliminates the virtualization overhead introduced by Docker Desktop's Linux VM layer. By giving the inference engine direct access to NVIDIA CUDA cores and the full system memory pool — rather than a virtualized slice — the 1.5B parameter model achieves response times measured in seconds rather than minutes. The separation also means that GPU memory pressure from Ollama does not compete with the container's allocated memory ceiling.
149
+
150
+ ### Database Health and Startup Reliability
151
+
152
+ A production-grade startup sequence is enforced through Docker health checks and application-level retry logic. The agent application implements a ten-attempt retry loop with five-second intervals on initialization, including a `SELECT 1` connection verification before the schema is read. This ensures consistent behavior across restarts and eliminates the class of intermittent failures caused by the application reading an empty or partially initialized schema during database startup.
153
+
154
+ ### MCP Tool Server Architecture
155
+
156
+ The Model Context Protocol server runs as a dedicated microservice on port 8701. Three categories of tools are registered at startup:
157
+
158
+ **document_scanner.process** handles Tesseract OCR and is called at image upload time, not at query time. It returns a doc_id, the extracted text, and triggers persistence of both the OCR output and the image path to the document store.
159
+
160
+ **granite_vision.qa** is the direct visual question-answering tool backed by Qwen 3.5 2B Vision via Ollama. It is called when a user submits a question with a doc_id and the original image file is available on disk. The internal tool identifier `granite_vision.qa` was retained from the original design specification; the underlying model was later replaced with Qwen 3.5 2B Vision for improved OCR accuracy and reduced VRAM usage, with no changes required to the agent orchestration code.
161
+
162
+ **fast_sql tools** are fourteen schema-grounded SQL generation tools used exclusively at Level 3 of the QueryCraftAgent. Each tool queries the live database schema via SQLAlchemy's inspector to retrieve actual column names, then uses a deterministic `_build_sql()` function to construct a valid query, optionally verified by a short LLM call. The result is returned as a schema-validated SQL hint to the QueryCraftAgent, which passes it to the LLM for final refinement. This design means Level 3 failures are caused by query complexity or intent ambiguity, never by hallucinated schema details.
163
+
164
+ ---
165
+
166
+ ## Unified Multimodal Integration via MCP
167
+
168
+ A defining architectural feature of this system is that OCR and multimodal reasoning are integrated through the same Model Context Protocol used for database access. The Qwen 3.5 2B Vision model is registered as a named MCP tool: `granite_vision.qa`. This internal tool identifier was retained from the original design specification; the underlying engine was subsequently replaced with Qwen 3.5 2B Vision, which demonstrated superior OCR accuracy and a smaller VRAM footprint. Because the tool interface is decoupled from its implementation, this substitution required no changes to the agent orchestration code — only the MCP tool registration was updated.
169
+
170
+ This design delivers three concrete engineering properties:
171
+
172
+ **Uniform Protocol:** The orchestrator issues identical-format tool calls regardless of whether the data source is a SQL table or a visual document. There are no special-case code paths for different modalities.
173
+
174
+ **Modular Replaceability:** The vision model is encapsulated behind its MCP interface. Upgrading to a different vision model — such as a GPT-4V endpoint — requires updating only the tool registration, not any agent logic.
175
+
176
+ **Cross-Modal Reasoning Capability:** Because both data sources share the same protocol, the agent can compose multi-step reasoning across modalities. For example, the system can extract a value from a document via the vision tool and immediately verify it against a database record via the SQL tool, within a single agentic workflow.
177
+
178
+ ```text
179
+ Multimodal Request Flow
180
+
181
+ Worker receives query with image path
182
+ |
183
+ +-- Image detected --> ocr_agent_qa()
184
+ |
185
+ +-- Unload Qwen 2.5 Coder (free VRAM)
186
+ |
187
+ +-- MCP tool call: granite_vision.qa
188
+ |
189
+ MCP Server (port 8701)
190
+ |
191
+ Qwen 3.5 2B Vision (Ollama)
192
+ |
193
+ Structured answer returned
194
+ |
195
+ +-- No image --> Standard Text-to-SQL pipeline (unchanged)
196
+ ```
197
+
198
+ ---
199
+
200
+ ## SQL Validation Pipeline
201
+
202
+ The semantic validation layer is one of the most technically substantive components of the system. Rather than trusting LLM output directly, every generated SQL query passes through a deterministic validation pipeline before execution. Key checks include:
203
+
204
+ - **Alias Integrity:** All table aliases used in SELECT, WHERE, JOIN, and GROUP BY clauses must be defined in FROM or JOIN declarations. The validator maintains a set of defined and used aliases and rejects queries with undefined references.
205
+ - **Salary Table Recognition:** The `salary` table name was explicitly excluded from the SQL keyword blocklist, as it is both a legitimate table name and a column name in the employee schema. Incorrect inclusion in the keyword set caused the validator to silently discard valid salary table joins.
206
+ - **Department Filter Enforcement:** Queries that reference a specific department by name are validated to confirm that a corresponding WHERE filter exists in the generated SQL. This prevents queries that return all departments when the user asked for one.
207
+ - **PostgreSQL GROUP BY Compliance:** Queries containing aggregate functions are checked to ensure all non-aggregated SELECT columns appear in the GROUP BY clause, enforcing strict PostgreSQL semantics.
208
+ - **Manager Schema Awareness:** Queries involving manager data are validated to confirm use of the `dept_manager` table rather than `dept_emp`. The validation produces a warning rather than a hard rejection, allowing the downstream semantic adjuster to regenerate the correct SQL before the query reaches the database.
209
+
210
+ ---
211
+
212
+ ## Research Methodology: Fine-Tuning and Model Selection
213
+
214
+ As part of the project's scientific evaluation, a custom model fine-tuning pipeline was developed and benchmarked against the selected production model.
215
+
216
+ **LoRA Fine-Tuning:** The base Qwen 2.5 3B model was fine-tuned using Low-Rank Adaptation on a specialized Text-to-SQL dataset.
217
+
218
+ **Weight Merging:** The LoRA adapters were merged back into the base model weights via `merge_qwen_to_ollama.py` and quantized for local deployment via Ollama.
219
+
220
+ **Comparative Evaluation:** The fine-tuned general model was benchmarked against the zero-shot `qwen2.5-coder:1.5b`, which is pre-trained on a large corpus of code and SQL.
221
+
222
+ **Engineering Decision:** The benchmark results showed that the Coder model's zero-shot SQL accuracy exceeded that of the general LoRA fine-tune, with faster inference and lower error rates on complex multi-table joins. The production architecture was updated accordingly. This outcome demonstrates a data-driven engineering decision: fine-tuning is not always the optimal path when a domain-specialized pretrained model exists for the target task.
223
+
224
+ See `Fine_Tuning_Qwen_2_5_3B.ipynb` and the `merged_qwen2_5_3b_text2sql` directory for the complete fine-tuning methodology and benchmark results.
225
+
226
+ ---
227
+
228
+ ## Technology Stack
229
+
230
+ | Component | Technology |
231
+ |---|---|
232
+ | Core Framework | Python 3.11+, FastAPI, Uvicorn |
233
+ | AI Orchestration | LlamaIndex, Model Context Protocol (MCP) |
234
+ | Local Inference | Ollama (C++ optimized, memory-mapped) |
235
+ | Text-to-SQL Model | qwen2.5-coder:1.5b |
236
+ | Vision/OCR Model | qwen3.5:2b (registered as granite_vision.qa) |
237
+ | Database ORM | SQLAlchemy |
238
+ | Containerization | Docker, Docker Compose |
239
+ | Databases | PostgreSQL, MySQL, SQLite, MS SQL Server, Oracle (SQLAlchemy; async engines for Postgres/MySQL/SQLite, sync-threaded execution for MSSQL/Oracle) |
240
+
241
+ ---
242
+
243
+ ## Installation and Setup
244
+
245
+ ### Prerequisites
246
+
247
+ - Ollama installed and running on the host machine
248
+ - Python 3.11 or higher
249
+ - Docker and Docker Compose
250
+ - A supported database (PostgreSQL, MySQL, SQLite, MS SQL Server, or Oracle) — or upload a `.sqlite`/`.csv` file
251
+
252
+ ### 1. Pull Required Models
253
+
254
+ ```bash
255
+ ollama pull qwen2.5-coder:1.5b
256
+ ollama pull qwen3.5:2b
257
+ ```
258
+
259
+ ### 2. Configure Environment
260
+
261
+ Install Python dependencies:
262
+
263
+ ```bash
264
+ pip install -r requirements.txt
265
+ ```
266
+
267
+ Create a `.env` file in the `Agent/` directory (see `.env.example` for the full reference).
268
+
269
+ **Recommended (cloud-only, no local models needed):** use the same HF Inference API configuration as the Hugging Face Spaces deployment:
270
+
271
+ ```env
272
+ DB_CONNECTION_URL=postgresql://user:password@localhost:5432/dbname
273
+ USE_HF_CLOUD=1
274
+ HF_API_TOKEN=hf_xxx
275
+ HF_LLM_MODEL=Qwen/Qwen2.5-Coder-7B-Instruct
276
+
277
+ # Cloud VQA via Groq (free tier)
278
+ GROQ_API_KEY=gsk_xxx
279
+ GROQ_VISION_MODEL=qwen/qwen3.8-27b
280
+ ```
281
+
282
+ **Local Ollama (optional):** with `USE_HF_CLOUD=0`, the configured Ollama model is used — and if it is not installed while `HF_API_TOKEN` is present, the worker **auto-falls back** to HF Inference (`HF_LLM_MODEL`) instead of failing with 404 handshakes.
283
+
284
+ ### 3. Run Without Docker
285
+
286
+ Start each microservice in a separate terminal:
287
+
288
+ ```bash
289
+ # Terminal 1 — Backend Worker
290
+ python -u -m uvicorn "Agent.worker:app" --port 8700
291
+
292
+ # Terminal 2 — MCP Tool Server
293
+ python -m uvicorn "Agent.mcp_server:app" --port 8701
294
+
295
+ # Terminal 3 — Web UI
296
+ python -m uvicorn "web.app:app" --port 8000
297
+ ```
298
+
299
+ Navigate to `http://localhost:8000` to interact with the system. Use the **Database** panel to connect your own database (connection URL or `.sqlite`/`.csv` upload) — the built-in employee sample is provided as a container-backed profile.
300
+
301
+ ### 4. Run With Docker
302
+
303
+ Update `OLLAMA_BASE_URL` in `docker-compose.yml` to point to your host machine's Ollama instance, then run:
304
+
305
+ ```bash
306
+ docker-compose up --build demo-agent-app
307
+ ```
308
+
309
+ The database containers include health checks and will be fully initialized before the application starts.
310
+
311
+ ---
312
+
313
+ ## Deployment on HuggingFace Spaces
314
+
315
+ ### Quick Deploy (current, cloud-only)
316
+
317
+ The app is fully cloud-based (`USE_HF_CLOUD=1`): Text-to-SQL runs on HF Inference
318
+ (`Qwen/Qwen2.5-Coder-7B-Instruct`), VQA on Groq (`qwen/qwen3.8-27b`), and the
319
+ built-in `demo_employee` SQLite profile ships with the repo — no external DB
320
+ service is needed on Spaces.
321
+
322
+ > **Note:** HF Spaces moved the **Docker SDK to a paid tier** (free CPU 2026).
323
+ > Deploy there with the free **Gradio SDK** instead — `app.py` at the repo root
324
+ > spawns the same three services the Docker image ran (worker `:8700`,
325
+ > MCP `:8701`, sepia web UI `:7860`) and mounts a minimal Gradio anchor page at
326
+ > `/gradio-lp`. The UI at `/` is unchanged.
327
+
328
+ 1. **Create the Space** — huggingface.co → *New Space* → SDK: **Gradio** →
329
+ blank template → name it (e.g. `querylens`). Hardware: free CPU basic.
330
+ 2. **Push the project files** into the Space repo. Easiest on Windows is the
331
+ bundled helper:
332
+ ```powershell
333
+ .\deploy_space.ps1 -SpaceName querylens
334
+ ```
335
+ It clones `huggingface.co/spaces/<you>/<name>`, copies the project across
336
+ (respecting the exclusions: no `.env`, no `chat_store/`, no 350 MB
337
+ `dataset_full` dumps, no `__pycache__`), merges the HF frontmatter into the
338
+ Space `README.md` (keeping the generated `sdk_version`), commits and pushes.
339
+ 3. **Add Secrets** (Space settings → Variables and Secrets — never commit them):
340
+ | Secret | Purpose |
341
+ |---|---|
342
+ | `HF_API_TOKEN` | HF Inference API — Text-to-SQL (`Qwen/Qwen2.5-Coder-7B-Instruct`) |
343
+ | `GROQ_API_KEY` | Groq vision VQA (`qwen/qwen3.8-27b`, free tier) |
344
+ No `DB_CONNECTION_URL` is required — the worker auto-activates the bundled demo.
345
+ Optional: set `DB_CONNECTION_URL` to a hosted Postgres (e.g. Neon) for a real
346
+ external database.
347
+ 4. **Open the Space** — the dark Graphite-Halo UI loads with the demo profile active.
348
+ The **Database** panel lets you register additional databases at runtime by
349
+ pasting any supported connection URL (`postgresql://`, `mysql://`,
350
+ `mssql://`, `oracle://`, `sqlite:///`) or uploading `.sqlite`/`.csv` files.
351
+
352
+ **Local Docker runs still work** for your own machine: `docker build` +
353
+ `docker-compose.yml` are unchanged and `start_hf.sh` serves the identical
354
+ stack — only the Spaces *hosting* path is now the Gradio launcher.
355
+
356
+ Note: free Spaces sleep after inactivity (cold start ~1–2 min). Uploaded schema
357
+ files and chat history are ephemeral unless you enable *Persistent Storage* in
358
+ the Space settings.
359
+
360
+ ### Historical deployment journey (reference)
361
+
362
+ This section documents the **complete deployment journey** — from the first proof-of-concept tunnel approach to the final production-ready hybrid architecture. Each phase is explained with commands and rationale so this can serve as a reference for deploying any multi-modal AI application on HuggingFace Spaces.
363
+
364
+ ---
365
+
366
+ ### Understanding HuggingFace Spaces Constraints
367
+
368
+ Before choosing a deployment strategy, it is essential to understand what the free tier of HuggingFace Spaces provides and restricts:
369
+
370
+ | Resource | Free Tier |
371
+ |----------|-----------|
372
+ | CPU | 2 vCPUs |
373
+ | RAM | 16 GB |
374
+ | GPU | None |
375
+ | Storage | Ephemeral (wiped on restart) |
376
+ | Public port | 7860 only |
377
+ | Timeout | Space sleeps after inactivity |
378
+
379
+ The key challenge: **running a local LLM (e.g. `qwen2.5-coder:1.5b`) via Ollama consumes ~1.5–3 GB RAM, leaving limited headroom for vision models and the application stack.** Running a vision-language model such as `qwen3.5:2b` (~3 GB) alongside the text model causes out-of-memory (OOM) failures on the free CPU tier.
380
+
381
+ ---
382
+
383
+ ### Phase 1 — Cloudflare Tunnel: Bridging Local Resources to the Cloud
384
+
385
+ #### Theory
386
+
387
+ The simplest approach to deploy a resource-intensive app on HF Spaces is to **not run the heavy models in the cloud at all**. Instead, you run the LLM and VLM locally on your development machine and expose the Ollama API endpoint to the internet via a secure tunnel. The HF Space container merely hosts the web frontend and proxies inference requests back to your local machine.
388
+
389
+ This approach has zero cloud compute cost and allows full GPU acceleration locally. However, it requires your development machine to remain **online and running at all times**, making it unsuitable for a persistent public demo.
390
+
391
+ #### Setup
392
+
393
+ **Step 1: Install Cloudflared on your local machine**
394
+ ```bash
395
+ # Windows (via winget)
396
+ winget install Cloudflare.cloudflared
397
+
398
+ # Or download directly
399
+ # https://github.com/cloudflare/cloudflared/releases
400
+ ```
401
+
402
+ **Step 2: Start Ollama locally**
403
+ ```bash
404
+ ollama serve
405
+ # Ollama now listens on http://localhost:11434
406
+ ```
407
+
408
+ **Step 3: Create a public tunnel to your local Ollama port**
409
+ ```bash
410
+ cloudflared tunnel --url http://localhost:11434
411
+ ```
412
+
413
+ Cloudflared will print a public HTTPS URL like:
414
+ ```
415
+ https://your-random-id.trycloudflare.com
416
+ ```
417
+
418
+ **Step 4: Set the tunnel URL as a secret in your HF Space**
419
+
420
+ In the HF Space settings under **Variables and Secrets**, add:
421
+ ```
422
+ OLLAMA_BASE_URL = https://your-random-id.trycloudflare.com
423
+ ```
424
+
425
+ The application code reads `OLLAMA_BASE_URL` and routes all inference calls through the tunnel to your local GPU.
426
+
427
+ #### Limitation
428
+
429
+ - The tunnel URL changes every time `cloudflared` restarts, requiring a secret update.
430
+ - Requires a continuously running local machine.
431
+ - Not viable for a shared capstone demo or public deployment.
432
+
433
+ ---
434
+
435
+ ### Phase 2 — Self-Contained Docker: Running Ollama Inside the Container
436
+
437
+ #### Theory
438
+
439
+ The next evolution is to **embed Ollama directly into the Docker image** and pull models at container startup. This makes the deployment fully self-contained — no external machine is needed. The HF Space container becomes a complete inference server.
440
+
441
+ The challenge is that HF Spaces rebuilds the Docker image on every push but does **not cache downloaded model weights** between restarts (storage is ephemeral). This means every **Factory Reboot** triggers a fresh ~1–3 GB model download, causing a cold-start delay of 2–5 minutes.
442
+
443
+ To prevent HF's health monitor from timing out the Space during this download, model pulling is performed **asynchronously in the background**, allowing the web UI to become responsive immediately while the model fetches in parallel.
444
+
445
+ #### Dockerfile Changes
446
+
447
+ Add Ollama installation to the `Dockerfile`:
448
+
449
+ ```dockerfile
450
+ # Install Ollama binary (pinned to a stable release)
451
+ RUN curl -L https://github.com/ollama/ollama/releases/download/v0.5.11/ollama-linux-amd64.tgz \
452
+ -o ollama.tgz && \
453
+ tar -C /usr -xzf ollama.tgz && \
454
+ rm ollama.tgz
455
+ ```
456
+
457
+ #### Startup Script (`start_hf.sh`)
458
+
459
+ ```bash
460
+ #!/bin/bash
461
+ export HOME=/root
462
+
463
+ echo "[HF-INIT] Starting Ollama server..."
464
+ ollama serve &
465
+ OLLAMA_PID=$!
466
+
467
+ # Wait for Ollama to become healthy (up to 20 attempts)
468
+ for i in $(seq 1 20); do
469
+ if curl -sf http://localhost:11434/api/tags > /dev/null 2>&1; then
470
+ echo "[HF-INIT] Ollama is ALIVE!"
471
+ break
472
+ fi
473
+ echo "[HF-INIT] Waiting... ($i/20)"
474
+ sleep 3
475
+ done
476
+
477
+ # Pull the text model asynchronously (non-blocking)
478
+ echo "[HF-INIT] Pulling qwen2.5-coder:1.5b in background..."
479
+ ollama pull qwen2.5-coder:1.5b &
480
+
481
+ # Start application services immediately (do not wait for model pull)
482
+ echo "[HF-INIT] Starting Backend Worker..."
483
+ python -m uvicorn Agent.worker:app --host 0.0.0.0 --port 8700 &
484
+
485
+ echo "[HF-INIT] Starting MCP Tool Server..."
486
+ python -m uvicorn Agent.mcp_server:app --host 0.0.0.0 --port 8701 &
487
+
488
+ echo "[HF-INIT] Starting Web UI on port 7860..."
489
+ exec python -m uvicorn web.app:app --host 0.0.0.0 --port 7860
490
+ ```
491
+
492
+ The `&` (ampersand) operator sends the model pull to the background. The `exec` on the last line replaces the shell process with the web server, ensuring HF's process monitor tracks the correct PID.
493
+
494
+ #### Limitation
495
+
496
+ - **Vision model OOM**: Adding `qwen3.5:2b` alongside `qwen2.5-coder:1.5b` exceeds the 16 GB RAM limit when both are loaded simultaneously.
497
+ - Model weights are re-downloaded on every Factory Reboot.
498
+ - Ollama version pinning is critical — newer models require newer Ollama binaries and pulling the wrong combination causes `412` errors.
499
+
500
+ ---
501
+
502
+ ### Phase 3 — Hybrid Serverless API (Final Production Architecture)
503
+
504
+ #### Theory
505
+
506
+ The final and most robust architecture eliminates the in-container LLM entirely for text generation and uses **external serverless inference APIs** instead. The container only runs lightweight services (web UI, API proxy, Tesseract OCR), while all neural inference is delegated to dedicated providers:
507
+
508
+ | Task | Provider | Model | Cost |
509
+ |------|----------|-------|------|
510
+ | Text-to-SQL | HuggingFace Inference API | `Qwen/Qwen2.5-Coder-7B-Instruct` | Free tier |
511
+ | Vision Q&A | Groq API | `meta-llama/llama-4-scout-17b-16e-instruct` | Free (14,400 req/day) |
512
+ | OCR | Tesseract (in container) | — | Free |
513
+ | Database | Neon PostgreSQL | — | Free tier |
514
+
515
+ This eliminates OOM risk entirely, removes the model download cold-start, and makes the container startup under 30 seconds.
516
+
517
+ #### Why Groq for Vision Instead of HuggingFace Serverless?
518
+
519
+ HuggingFace's serverless inference for vision-language models has two limitations on the free tier:
520
+ 1. Most VLM models are not routed through any enabled provider for free-tier accounts.
521
+ 2. Google Gemini's free tier blocks requests originating from cloud datacenter IP ranges (such as HF's infrastructure), setting the effective quota to zero even for valid free-tier API keys.
522
+
523
+ **Groq** is purpose-built for API-first server deployments and explicitly allows free-tier requests from cloud IPs. It provides 14,400 free requests per day with no IP restrictions.
524
+
525
+ #### Required HuggingFace Space Secrets
526
+
527
+ Set these in **Space Settings → Variables and Secrets**:
528
+
529
+ ```
530
+ USE_HF_CLOUD = 1
531
+ HF_API_TOKEN = # HuggingFace access token
532
+ GROQ_API_KEY = # From console.groq.com (free)
533
+ DB_CONNECTION_URL = # Neon PostgreSQL connection string
534
+ ```
535
+
536
+ #### Obtaining API Keys
537
+
538
+ **HuggingFace Token:**
539
+ 1. Go to https://huggingface.co/settings/tokens
540
+ 2. Create a token with `read` scope (or `write` if you need to push models)
541
+
542
+ **Groq API Key:**
543
+ 1. Go to https://console.groq.com
544
+ 2. Sign in with Google / GitHub
545
+ 3. Navigate to **API Keys** → **Create API Key**
546
+ 4. Copy the key
547
+
548
+ **Neon PostgreSQL:**
549
+ 1. Go to https://neon.tech
550
+ 2. Create a free project
551
+ 3. Copy the connection string from the dashboard
552
+
553
+ #### Slim Dockerfile (No Ollama Required)
554
+
555
+ ```dockerfile
556
+ FROM python:3.11-slim
557
+
558
+ ENV PYTHONDONTWRITEBYTECODE=1
559
+ ENV PYTHONUNBUFFERED=1
560
+ ENV USE_HF_CLOUD=1
561
+
562
+ RUN apt-get update && apt-get install -y \
563
+ curl \
564
+ tesseract-ocr \
565
+ libtesseract-dev \
566
+ gcc \
567
+ libpq-dev \
568
+ && rm -rf /var/lib/apt/lists/*
569
+
570
+ WORKDIR /app
571
+ COPY requirements.txt .
572
+ RUN pip install --no-cache-dir -r requirements.txt
573
+
574
+ COPY . .
575
+ RUN useradd -m -u 1000 appuser && chown -R appuser:appuser /app
576
+ USER appuser
577
+
578
+ CMD ["bash", "start_hf.sh"]
579
+ ```
580
+
581
+ #### Key `requirements.txt` Additions
582
+
583
+ ```txt
584
+ huggingface_hub # HF Inference API client
585
+ groq>=0.9.0 # Groq Vision API client
586
+ google-genai>=1.0.0 # Optional: Google Gemini (requires billing for cloud IPs)
587
+ pytesseract>=0.3.10 # Local OCR fallback
588
+ pillow>=10.0.0
589
+ ```
590
+
591
+ #### Deployment Steps
592
+
593
+ 1. **Create a HuggingFace Space** at https://huggingface.co/spaces
594
+ - SDK: **Docker**
595
+ - Visibility: Public or Private
596
+
597
+ 2. **Push your repository** to the Space's git remote:
598
+ ```bash
599
+ git remote add space https://huggingface.co/spaces/<your-username>/<space-name>
600
+ git push space main
601
+ ```
602
+
603
+ 3. **Add secrets** in Space Settings (see table above). Do **not** hardcode secrets in the Dockerfile or any committed file.
604
+
605
+ 4. **Factory Reboot** the Space after adding secrets to trigger a clean rebuild with the new environment variables.
606
+
607
+ 5. **Monitor the build logs** — a successful startup shows:
608
+ ```
609
+ [GRANITE_VQA] Target Model: meta-llama/llama-4-scout-17b-16e-instruct (via Groq Vision)
610
+ [INFO] CLOUD MODE: Initializing Official HF InferenceClient (Qwen/Qwen2.5-Coder-7B-Instruct)
611
+ INFO: Uvicorn running on http://0.0.0.0:7860
612
+ ```
613
+
614
+ #### Important Notes on Line Endings
615
+
616
+ HuggingFace containers run Linux. If you develop on Windows, your shell scripts will have `\r\n` (CRLF) line endings, which cause `bad interpreter` errors on Linux. Add this to your `Dockerfile` to strip them automatically:
617
+
618
+ ```dockerfile
619
+ RUN sed -i 's/\r$//' start_hf.sh && chmod +x start_hf.sh
620
+ ```
621
+
622
+ Alternatively, configure Git to normalize line endings:
623
+ ```bash
624
+ git config core.autocrlf input
625
+ ```
626
+
627
+
628
+ ---
629
+
630
+ ## Project Summary
631
+
632
+ This project demonstrates that a self-correcting, multi-modal AI pipeline can be built and deployed entirely on consumer hardware through careful architectural decisions: progressive SQL generation with semantic validation, unified MCP-based tool access across data modalities, dynamic VRAM orchestration to prevent memory exhaustion, and a hybrid containerization strategy that preserves native GPU performance while maintaining deployment portability.
633
+
634
+ The system was developed iteratively, with each architectural decision — from model selection to validation logic to infrastructure design — informed by observed failure modes and measured outcomes rather than theoretical assumptions.
635
+
636
+ ---
637
+ *Built with ❤️ for advanced Agentic Data Engineering.*
app.py ADDED
@@ -0,0 +1,187 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Hugging Face Spaces entrypoint — Gradio SDK on the free ZeroGPU tier
3
+ ====================================================================
4
+
5
+ Free personal accounts can only host Gradio Spaces on ZeroGPU hardware
6
+ (CPU-basic requires a paid plan), so this launcher satisfies ZeroGPU's
7
+ startup contract while keeping the exact three-service architecture the
8
+ Docker image used:
9
+
10
+ this process (port 7860, public)
11
+ ├── Agent.worker → spawned uvicorn :8700 (Text2SQL / DocVQA backend)
12
+ ├── Agent.mcp_server → spawned uvicorn :8701 (MCP tool server)
13
+ └── web.app FastAPI → grafted into Gradio's own server on :7860
14
+
15
+ ZeroGPU contract (all four sources of failure, proven by real deploys):
16
+ 1. ``spaces`` must be imported BEFORE gradio ("ZeroGPU spaces error if
17
+ the spaces library is not imported first — stricter since v2").
18
+ 2. At least one ``@spaces.GPU`` function must exist at module level.
19
+ 3. ZeroGPU's startup scan walks GRADIO'S REGISTERED EVENT HANDLERS — a
20
+ decorated function that is never bound to any event does not count
21
+ ("No @spaces.GPU function detected during startup"). Our no-op probe
22
+ is therefore registered as the ``.click`` handler of an invisible
23
+ button, so it is discoverable but can never actually be invoked
24
+ (nothing requests a GPU → zero quota consumed).
25
+ 4. A real ``demo.launch()`` is mandatory (``gr.mount_gradio_app`` +
26
+ ``uvicorn.run`` suppresses the ZeroGPU startup report path).
27
+
28
+ Serving strategy (proven pattern for FastAPI-on-ZeroGPU spaces):
29
+ - ``demo.launch(server_port=7860, prevent_thread_lock=True,
30
+ ssr_mode=False)`` makes Gradio own the public port.
31
+ - Our full FastAPI web app (sepia UI + /api proxies) is then grafted
32
+ into ``demo.app.router.routes`` as a Mount inserted in FRONT of
33
+ Gradio's routes, so ``/`` serves the sepia UI (Gradio also registers
34
+ ``get /`` and ``get /static/{path}``, which would otherwise shadow it).
35
+ - ``ssr_mode=False`` is mandatory: Spaces' Node SSR proxy intercepts
36
+ every request it does not recognise as Gradio-owned and never
37
+ forwards it to Python.
38
+ - Mounted sub-apps do not receive lifespan events, so the shared
39
+ httpx client of ``web.app`` is created eagerly after launch.
40
+
41
+ Outside ZeroGPU (local dev / Docker), the previous behaviour is kept:
42
+ ``gr.mount_gradio_app`` + ``uvicorn.run``.
43
+ """
44
+ import os
45
+ import socket
46
+ import sys
47
+ import time
48
+ import traceback
49
+
50
+ # -----------------------------------------------------------------------------
51
+ # Diagnostic env snapshot — printed FIRST so every deploy log is self-sufficient
52
+ # -----------------------------------------------------------------------------
53
+ _ZEROGPU_ENV_KEYS = (
54
+ "SPACES_ZERO_GPU",
55
+ "SPACES_ZERO_DEVICE_API_URL",
56
+ "SPACES_GRADIO_AUTO_WRAP",
57
+ "ZEROGPU_V2",
58
+ "ZEROGPU_OFFLOAD_DIR",
59
+ "GRADIO_SERVER_PORT",
60
+ "PORT",
61
+ )
62
+ print("[LAUNCHER] QueryLens app.py starting; ZeroGPU env snapshot:", flush=True)
63
+ for _key in _ZEROGPU_ENV_KEYS:
64
+ print(f"[LAUNCHER] env {_key}={os.environ.get(_key)!r}", flush=True)
65
+
66
+ # ZeroGPU rule 1: import spaces BEFORE anything else (gradio in particular)
67
+ try:
68
+ import spaces # noqa: E402 (provided by the HF runtime; absent locally)
69
+ except Exception:
70
+ spaces = None
71
+ print("[LAUNCHER] 'spaces' import FAILED — running in non-ZeroGPU mode:", flush=True)
72
+ traceback.print_exc()
73
+
74
+ if spaces is not None:
75
+ # NB: spaces.config is a MODULE; the Settings instance is spaces.config.Config.
76
+ _zero_settings = getattr(spaces.config, "Config", None)
77
+ print(
78
+ f"[LAUNCHER] spaces zero_gpu = {getattr(_zero_settings, 'zero_gpu', None)}, "
79
+ f"device_api = {getattr(_zero_settings, 'zero_device_api_url', None)!r}",
80
+ flush=True,
81
+ )
82
+
83
+ import subprocess
84
+ from pathlib import Path
85
+
86
+ ROOT = Path(__file__).resolve().parent
87
+ PORT = int(os.environ.get("PORT", "7860"))
88
+
89
+
90
+ # -----------------------------------------------------------------------------
91
+ # Background services (same as start_hf.sh in the Docker image).
92
+ # Port-guarded: the Spaces runtime can re-execute this script inside the same
93
+ # container, and duplicate uvicorn children would just exit with bind errors.
94
+ # -----------------------------------------------------------------------------
95
+ def _listening(port: int) -> bool:
96
+ with socket.socket() as s: # type: ignore[name-defined]
97
+ s.settimeout(0.25)
98
+ return s.connect_ex(("127.0.0.1", port)) == 0
99
+
100
+
101
+ def _spawn(module: str, port: int, name: str):
102
+ if _listening(port):
103
+ print(f"[LAUNCHER] {name} already listening on :{port} — skipping spawn", flush=True)
104
+ return None
105
+ print(f"[LAUNCHER] starting {name} on :{port} ...", flush=True)
106
+ return subprocess.Popen(
107
+ [sys.executable, "-u", "-m", "uvicorn", module,
108
+ "--host", "0.0.0.0", "--port", str(port)],
109
+ cwd=str(ROOT),
110
+ )
111
+
112
+
113
+ _worker = _spawn("Agent.worker:app", 8700, "backend worker")
114
+ _mcp = _spawn("Agent.mcp_server:app", 8701, "MCP tool server")
115
+
116
+ import gradio as gr # noqa: E402 (after 'spaces' — ZeroGPU rule 1)
117
+ from web.app import app as fastapi_app # noqa: E402
118
+
119
+ _ZERO_GPU = bool(spaces is not None and getattr(getattr(spaces.config, "Config", None), "zero_gpu", False))
120
+ print(f"[LAUNCHER] ZeroGPU branch = {_ZERO_GPU}", flush=True)
121
+
122
+ if spaces is not None:
123
+ @spaces.GPU
124
+ def _zerogpu_platform_check():
125
+ """Registered below as an invisible-button click handler.
126
+
127
+ Never meaningfully called in the UI: it exists because ZeroGPU's
128
+ startup scan walks Gradio's registered event handlers and kills the
129
+ container when none of them is decorated. The decorator only
130
+ allocates a GPU when the function actually runs, and the button is
131
+ invisible — so zero GPU quota is consumed for our CPU-only app."""
132
+ return None
133
+
134
+ with gr.Blocks(title="QueryLens") as _lp:
135
+ gr.Markdown(
136
+ "**QueryLens** — the full sepia UI is served at this Space's root `/`.\n\n"
137
+ "This page is only an anchor for the Gradio runtime."
138
+ )
139
+ gr.HTML('<a href="/" style="text-decoration:none;font-weight:600;">← Open the QueryLens UI</a>')
140
+ if spaces is not None:
141
+ # ZeroGPU rule 3: the decorated no-op must be bound to a real event
142
+ # so the startup scan discovers it. Invisible => unclickable.
143
+ _probe_btn = gr.Button("ZeroGPU platform probe", visible=False)
144
+ _probe_btn.click(_zerogpu_platform_check, None, None)
145
+
146
+
147
+ if __name__ == "__main__":
148
+ if _ZERO_GPU:
149
+ import httpx
150
+ import web.app as _webapp
151
+ from starlette.routing import Mount
152
+
153
+ try:
154
+ # Gradio owns the public port; prevent_thread_lock returns control
155
+ # so we can graft the web app below, then block_thread holds the
156
+ # main thread (what launch() would have done).
157
+ _lp.launch(
158
+ server_name="0.0.0.0",
159
+ server_port=PORT,
160
+ prevent_thread_lock=True,
161
+ ssr_mode=False,
162
+ )
163
+ except OSError as exc:
164
+ # The Spaces runtime re-executed this script while a first copy is
165
+ # already serving — do not touch the port, just idle forever.
166
+ print(f"[LAUNCHER] port {PORT} already held by the first instance ({exc}); idling", flush=True)
167
+ while True:
168
+ time.sleep(3600)
169
+
170
+ # Mounted sub-apps do not receive startup events — initialise the
171
+ # shared httpx client eagerly so /api proxies never see client=None.
172
+ if _webapp.client is None:
173
+ _webapp.client = httpx.AsyncClient(timeout=_webapp.WORKER_TIMEOUT)
174
+
175
+ # Serve the full web app in front of Gradio's own routes: the visible
176
+ # UI (root /) becomes the sepia web app, /api/* proxies work as-is.
177
+ _lp.app.router.routes.insert(0, Mount("/", app=fastapi_app, name="querylens_web"))
178
+ print(f"[LAUNCHER] QueryLens web UI live on http://0.0.0.0:{PORT}", flush=True)
179
+ try:
180
+ _lp.block_thread()
181
+ except KeyboardInterrupt:
182
+ pass
183
+ else:
184
+ app = gr.mount_gradio_app(fastapi_app, _lp, path="/gradio-lp")
185
+ print(f"[LAUNCHER] QueryLens web UI live on http://0.0.0.0:{PORT}", flush=True)
186
+ import uvicorn
187
+ uvicorn.run(app, host="0.0.0.0", port=PORT)
docker-compose.yml ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ version: '3.8'
2
+
3
+ services:
4
+ # Main Agentic Application (worker :8700, MCP tool server :8701, web UI :7860)
5
+ demo-agent-app:
6
+ build: .
7
+ container_name: demo-agent-app
8
+ restart: unless-stopped
9
+ env_file: Agent/.env
10
+ environment:
11
+ - OLLAMA_BASE_URL=http://172.27.224.1:11434
12
+ - LLM_CTX=4096
13
+ deploy:
14
+ resources:
15
+ limits:
16
+ cpus: '2.0'
17
+ memory: 4G
18
+ ports:
19
+ - "7860:7860" # Web UI (QueryLens)
20
+ - "8700:8700" # Worker API
21
+ - "8701:8701" # MCP tool server
22
+ depends_on:
23
+ demo-postgres:
24
+ condition: service_healthy
25
+ demo-mysql:
26
+ condition: service_healthy
27
+ volumes:
28
+ - ./Agent:/app/Agent
29
+ - ./web:/app/web
30
+ # Dynamic database profiles: uploaded schema files + profile registry
31
+ - demo-schema-uploads:/app/uploads/schemas
32
+ - demo-chat-store:/app/chat_store
33
+ networks:
34
+ - demo-net
35
+
36
+ # MySQL Sample Database (built-in employee demo)
37
+ demo-mysql:
38
+ image: mysql:8.0
39
+ container_name: demo-mysql
40
+ restart: unless-stopped
41
+ env_file: Agent/.env
42
+ ports:
43
+ - "${MYSQL_PORT:-3306}:3306"
44
+ volumes:
45
+ - ./employee-sample-database/mysql/dataset_small:/docker-entrypoint-initdb.d
46
+ - demo-mysql-data:/var/lib/mysql
47
+ networks:
48
+ - demo-net
49
+ healthcheck:
50
+ test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "--silent"]
51
+ interval: 5s
52
+ timeout: 5s
53
+ retries: 12
54
+ start_period: 30s
55
+
56
+ # PostgreSQL Sample Database (built-in employee demo)
57
+ demo-postgres:
58
+ image: postgres:15
59
+ container_name: demo-postgres
60
+ restart: unless-stopped
61
+ env_file: Agent/.env
62
+ ports:
63
+ - "${POSTGRES_PORT:-5432}:5432"
64
+ volumes:
65
+ - ./employee-sample-database/postgres/dataset_small:/docker-entrypoint-initdb.d
66
+ - demo-postgres-data:/var/lib/postgresql/data
67
+ networks:
68
+ - demo-net
69
+ healthcheck:
70
+ test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER:-postgres}"]
71
+ interval: 5s
72
+ timeout: 5s
73
+ retries: 12
74
+ start_period: 30s
75
+
76
+ volumes:
77
+ demo-mysql-data:
78
+ demo-postgres-data:
79
+ demo-schema-uploads:
80
+ demo-chat-store:
81
+
82
+ networks:
83
+ demo-net:
84
+ driver: bridge
employee-sample-database/.gitignore ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Binaries for programs and plugins
2
+ *.exe
3
+ *.exe~
4
+ *.dll
5
+ *.so
6
+ *.dylib
7
+
8
+ # IntelliJ (Goland, IDEA) folder
9
+ .idea
10
+
11
+ .DS_Store
employee-sample-database/CLAUDE.md ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # CLAUDE.md
2
+
3
+ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
+
5
+ # Employee Sample Database - Dev Guide
6
+
7
+ ## Database Installation Commands
8
+
9
+ ### MySQL
10
+ ```bash
11
+ # Install dataset (choose one size)
12
+ cd mysql/dataset_small && mysql -u <username> < employee.sql
13
+ cd mysql/dataset_large && mysql -u <username> < employee.sql
14
+ cd mysql/dataset_full && mysql -u <username> < employee.sql
15
+
16
+ # Alternative using install script
17
+ mysql/install_dataset_small.sh . <username>
18
+
19
+ # Test installation
20
+ cd mysql/dataset_small && mysql -t < test_employee_md5.sql
21
+ cd mysql/dataset_large && mysql -t < test_employee_md5.sql
22
+ cd mysql/dataset_full && mysql -t < test_employee_md5.sql
23
+
24
+ # Load optional functions (after dataset installation)
25
+ cd mysql/dataset_small && mysql < object.sql
26
+ ```
27
+
28
+ ### PostgreSQL
29
+ ```bash
30
+ # Install dataset (choose one size)
31
+ cd postgres/dataset_small && psql -c "CREATE DATABASE employee" && psql employee < employee.sql
32
+ cd postgres/dataset_large && psql -c "CREATE DATABASE employee" && psql employee < employee.sql
33
+ cd postgres/dataset_full && psql -c "CREATE DATABASE employee" && psql employee < employee.sql
34
+ ```
35
+
36
+ ### SQLite
37
+ ```bash
38
+ # Install dataset (small only)
39
+ cd sqlite/dataset_small && sqlite3 employee.db < employee.sql
40
+
41
+ # Test installation
42
+ cd sqlite/dataset_small && sqlite3 employee.db < test_employee_md5.sql
43
+ ```
44
+
45
+ ## Architecture Overview
46
+
47
+ This is a multi-database employee sample dataset repository with three database implementations (MySQL, PostgreSQL, SQLite) and three dataset sizes:
48
+
49
+ - **dataset_small** (~600KB, 1,000 employees) - For development and testing
50
+ - **dataset_large** (~6MB, 10,000 employees) - For performance testing
51
+ - **dataset_full** (~170MB, 300,024 employees) - Full production-scale dataset
52
+
53
+ ### Core Tables Schema
54
+ - `employee` - Employee records with personal info
55
+ - `department` - Department definitions
56
+ - `dept_emp` - Employee-department relationships
57
+ - `dept_manager` - Department manager assignments
58
+ - `salary` - Employee salary history
59
+ - `title` - Employee title history
60
+
61
+ ### Key Design Patterns
62
+ - Each table has individual load files (`load_employee.sql`, `load_department.sql`, etc.)
63
+ - All datasets maintain referential integrity and identical schema
64
+ - MD5 checksums verify data integrity after installation
65
+ - Singular table names (not plural) across all implementations
66
+ - MySQL includes optional stored functions (`object.sql`)
67
+
68
+ ## Important Notes
69
+
70
+ ### Cloud Database Setup
71
+ For AWS RDS and similar cloud MySQL instances, disable binary logging before loading functions:
72
+ ```sql
73
+ SET sql_log_bin = 0;
74
+ ```
75
+
76
+ ### Data Verification
77
+ Always run the MD5 test after installation to ensure data integrity. The test compares record counts and checksums against expected values for each table.
employee-sample-database/LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Copyright (c) 2022 tianzhou
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
employee-sample-database/README.md ADDED
@@ -0,0 +1 @@
 
 
1
+ Sample Employee Database
employee-sample-database/mysql/Dockerfile.small ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ FROM mysql/mysql-server
2
+
3
+ ENV MYSQL_ROOT_HOST=%
4
+ ENV MYSQL_ALLOW_EMPTY_PASSWORD=yes
5
+
6
+ COPY install_dataset_small.sh /docker-entrypoint-initdb.d
7
+ COPY dataset_small /dataset_small
employee-sample-database/mysql/README.md ADDED
@@ -0,0 +1,220 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Employee Sample Database for MySQL
2
+
3
+ This repo is based on the work from https://github.com/datacharmer/test_db with the following improvements:
4
+
5
+ 1. Create 2 separate datasets:
6
+
7
+ a. dataset_full (~170 MB). This is the same as the original one.
8
+
9
+ b. dataset_large (~6 MB). ~3% of the dataset_full (10000 employees vs 300024 employees).
10
+
11
+ c. dataset_small (~600 KB). ~0.3% of the dataset_full (1000 employees vs 300024 employees).
12
+
13
+ 1. Use singular form instead of plural form to name the table (e.g. `employees` -> `employee`).
14
+
15
+ 1. Update schema visualizer to make it more readable and include views.
16
+
17
+ 1. Only keep md5 to verify the data installation, remove SHA. There is no need to maintain 2 methods to verify the data.
18
+
19
+ 1. Remove unnecessary files.
20
+
21
+ ## Schema
22
+
23
+ ![Schema](schema.png)
24
+
25
+ ## Prerequisites
26
+
27
+ You need a MySQL database server (5.0+) and run the commands below through a
28
+ user that has the following privileges:
29
+
30
+ SELECT, INSERT, UPDATE, DELETE,
31
+ CREATE, DROP, RELOAD, REFERENCES,
32
+ INDEX, ALTER, SHOW DATABASES,
33
+ CREATE TEMPORARY TABLES,
34
+ LOCK TABLES, EXECUTE, CREATE VIEW
35
+
36
+ ## Installation:
37
+
38
+ 1. Download the repository
39
+ 2. Change directory to the repository
40
+ 3. Change directory to either `dataset_full`, `dataset_large` or `dataset_small`
41
+
42
+ Run:
43
+
44
+ ```bash
45
+ cd dataset_small
46
+ ```
47
+
48
+ Then run
49
+
50
+ ```
51
+ mysql < employee.sql
52
+ ```
53
+
54
+ ## Testing the installation
55
+
56
+ ### Testing `dataset_full`
57
+
58
+ // Under 'dataset_full' directory
59
+ mysql -t < test_employee_md5.sql
60
+
61
+ +----------------------+
62
+ | INFO |
63
+ +----------------------+
64
+ | TESTING INSTALLATION |
65
+ +----------------------+
66
+ +--------------+-----------------+----------------------------------+
67
+ | table_name | expected_record | expected_crc |
68
+ +--------------+-----------------+----------------------------------+
69
+ | department | 9 | d1af5e170d2d1591d776d5638d71fc5f |
70
+ | dept_emp | 331603 | ccf6fe516f990bdaa49713fc478701b7 |
71
+ | dept_manager | 24 | 8720e2f0853ac9096b689c14664f847e |
72
+ | employee | 300024 | 4ec56ab5ba37218d187cf6ab09ce1aa1 |
73
+ | salary | 2844047 | fd220654e95aea1b169624ffe3fca934 |
74
+ | title | 443308 | bfa016c472df68e70a03facafa1bc0a8 |
75
+ +--------------+-----------------+----------------------------------+
76
+ +--------------+------------------+----------------------------------+
77
+ | table_name | found_records | found_crc |
78
+ +--------------+------------------+----------------------------------+
79
+ | department | 9 | d1af5e170d2d1591d776d5638d71fc5f |
80
+ | dept_emp | 331603 | ccf6fe516f990bdaa49713fc478701b7 |
81
+ | dept_manager | 24 | 8720e2f0853ac9096b689c14664f847e |
82
+ | employee | 300024 | 4ec56ab5ba37218d187cf6ab09ce1aa1 |
83
+ | salary | 2844047 | fd220654e95aea1b169624ffe3fca934 |
84
+ | title | 443308 | bfa016c472df68e70a03facafa1bc0a8 |
85
+ +--------------+------------------+----------------------------------+
86
+ +--------------+---------------+-----------+
87
+ | table_name | records_match | crc_match |
88
+ +--------------+---------------+-----------+
89
+ | department | OK | ok |
90
+ | dept_emp | OK | ok |
91
+ | dept_manager | OK | ok |
92
+ | employee | OK | ok |
93
+ | salary | OK | ok |
94
+ | title | OK | ok |
95
+ +--------------+---------------+-----------+
96
+ +------------------+
97
+ | computation_time |
98
+ +------------------+
99
+ | 00:00:29 |
100
+ +------------------+
101
+ +---------+--------+
102
+ | summary | result |
103
+ +---------+--------+
104
+ | CRC | OK |
105
+ | count | OK |
106
+ +---------+--------+
107
+
108
+ ### Testing `dataset_large`
109
+
110
+ // Under 'dataset_large' directory
111
+ mysql -t < test_employee_md5.sql
112
+
113
+ +----------------------+
114
+ | INFO |
115
+ +----------------------+
116
+ | TESTING INSTALLATION |
117
+ +----------------------+
118
+ +--------------+-----------------+----------------------------------+
119
+ | table_name | expected_record | expected_crc |
120
+ +--------------+-----------------+----------------------------------+
121
+ | department | 9 | d1af5e170d2d1591d776d5638d71fc5f |
122
+ | dept_emp | 11051 | fc43a976d1406705d9707f6fea1df9df |
123
+ | dept_manager | 24 | 953e3c0c8360805645498ada817b66e9 |
124
+ | employee | 10000 | 2b9ee8043563317634407daf42a9ef0b |
125
+ | salary | 94917 | 0fcb81f97f6b0eacb01a22a085e6512d |
126
+ | title | 14782 | ffa808be19d75619f415e2964cbe0320 |
127
+ +--------------+-----------------+----------------------------------+
128
+ +--------------+------------------+----------------------------------+
129
+ | table_name | found_records | found_crc |
130
+ +--------------+------------------+----------------------------------+
131
+ | department | 9 | d1af5e170d2d1591d776d5638d71fc5f |
132
+ | dept_emp | 11051 | fc43a976d1406705d9707f6fea1df9df |
133
+ | dept_manager | 24 | 953e3c0c8360805645498ada817b66e9 |
134
+ | employee | 10000 | 2b9ee8043563317634407daf42a9ef0b |
135
+ | salary | 94917 | 0fcb81f97f6b0eacb01a22a085e6512d |
136
+ | title | 14782 | ffa808be19d75619f415e2964cbe0320 |
137
+ +--------------+------------------+----------------------------------+
138
+ +--------------+---------------+-----------+
139
+ | table_name | records_match | crc_match |
140
+ +--------------+---------------+-----------+
141
+ | department | OK | ok |
142
+ | dept_emp | OK | ok |
143
+ | dept_manager | OK | ok |
144
+ | employee | OK | ok |
145
+ | salary | OK | ok |
146
+ | title | OK | ok |
147
+ +--------------+---------------+-----------+
148
+ +------------------+
149
+ | computation_time |
150
+ +------------------+
151
+ | 00:00:02 |
152
+ +------------------+
153
+ +---------+--------+
154
+ | summary | result |
155
+ +---------+--------+
156
+ | CRC | OK |
157
+ | count | OK |
158
+ +---------+--------+
159
+
160
+ ### Testing `dataset_small`
161
+
162
+ // Under 'dataset_small' directory
163
+ mysql -t < test_employee_md5.sql
164
+
165
+ +----------------------+
166
+ | INFO |
167
+ +----------------------+
168
+ | TESTING INSTALLATION |
169
+ +----------------------+
170
+ +--------------+-----------------+----------------------------------+
171
+ | table_name | expected_record | expected_crc |
172
+ +--------------+-----------------+----------------------------------+
173
+ | department | 9 | d1af5e170d2d1591d776d5638d71fc5f |
174
+ | dept_emp | 1103 | e302aa5b56a69b49e40eb0d60674addc |
175
+ | dept_manager | 16 | 8ff425d5ad6dc56975998d1893b8dca9 |
176
+ | employee | 1000 | 595460127fb609c2b110b1796083e242 |
177
+ | salary | 9488 | 61f22cfece4d34f5bb94c9f05a3da3ef |
178
+ | title | 1470 | ba77dd331ce00f76c1643a7d73cdcee6 |
179
+ +--------------+-----------------+----------------------------------+
180
+ +--------------+------------------+----------------------------------+
181
+ | table_name | found_records | found_crc |
182
+ +--------------+------------------+----------------------------------+
183
+ | department | 9 | d1af5e170d2d1591d776d5638d71fc5f |
184
+ | dept_emp | 1103 | e302aa5b56a69b49e40eb0d60674addc |
185
+ | dept_manager | 16 | 8ff425d5ad6dc56975998d1893b8dca9 |
186
+ | employee | 1000 | 595460127fb609c2b110b1796083e242 |
187
+ | salary | 9488 | 61f22cfece4d34f5bb94c9f05a3da3ef |
188
+ | title | 1470 | ba77dd331ce00f76c1643a7d73cdcee6 |
189
+ +--------------+------------------+----------------------------------+
190
+ +--------------+---------------+-----------+
191
+ | table_name | records_match | crc_match |
192
+ +--------------+---------------+-----------+
193
+ | department | OK | ok |
194
+ | dept_emp | OK | ok |
195
+ | dept_manager | OK | ok |
196
+ | employee | OK | ok |
197
+ | salary | OK | ok |
198
+ | title | OK | ok |
199
+ +--------------+---------------+-----------+
200
+ +------------------+
201
+ | computation_time |
202
+ +------------------+
203
+ | 00:00:00 |
204
+ +------------------+
205
+ +---------+--------+
206
+ | summary | result |
207
+ +---------+--------+
208
+ | CRC | OK |
209
+ | count | OK |
210
+ +---------+--------+
211
+
212
+ ## Installing the function (optional)
213
+
214
+ ```bash
215
+ mysql < object.sql
216
+ ```
217
+
218
+ **If you are connecting to a cloud instance such as AWS RDS. You MUST turn off binary logging first. Otherwise, you will encounter error**
219
+
220
+ You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
employee-sample-database/mysql/dataset_small/01_employee.sql ADDED
@@ -0,0 +1,125 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ -- Sample employee database
2
+ -- See changelog table for details
3
+ -- Copyright (C) 2007,2008, MySQL AB
4
+ --
5
+ -- Original data created by Fusheng Wang and Carlo Zaniolo
6
+ -- http://www.cs.aau.dk/TimeCenter/software.htm
7
+ -- http://www.cs.aau.dk/TimeCenter/Data/employeeTemporalDataSet.zip
8
+ --
9
+ -- Current schema by Giuseppe Maxia
10
+ -- Data conversion from XML to relational by Patrick Crews
11
+ --
12
+ -- This work is licensed under the
13
+ -- Creative Commons Attribution-Share Alike 3.0 Unported License.
14
+ -- To view a copy of this license, visit
15
+ -- http://creativecommons.org/licenses/by-sa/3.0/ or send a letter to
16
+ -- Creative Commons, 171 Second Street, Suite 300, San Francisco,
17
+ -- California, 94105, USA.
18
+ --
19
+ -- DISCLAIMER
20
+ -- To the best of our knowledge, this data is fabricated, and
21
+ -- it does not correspond to real people.
22
+ -- Any similarity to existing people is purely coincidental.
23
+ --
24
+
25
+ DROP DATABASE IF EXISTS employee;
26
+ CREATE DATABASE IF NOT EXISTS employee;
27
+ USE employee;
28
+
29
+ SELECT 'CREATING DATABASE STRUCTURE' as 'INFO';
30
+
31
+ DROP TABLE IF EXISTS dept_emp,
32
+ dept_manager,
33
+ title,
34
+ salary,
35
+ employee,
36
+ department;
37
+
38
+ /*!50503 set default_storage_engine = InnoDB */;
39
+ /*!50503 select CONCAT('storage engine: ', @@default_storage_engine) as INFO */;
40
+
41
+ CREATE TABLE employee (
42
+ emp_no INT NOT NULL,
43
+ birth_date DATE NOT NULL,
44
+ first_name VARCHAR(14) NOT NULL,
45
+ last_name VARCHAR(16) NOT NULL,
46
+ gender ENUM ('M','F') NOT NULL,
47
+ hire_date DATE NOT NULL,
48
+ PRIMARY KEY (emp_no)
49
+ );
50
+
51
+ CREATE TABLE department (
52
+ dept_no CHAR(4) NOT NULL,
53
+ dept_name VARCHAR(40) NOT NULL,
54
+ PRIMARY KEY (dept_no),
55
+ UNIQUE KEY (dept_name)
56
+ );
57
+
58
+ CREATE TABLE dept_manager (
59
+ emp_no INT NOT NULL,
60
+ dept_no CHAR(4) NOT NULL,
61
+ from_date DATE NOT NULL,
62
+ to_date DATE NOT NULL,
63
+ FOREIGN KEY (emp_no) REFERENCES employee (emp_no) ON DELETE CASCADE,
64
+ FOREIGN KEY (dept_no) REFERENCES department (dept_no) ON DELETE CASCADE,
65
+ PRIMARY KEY (emp_no,dept_no)
66
+ );
67
+
68
+ CREATE TABLE dept_emp (
69
+ emp_no INT NOT NULL,
70
+ dept_no CHAR(4) NOT NULL,
71
+ from_date DATE NOT NULL,
72
+ to_date DATE NOT NULL,
73
+ FOREIGN KEY (emp_no) REFERENCES employee (emp_no) ON DELETE CASCADE,
74
+ FOREIGN KEY (dept_no) REFERENCES department (dept_no) ON DELETE CASCADE,
75
+ PRIMARY KEY (emp_no,dept_no)
76
+ );
77
+
78
+ CREATE TABLE title (
79
+ emp_no INT NOT NULL,
80
+ title VARCHAR(50) NOT NULL,
81
+ from_date DATE NOT NULL,
82
+ to_date DATE,
83
+ FOREIGN KEY (emp_no) REFERENCES employee (emp_no) ON DELETE CASCADE,
84
+ PRIMARY KEY (emp_no,title, from_date)
85
+ )
86
+ ;
87
+
88
+ CREATE TABLE salary (
89
+ emp_no INT NOT NULL,
90
+ amount INT NOT NULL,
91
+ from_date DATE NOT NULL,
92
+ to_date DATE NOT NULL,
93
+ FOREIGN KEY (emp_no) REFERENCES employee (emp_no) ON DELETE CASCADE,
94
+ PRIMARY KEY (emp_no, from_date)
95
+ )
96
+ ;
97
+
98
+ CREATE OR REPLACE VIEW dept_emp_latest_date AS
99
+ SELECT emp_no, MAX(from_date) AS from_date, MAX(to_date) AS to_date
100
+ FROM dept_emp
101
+ GROUP BY emp_no;
102
+
103
+ # shows only the current department for each employee
104
+ CREATE OR REPLACE VIEW current_dept_emp AS
105
+ SELECT l.emp_no, dept_no, l.from_date, l.to_date
106
+ FROM dept_emp d
107
+ INNER JOIN dept_emp_latest_date l
108
+ ON d.emp_no=l.emp_no AND d.from_date=l.from_date AND l.to_date = d.to_date;
109
+
110
+ flush /*!50503 binary */ logs;
111
+
112
+ SELECT 'LOADING department' as 'INFO';
113
+ SOURCE /docker-entrypoint-initdb.d/load_department.sql;
114
+ SELECT 'LOADING employee' as 'INFO';
115
+ source /docker-entrypoint-initdb.d/load_employee.sql ;
116
+ SELECT 'LOADING dept_emp' as 'INFO';
117
+ source /docker-entrypoint-initdb.d/load_dept_emp.sql ;
118
+ SELECT 'LOADING dept_manager' as 'INFO';
119
+ source /docker-entrypoint-initdb.d/load_dept_manager.sql ;
120
+ SELECT 'LOADING title' as 'INFO';
121
+ source /docker-entrypoint-initdb.d/load_title.sql ;
122
+ SELECT 'LOADING salary' as 'INFO';
123
+ source /docker-entrypoint-initdb.d/load_salary1.sql ;
124
+
125
+ source /docker-entrypoint-initdb.d/show_elapsed.sql ;
employee-sample-database/mysql/dataset_small/load_department.sql ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ INSERT INTO `department` VALUES
2
+ ('d001','Marketing'),
3
+ ('d002','Finance'),
4
+ ('d003','Human Resources'),
5
+ ('d004','Production'),
6
+ ('d005','Development'),
7
+ ('d006','Quality Management'),
8
+ ('d007','Sales'),
9
+ ('d008','Research'),
10
+ ('d009','Customer Service');
employee-sample-database/mysql/dataset_small/load_dept_emp.sql ADDED
@@ -0,0 +1,1103 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ INSERT INTO `dept_emp` VALUES (10001,'d005','1986-06-26','9999-01-01'),
2
+ (10002,'d007','1996-08-03','9999-01-01'),
3
+ (10003,'d004','1995-12-03','9999-01-01'),
4
+ (10004,'d004','1986-12-01','9999-01-01'),
5
+ (10005,'d003','1989-09-12','9999-01-01'),
6
+ (10006,'d005','1990-08-05','9999-01-01'),
7
+ (10007,'d008','1989-02-10','9999-01-01'),
8
+ (10008,'d005','1998-03-11','2000-07-31'),
9
+ (10009,'d006','1985-02-18','9999-01-01'),
10
+ (10010,'d004','1996-11-24','2000-06-26'),
11
+ (10010,'d006','2000-06-26','9999-01-01'),
12
+ (10011,'d009','1990-01-22','1996-11-09'),
13
+ (10012,'d005','1992-12-18','9999-01-01'),
14
+ (10013,'d003','1985-10-20','9999-01-01'),
15
+ (10014,'d005','1993-12-29','9999-01-01'),
16
+ (10015,'d008','1992-09-19','1993-08-22'),
17
+ (10016,'d007','1998-02-11','9999-01-01'),
18
+ (10017,'d001','1993-08-03','9999-01-01'),
19
+ (10018,'d004','1992-07-29','9999-01-01'),
20
+ (10018,'d005','1987-04-03','1992-07-29'),
21
+ (10019,'d008','1999-04-30','9999-01-01'),
22
+ (10020,'d004','1997-12-30','9999-01-01'),
23
+ (10021,'d005','1988-02-10','2002-07-15'),
24
+ (10022,'d005','1999-09-03','9999-01-01'),
25
+ (10023,'d005','1999-09-27','9999-01-01'),
26
+ (10024,'d004','1998-06-14','9999-01-01'),
27
+ (10025,'d005','1987-08-17','1997-10-15'),
28
+ (10026,'d004','1995-03-20','9999-01-01'),
29
+ (10027,'d005','1995-04-02','9999-01-01'),
30
+ (10028,'d005','1991-10-22','1998-04-06'),
31
+ (10029,'d004','1991-09-18','1999-07-08'),
32
+ (10029,'d006','1999-07-08','9999-01-01'),
33
+ (10030,'d004','1994-02-17','9999-01-01'),
34
+ (10031,'d005','1991-09-01','9999-01-01'),
35
+ (10032,'d004','1990-06-20','9999-01-01'),
36
+ (10033,'d006','1987-03-18','1993-03-24'),
37
+ (10034,'d007','1995-04-12','1999-10-31'),
38
+ (10035,'d004','1988-09-05','9999-01-01'),
39
+ (10036,'d003','1992-04-28','9999-01-01'),
40
+ (10037,'d005','1990-12-05','9999-01-01'),
41
+ (10038,'d009','1989-09-20','9999-01-01'),
42
+ (10039,'d003','1988-01-19','9999-01-01'),
43
+ (10040,'d005','1993-02-14','2002-01-22'),
44
+ (10040,'d008','2002-01-22','9999-01-01'),
45
+ (10041,'d007','1989-11-12','9999-01-01'),
46
+ (10042,'d002','1993-03-21','2000-08-10'),
47
+ (10043,'d005','1990-10-20','9999-01-01'),
48
+ (10044,'d004','1994-05-21','9999-01-01'),
49
+ (10045,'d004','1996-11-16','9999-01-01'),
50
+ (10046,'d008','1992-06-20','9999-01-01'),
51
+ (10047,'d004','1989-03-31','9999-01-01'),
52
+ (10048,'d005','1985-02-24','1987-01-27'),
53
+ (10049,'d009','1992-05-04','9999-01-01'),
54
+ (10050,'d002','1990-12-25','1992-11-05'),
55
+ (10050,'d007','1992-11-05','9999-01-01'),
56
+ (10051,'d004','1992-10-15','9999-01-01'),
57
+ (10052,'d008','1997-01-31','9999-01-01'),
58
+ (10053,'d007','1994-11-13','9999-01-01'),
59
+ (10054,'d003','1995-07-29','9999-01-01'),
60
+ (10055,'d001','1992-04-27','1995-07-22'),
61
+ (10056,'d005','1990-02-01','9999-01-01'),
62
+ (10057,'d005','1992-01-15','9999-01-01'),
63
+ (10058,'d001','1988-04-25','9999-01-01'),
64
+ (10059,'d002','1991-06-26','9999-01-01'),
65
+ (10060,'d007','1989-05-28','1992-11-11'),
66
+ (10060,'d009','1992-11-11','9999-01-01'),
67
+ (10061,'d007','1989-12-02','9999-01-01'),
68
+ (10062,'d005','1991-08-30','9999-01-01'),
69
+ (10063,'d004','1989-04-08','9999-01-01'),
70
+ (10064,'d008','1985-11-20','1992-03-02'),
71
+ (10065,'d005','1998-05-24','9999-01-01'),
72
+ (10066,'d005','1986-02-26','9999-01-01'),
73
+ (10067,'d006','1987-03-04','9999-01-01'),
74
+ (10068,'d007','1987-08-07','9999-01-01'),
75
+ (10069,'d004','1992-06-14','9999-01-01'),
76
+ (10070,'d005','1985-10-14','1995-10-18'),
77
+ (10070,'d008','1995-10-18','9999-01-01'),
78
+ (10071,'d003','1995-08-05','9999-01-01'),
79
+ (10072,'d005','1989-05-21','9999-01-01'),
80
+ (10073,'d006','1998-02-02','1998-02-22'),
81
+ (10074,'d005','1990-08-13','9999-01-01'),
82
+ (10075,'d005','1988-05-17','2001-01-15'),
83
+ (10076,'d005','1996-07-15','9999-01-01'),
84
+ (10077,'d003','1994-12-23','9999-01-01'),
85
+ (10078,'d005','1994-09-29','9999-01-01'),
86
+ (10079,'d005','1995-12-13','9999-01-01'),
87
+ (10080,'d002','1994-09-28','1997-07-09'),
88
+ (10080,'d003','1997-07-09','9999-01-01'),
89
+ (10081,'d004','1986-10-30','9999-01-01'),
90
+ (10082,'d008','1990-01-03','1990-01-15'),
91
+ (10083,'d004','1987-03-31','9999-01-01'),
92
+ (10084,'d004','1995-12-15','9999-01-01'),
93
+ (10085,'d004','1994-04-09','9999-01-01'),
94
+ (10086,'d003','1992-02-19','9999-01-01'),
95
+ (10087,'d007','1997-05-08','2001-01-09'),
96
+ (10088,'d007','1988-09-02','1992-03-21'),
97
+ (10088,'d009','1992-03-21','9999-01-01'),
98
+ (10089,'d007','1989-01-10','9999-01-01'),
99
+ (10090,'d005','1986-03-14','1999-05-07'),
100
+ (10091,'d005','1992-11-18','9999-01-01'),
101
+ (10092,'d005','1996-04-22','9999-01-01'),
102
+ (10093,'d007','1997-06-08','9999-01-01'),
103
+ (10094,'d008','1987-04-18','1997-11-08'),
104
+ (10095,'d007','1994-03-10','9999-01-01'),
105
+ (10096,'d004','1999-01-23','9999-01-01'),
106
+ (10097,'d008','1990-09-15','9999-01-01'),
107
+ (10098,'d004','1985-05-13','1989-06-29'),
108
+ (10098,'d009','1989-06-29','1992-12-11'),
109
+ (10099,'d007','1988-10-18','9999-01-01'),
110
+ (10100,'d003','1987-09-21','9999-01-01'),
111
+ (10101,'d007','1998-10-14','2000-09-23'),
112
+ (10102,'d004','1995-01-02','9999-01-01'),
113
+ (10103,'d005','1998-01-12','9999-01-01'),
114
+ (10104,'d008','1987-04-16','9999-01-01'),
115
+ (10105,'d003','1999-05-17','2001-06-11'),
116
+ (10106,'d004','1991-10-27','9999-01-01'),
117
+ (10107,'d007','1999-03-30','9999-01-01'),
118
+ (10108,'d001','1999-12-06','2001-10-20'),
119
+ (10108,'d003','1999-03-20','1999-12-06'),
120
+ (10109,'d004','1993-06-16','9999-01-01'),
121
+ (10110,'d003','1986-08-22','9999-01-01'),
122
+ (10111,'d006','1988-12-19','9999-01-01'),
123
+ (10112,'d009','1998-05-01','9999-01-01'),
124
+ (10113,'d004','1998-09-14','9999-01-01'),
125
+ (10114,'d008','1992-07-17','9999-01-01'),
126
+ (10115,'d009','1988-03-03','1992-05-24'),
127
+ (10116,'d005','1994-02-27','1995-12-03'),
128
+ (10116,'d008','1995-12-03','1998-11-01'),
129
+ (10117,'d004','1992-03-19','9999-01-01'),
130
+ (10118,'d005','1992-02-02','9999-01-01'),
131
+ (10119,'d004','1993-12-09','1997-10-30'),
132
+ (10120,'d004','1996-07-06','9999-01-01'),
133
+ (10121,'d005','1989-05-03','9999-01-01'),
134
+ (10122,'d005','1998-08-06','9999-01-01'),
135
+ (10123,'d004','1993-01-15','9999-01-01'),
136
+ (10124,'d004','1991-09-05','1999-06-06'),
137
+ (10124,'d006','1999-06-06','9999-01-01'),
138
+ (10125,'d007','1990-10-26','1996-03-25'),
139
+ (10126,'d009','1985-09-08','9999-01-01'),
140
+ (10127,'d005','1991-05-17','9999-01-01'),
141
+ (10128,'d009','1988-06-06','9999-01-01'),
142
+ (10129,'d005','1996-01-16','9999-01-01'),
143
+ (10130,'d004','1988-06-21','9999-01-01'),
144
+ (10131,'d004','1999-09-17','1999-12-06'),
145
+ (10132,'d002','1997-06-18','9999-01-01'),
146
+ (10133,'d004','1985-12-15','9999-01-01'),
147
+ (10134,'d004','1993-12-02','9999-01-01'),
148
+ (10134,'d005','1987-12-12','1993-12-02'),
149
+ (10135,'d004','1990-01-04','9999-01-01'),
150
+ (10136,'d007','1988-06-13','1999-09-20'),
151
+ (10137,'d009','1985-02-18','9999-01-01'),
152
+ (10138,'d006','1992-03-03','9999-01-01'),
153
+ (10139,'d005','1998-03-15','9999-01-01'),
154
+ (10140,'d001','1991-03-14','9999-01-01'),
155
+ (10141,'d008','1998-07-23','9999-01-01'),
156
+ (10142,'d005','1993-10-28','9999-01-01'),
157
+ (10143,'d005','1988-09-30','9999-01-01'),
158
+ (10144,'d002','1985-10-14','1988-09-02'),
159
+ (10144,'d003','1988-09-02','1993-08-10'),
160
+ (10145,'d005','1999-11-03','9999-01-01'),
161
+ (10146,'d002','1988-06-28','1990-09-07'),
162
+ (10147,'d002','1987-12-18','9999-01-01'),
163
+ (10148,'d007','1996-07-15','9999-01-01'),
164
+ (10149,'d007','1994-01-28','1996-08-27'),
165
+ (10150,'d005','1986-11-16','9999-01-01'),
166
+ (10151,'d007','1992-12-12','9999-01-01'),
167
+ (10152,'d006','1986-01-27','1987-08-03'),
168
+ (10153,'d005','2000-01-08','9999-01-01'),
169
+ (10154,'d009','1996-10-23','9999-01-01'),
170
+ (10155,'d004','1990-07-12','9999-01-01'),
171
+ (10155,'d008','1990-01-05','1990-07-12'),
172
+ (10156,'d006','1993-05-14','9999-01-01'),
173
+ (10157,'d005','1997-12-10','9999-01-01'),
174
+ (10158,'d004','1987-06-04','9999-01-01'),
175
+ (10159,'d006','1996-06-12','9999-01-01'),
176
+ (10160,'d007','1993-12-06','9999-01-01'),
177
+ (10161,'d004','1991-06-09','1994-01-05'),
178
+ (10162,'d004','1998-05-27','9999-01-01'),
179
+ (10163,'d003','1992-02-02','9999-01-01'),
180
+ (10164,'d004','1990-10-19','2000-05-31'),
181
+ (10164,'d009','2000-05-31','9999-01-01'),
182
+ (10165,'d002','1988-05-17','9999-01-01'),
183
+ (10166,'d005','1996-09-02','9999-01-01'),
184
+ (10167,'d004','1992-04-04','9999-01-01'),
185
+ (10168,'d008','1986-12-06','9999-01-01'),
186
+ (10169,'d005','1998-06-28','9999-01-01'),
187
+ (10170,'d004','1986-01-02','1989-02-06'),
188
+ (10171,'d004','1996-08-05','9999-01-01'),
189
+ (10172,'d005','1998-02-04','1998-10-01'),
190
+ (10172,'d008','1998-10-01','9999-01-01'),
191
+ (10173,'d002','1992-03-21','9999-01-01'),
192
+ (10174,'d004','1987-06-01','9999-01-01'),
193
+ (10175,'d001','1988-09-24','1995-05-24'),
194
+ (10176,'d009','1994-12-22','9999-01-01'),
195
+ (10177,'d002','1993-02-06','1994-03-17'),
196
+ (10178,'d007','1994-03-21','9999-01-01'),
197
+ (10179,'d005','2000-01-25','9999-01-01'),
198
+ (10180,'d002','1994-07-01','9999-01-01'),
199
+ (10181,'d005','1988-06-22','9999-01-01'),
200
+ (10182,'d005','1990-09-02','1999-01-05'),
201
+ (10182,'d008','1999-01-05','9999-01-01'),
202
+ (10183,'d009','1996-08-11','9999-01-01'),
203
+ (10184,'d009','1997-12-26','9999-01-01'),
204
+ (10185,'d007','1986-03-01','9999-01-01'),
205
+ (10186,'d002','1996-12-25','1997-08-16'),
206
+ (10187,'d002','1991-06-01','9999-01-01'),
207
+ (10188,'d004','1987-08-27','9999-01-01'),
208
+ (10189,'d005','1992-09-13','1993-06-29'),
209
+ (10190,'d004','1986-06-23','9999-01-01'),
210
+ (10191,'d005','1986-04-10','9999-01-01'),
211
+ (10192,'d004','1999-08-09','9999-01-01'),
212
+ (10192,'d006','1988-06-13','1999-08-09'),
213
+ (10193,'d005','1996-09-21','9999-01-01'),
214
+ (10194,'d002','1997-02-14','9999-01-01'),
215
+ (10195,'d004','1985-02-15','2001-04-14'),
216
+ (10196,'d002','1999-01-31','9999-01-01'),
217
+ (10197,'d005','1994-06-28','9999-01-01'),
218
+ (10198,'d005','1985-08-31','9999-01-01'),
219
+ (10199,'d007','1998-02-07','9999-01-01'),
220
+ (10200,'d004','1994-02-17','2000-10-03'),
221
+ (10200,'d006','2000-10-03','9999-01-01'),
222
+ (10201,'d005','1992-11-10','9999-01-01'),
223
+ (10202,'d005','1991-10-06','9999-01-01'),
224
+ (10203,'d008','1989-04-06','9999-01-01'),
225
+ (10204,'d005','1998-12-18','1999-03-08'),
226
+ (10205,'d004','1993-08-23','9999-01-01'),
227
+ (10206,'d005','1988-04-19','9999-01-01'),
228
+ (10207,'d005','1992-10-11','9999-01-01'),
229
+ (10208,'d001','1995-02-05','1999-05-15'),
230
+ (10209,'d002','1991-11-23','1999-08-07'),
231
+ (10209,'d007','1999-08-07','9999-01-01'),
232
+ (10210,'d009','1996-02-24','9999-01-01'),
233
+ (10211,'d005','1991-11-22','9999-01-01'),
234
+ (10212,'d005','1996-01-28','9999-01-01'),
235
+ (10213,'d009','1994-10-06','9999-01-01'),
236
+ (10214,'d007','1988-02-29','9999-01-01'),
237
+ (10215,'d007','1991-11-23','9999-01-01'),
238
+ (10216,'d008','1987-10-30','9999-01-01'),
239
+ (10217,'d004','1986-05-12','1993-08-05'),
240
+ (10218,'d004','1997-01-31','9999-01-01'),
241
+ (10219,'d005','1994-10-23','9999-01-01'),
242
+ (10219,'d009','1993-03-31','1994-10-23'),
243
+ (10220,'d002','1997-09-16','9999-01-01'),
244
+ (10221,'d004','1988-06-08','2000-10-04'),
245
+ (10222,'d004','1986-06-08','9999-01-01'),
246
+ (10223,'d005','1998-04-01','9999-01-01'),
247
+ (10224,'d004','1988-01-09','9999-01-01'),
248
+ (10225,'d009','1995-12-14','9999-01-01'),
249
+ (10226,'d007','1996-01-29','9999-01-01'),
250
+ (10227,'d005','1994-11-01','9999-01-01'),
251
+ (10228,'d001','1993-01-28','9999-01-01'),
252
+ (10228,'d007','1992-12-22','1993-01-28'),
253
+ (10229,'d006','1996-02-20','2000-06-30'),
254
+ (10230,'d008','1996-06-16','9999-01-01'),
255
+ (10231,'d009','1998-09-09','9999-01-01'),
256
+ (10232,'d007','1992-06-04','9999-01-01'),
257
+ (10233,'d003','1994-04-29','9999-01-01'),
258
+ (10234,'d007','1990-11-19','1999-08-06'),
259
+ (10235,'d004','1995-04-06','9999-01-01'),
260
+ (10236,'d007','1996-08-30','9999-01-01'),
261
+ (10237,'d007','1989-08-11','2000-02-21'),
262
+ (10238,'d005','1995-03-31','1996-05-25'),
263
+ (10238,'d008','1996-05-25','9999-01-01'),
264
+ (10239,'d001','1996-05-04','9999-01-01'),
265
+ (10240,'d006','1998-10-06','9999-01-01'),
266
+ (10241,'d002','1988-06-12','9999-01-01'),
267
+ (10242,'d004','1988-01-18','9999-01-01'),
268
+ (10243,'d007','1986-06-07','9999-01-01'),
269
+ (10244,'d005','1999-09-16','9999-01-01'),
270
+ (10245,'d008','1994-04-21','1995-02-20'),
271
+ (10246,'d004','1991-02-01','9999-01-01'),
272
+ (10247,'d004','1992-08-14','9999-01-01'),
273
+ (10248,'d007','1991-08-13','9999-01-01'),
274
+ (10249,'d005','1991-12-08','1998-04-13'),
275
+ (10249,'d008','1998-04-13','9999-01-01'),
276
+ (10250,'d006','1992-08-30','9999-01-01'),
277
+ (10251,'d008','1992-06-25','9999-01-01'),
278
+ (10252,'d004','1990-11-08','9999-01-01'),
279
+ (10253,'d007','1985-02-21','1994-03-20'),
280
+ (10254,'d007','1990-06-14','9999-01-01'),
281
+ (10255,'d004','1993-05-12','1999-11-14'),
282
+ (10256,'d007','1985-10-12','9999-01-01'),
283
+ (10257,'d004','1997-07-16','9999-01-01'),
284
+ (10258,'d005','1985-05-17','9999-01-01'),
285
+ (10259,'d001','1987-07-25','1994-08-15'),
286
+ (10259,'d009','1994-08-15','1999-01-06'),
287
+ (10260,'d004','1993-02-01','9999-01-01'),
288
+ (10261,'d005','1996-09-11','1999-02-23'),
289
+ (10262,'d007','1996-01-22','9999-01-01'),
290
+ (10263,'d002','1996-12-21','9999-01-01'),
291
+ (10264,'d005','1997-07-16','9999-01-01'),
292
+ (10265,'d006','1997-09-12','9999-01-01'),
293
+ (10266,'d004','1990-05-25','9999-01-01'),
294
+ (10267,'d004','1997-04-26','9999-01-01'),
295
+ (10268,'d004','1988-04-15','1990-08-17'),
296
+ (10268,'d005','1986-12-17','1988-04-15'),
297
+ (10269,'d004','1988-07-24','9999-01-01'),
298
+ (10270,'d007','1991-09-26','9999-01-01'),
299
+ (10271,'d005','1986-05-23','9999-01-01'),
300
+ (10272,'d002','1997-10-23','9999-01-01'),
301
+ (10273,'d007','1985-11-06','9999-01-01'),
302
+ (10274,'d005','1997-02-02','9999-01-01'),
303
+ (10275,'d005','1987-09-08','9999-01-01'),
304
+ (10276,'d005','1986-10-19','2000-02-04'),
305
+ (10277,'d007','1985-06-16','9999-01-01'),
306
+ (10278,'d005','1993-07-02','1997-02-14'),
307
+ (10279,'d004','1995-04-26','1999-07-11'),
308
+ (10279,'d009','1999-07-11','9999-01-01'),
309
+ (10280,'d003','1995-01-27','9999-01-01'),
310
+ (10281,'d006','1994-12-03','9999-01-01'),
311
+ (10282,'d004','1996-05-02','9999-01-01'),
312
+ (10283,'d005','1988-05-25','9999-01-01'),
313
+ (10284,'d004','1999-07-06','9999-01-01'),
314
+ (10285,'d008','1995-05-25','9999-01-01'),
315
+ (10286,'d009','1994-12-24','1999-01-24'),
316
+ (10287,'d005','1997-09-05','9999-01-01'),
317
+ (10287,'d008','1992-12-28','1997-09-05'),
318
+ (10288,'d004','1994-08-29','9999-01-01'),
319
+ (10289,'d005','1993-03-12','2002-01-31'),
320
+ (10290,'d005','1991-09-18','9999-01-01'),
321
+ (10291,'d007','1987-03-30','9999-01-01'),
322
+ (10292,'d007','1989-06-05','9999-01-01'),
323
+ (10293,'d004','1992-12-12','9999-01-01'),
324
+ (10294,'d005','1999-01-30','1999-05-04'),
325
+ (10295,'d002','1995-06-19','9999-01-01'),
326
+ (10296,'d007','1989-09-16','9999-01-01'),
327
+ (10297,'d004','1986-05-28','9999-01-01'),
328
+ (10298,'d004','2002-05-05','9999-01-01'),
329
+ (10298,'d008','1999-04-27','2002-05-05'),
330
+ (10299,'d007','1990-01-10','9999-01-01'),
331
+ (10300,'d004','1991-05-17','9999-01-01'),
332
+ (10301,'d002','1988-05-23','9999-01-01'),
333
+ (10302,'d007','1986-07-22','1999-11-09'),
334
+ (10303,'d004','1990-02-05','2000-11-15'),
335
+ (10304,'d007','1992-11-16','2002-05-08'),
336
+ (10305,'d005','1988-10-31','1992-06-02'),
337
+ (10306,'d007','1993-09-06','9999-01-01'),
338
+ (10307,'d004','1999-10-16','2000-01-21'),
339
+ (10307,'d006','2000-01-21','9999-01-01'),
340
+ (10308,'d007','1992-12-29','9999-01-01'),
341
+ (10309,'d005','1997-05-02','9999-01-01'),
342
+ (10310,'d004','1990-10-24','2001-07-26'),
343
+ (10311,'d005','1998-11-04','9999-01-01'),
344
+ (10312,'d004','1986-08-28','9999-01-01'),
345
+ (10313,'d008','1994-10-10','9999-01-01'),
346
+ (10314,'d007','1986-01-16','9999-01-01'),
347
+ (10315,'d005','1987-08-28','9999-01-01'),
348
+ (10316,'d006','1990-12-18','1991-01-02'),
349
+ (10317,'d004','2000-07-05','9999-01-01'),
350
+ (10317,'d008','1999-01-24','2000-07-05'),
351
+ (10318,'d005','1987-03-23','9999-01-01'),
352
+ (10319,'d007','1994-06-18','9999-01-01'),
353
+ (10320,'d007','1988-11-03','2001-12-23'),
354
+ (10321,'d007','1995-07-24','1999-08-14'),
355
+ (10322,'d005','1990-01-29','9999-01-01'),
356
+ (10323,'d004','1991-06-06','9999-01-01'),
357
+ (10324,'d005','1999-07-19','9999-01-01'),
358
+ (10325,'d003','1990-09-20','9999-01-01'),
359
+ (10326,'d008','1998-09-02','9999-01-01'),
360
+ (10327,'d005','1987-09-18','1988-05-10'),
361
+ (10327,'d008','1988-05-10','1993-05-22'),
362
+ (10328,'d005','1998-07-17','9999-01-01'),
363
+ (10329,'d004','1986-01-20','9999-01-01'),
364
+ (10330,'d007','1993-10-08','9999-01-01'),
365
+ (10331,'d007','1986-10-29','9999-01-01'),
366
+ (10332,'d004','1988-10-20','1997-03-07'),
367
+ (10333,'d005','1993-01-16','9999-01-01'),
368
+ (10334,'d009','1998-02-15','9999-01-01'),
369
+ (10335,'d007','1992-04-06','1999-11-07'),
370
+ (10335,'d009','1999-11-07','9999-01-01'),
371
+ (10336,'d008','1996-09-27','9999-01-01'),
372
+ (10337,'d004','1998-04-25','9999-01-01'),
373
+ (10338,'d009','1999-12-29','9999-01-01'),
374
+ (10339,'d004','1989-11-30','9999-01-01'),
375
+ (10340,'d001','1988-03-30','9999-01-01'),
376
+ (10341,'d004','1987-04-29','1998-11-11'),
377
+ (10342,'d005','1987-07-25','9999-01-01'),
378
+ (10343,'d006','1997-10-03','9999-01-01'),
379
+ (10344,'d004','1999-04-19','2001-11-11'),
380
+ (10344,'d006','2001-11-11','9999-01-01'),
381
+ (10345,'d005','1993-11-08','9999-01-01'),
382
+ (10346,'d007','1992-01-17','1996-04-20'),
383
+ (10347,'d008','1998-02-20','9999-01-01'),
384
+ (10348,'d004','1995-10-22','9999-01-01'),
385
+ (10349,'d009','1991-09-28','9999-01-01'),
386
+ (10350,'d004','1991-05-11','1998-01-16'),
387
+ (10351,'d002','1995-05-01','9999-01-01'),
388
+ (10352,'d005','1998-12-16','9999-01-01'),
389
+ (10353,'d001','1989-08-24','9999-01-01'),
390
+ (10354,'d002','1999-03-03','2000-03-03'),
391
+ (10354,'d003','2000-03-03','2002-01-01'),
392
+ (10355,'d007','1996-01-26','9999-01-01'),
393
+ (10356,'d008','1995-06-26','9999-01-01'),
394
+ (10357,'d006','1994-04-04','9999-01-01'),
395
+ (10358,'d005','1991-02-19','9999-01-01'),
396
+ (10359,'d005','1998-07-20','9999-01-01'),
397
+ (10360,'d003','1996-09-04','9999-01-01'),
398
+ (10361,'d007','1986-10-23','9999-01-01'),
399
+ (10362,'d003','1990-11-02','1997-07-16'),
400
+ (10363,'d004','1985-09-11','1987-05-18'),
401
+ (10363,'d006','1987-05-18','1993-02-12'),
402
+ (10364,'d004','1985-11-14','9999-01-01'),
403
+ (10365,'d008','1987-10-22','1992-04-04'),
404
+ (10366,'d005','1997-08-15','9999-01-01'),
405
+ (10367,'d001','1991-06-24','9999-01-01'),
406
+ (10368,'d004','1996-05-16','9999-01-01'),
407
+ (10369,'d007','1994-09-05','9999-01-01'),
408
+ (10370,'d007','1992-04-18','9999-01-01'),
409
+ (10371,'d004','1989-11-28','9999-01-01'),
410
+ (10372,'d004','1985-07-30','9999-01-01'),
411
+ (10373,'d005','1997-04-26','9999-01-01'),
412
+ (10374,'d007','1993-12-08','1995-04-25'),
413
+ (10374,'d009','1995-04-25','1996-03-29'),
414
+ (10375,'d007','1994-05-29','9999-01-01'),
415
+ (10376,'d004','1990-12-08','9999-01-01'),
416
+ (10377,'d004','1996-08-24','9999-01-01'),
417
+ (10378,'d007','1992-08-31','9999-01-01'),
418
+ (10379,'d005','1996-07-15','9999-01-01'),
419
+ (10380,'d007','1985-03-19','9999-01-01'),
420
+ (10381,'d004','1991-12-04','9999-01-01'),
421
+ (10382,'d004','1998-07-01','1999-05-07'),
422
+ (10382,'d009','1999-05-07','2000-10-27'),
423
+ (10383,'d004','1991-06-19','9999-01-01'),
424
+ (10384,'d001','1986-01-16','9999-01-01'),
425
+ (10385,'d004','1992-12-20','1998-01-23'),
426
+ (10386,'d005','1985-08-02','9999-01-01'),
427
+ (10387,'d009','1994-01-07','9999-01-01'),
428
+ (10388,'d007','1999-05-28','9999-01-01'),
429
+ (10389,'d005','1999-05-13','9999-01-01'),
430
+ (10390,'d006','1989-05-17','9999-01-01'),
431
+ (10391,'d005','1993-01-28','9999-01-01'),
432
+ (10392,'d004','1992-03-01','1997-08-09'),
433
+ (10392,'d006','1997-08-09','9999-01-01'),
434
+ (10393,'d004','1989-06-23','9999-01-01'),
435
+ (10394,'d005','1991-03-14','1991-08-25'),
436
+ (10395,'d005','1998-08-10','2001-08-13'),
437
+ (10396,'d005','1986-01-11','9999-01-01'),
438
+ (10397,'d004','1993-05-21','9999-01-01'),
439
+ (10398,'d007','1990-10-12','9999-01-01'),
440
+ (10399,'d007','2000-01-26','9999-01-01'),
441
+ (10400,'d007','1993-10-17','9999-01-01'),
442
+ (10401,'d006','1999-10-25','2001-04-25'),
443
+ (10402,'d006','1987-01-02','9999-01-01'),
444
+ (10403,'d002','1991-09-13','1995-03-07'),
445
+ (10403,'d007','1995-03-07','2001-06-15'),
446
+ (10404,'d005','1988-08-28','9999-01-01'),
447
+ (10405,'d006','1998-09-26','2000-12-05'),
448
+ (10406,'d006','1996-01-26','9999-01-01'),
449
+ (10407,'d007','1999-10-30','9999-01-01'),
450
+ (10408,'d007','1998-10-07','9999-01-01'),
451
+ (10409,'d005','1997-09-26','9999-01-01'),
452
+ (10410,'d007','1993-10-16','1996-07-21'),
453
+ (10411,'d007','1989-09-02','9999-01-01'),
454
+ (10412,'d004','1991-11-21','2000-05-19'),
455
+ (10412,'d009','2000-05-19','9999-01-01'),
456
+ (10413,'d003','1991-12-27','9999-01-01'),
457
+ (10414,'d005','1990-05-30','1994-12-02'),
458
+ (10415,'d005','1993-10-25','9999-01-01'),
459
+ (10416,'d002','1989-03-24','9999-01-01'),
460
+ (10417,'d007','1999-06-27','9999-01-01'),
461
+ (10418,'d001','1996-10-04','9999-01-01'),
462
+ (10419,'d008','1992-04-25','2002-07-06'),
463
+ (10420,'d008','1988-01-17','2000-07-09'),
464
+ (10421,'d009','1990-04-07','9999-01-01'),
465
+ (10422,'d004','1995-01-03','1997-09-30'),
466
+ (10422,'d006','1997-09-30','9999-01-01'),
467
+ (10423,'d008','1999-05-27','9999-01-01'),
468
+ (10424,'d005','1989-08-07','9999-01-01'),
469
+ (10425,'d004','1995-05-07','2002-05-06'),
470
+ (10426,'d005','1985-07-06','9999-01-01'),
471
+ (10427,'d007','1994-10-03','9999-01-01'),
472
+ (10428,'d003','1992-06-04','9999-01-01'),
473
+ (10429,'d005','1988-09-23','9999-01-01'),
474
+ (10430,'d004','1998-07-05','1999-07-17'),
475
+ (10430,'d009','1999-07-17','9999-01-01'),
476
+ (10431,'d007','1987-10-08','9999-01-01'),
477
+ (10432,'d009','1990-08-13','9999-01-01'),
478
+ (10433,'d006','1992-11-26','9999-01-01'),
479
+ (10434,'d004','1995-06-27','2002-06-22'),
480
+ (10435,'d005','1996-06-08','9999-01-01'),
481
+ (10436,'d003','1988-01-30','9999-01-01'),
482
+ (10437,'d006','1996-04-12','9999-01-01'),
483
+ (10438,'d004','1990-01-19','9999-01-01'),
484
+ (10439,'d005','1993-05-01','9999-01-01'),
485
+ (10440,'d005','1997-04-04','2000-01-30'),
486
+ (10440,'d008','2000-01-30','9999-01-01'),
487
+ (10441,'d004','1988-07-12','9999-01-01'),
488
+ (10442,'d007','1992-02-12','2001-03-13'),
489
+ (10443,'d005','1989-08-01','2002-07-06'),
490
+ (10444,'d007','1994-10-23','9999-01-01'),
491
+ (10445,'d005','1987-11-04','9999-01-01'),
492
+ (10446,'d005','1996-12-25','9999-01-01'),
493
+ (10447,'d006','1988-12-29','2000-11-15'),
494
+ (10448,'d007','1992-03-12','9999-01-01'),
495
+ (10449,'d001','1996-03-12','9999-01-01'),
496
+ (10449,'d007','1987-03-28','1996-03-12'),
497
+ (10450,'d005','1997-08-24','9999-01-01'),
498
+ (10451,'d004','1988-03-12','9999-01-01'),
499
+ (10452,'d005','1995-11-12','2001-10-11'),
500
+ (10453,'d009','1985-04-02','9999-01-01'),
501
+ (10454,'d007','1989-04-16','9999-01-01'),
502
+ (10455,'d007','1995-02-19','9999-01-01'),
503
+ (10456,'d002','2000-01-06','9999-01-01'),
504
+ (10457,'d006','1999-10-23','9999-01-01'),
505
+ (10458,'d007','1994-07-05','9999-01-01'),
506
+ (10459,'d002','1998-06-14','9999-01-01'),
507
+ (10459,'d003','1997-06-28','1998-06-14'),
508
+ (10460,'d005','1999-06-30','2001-04-15'),
509
+ (10461,'d007','1987-08-03','9999-01-01'),
510
+ (10462,'d004','1996-03-25','9999-01-01'),
511
+ (10463,'d007','1994-02-17','9999-01-01'),
512
+ (10464,'d003','1991-05-21','9999-01-01'),
513
+ (10465,'d009','1994-12-11','9999-01-01'),
514
+ (10466,'d009','1997-08-22','2000-08-15'),
515
+ (10467,'d003','1992-05-22','1999-11-01'),
516
+ (10468,'d007','1991-05-28','9999-01-01'),
517
+ (10469,'d005','1985-06-05','1992-12-26'),
518
+ (10469,'d008','1992-12-26','9999-01-01'),
519
+ (10470,'d004','1989-09-19','9999-01-01'),
520
+ (10471,'d006','1990-11-18','9999-01-01'),
521
+ (10472,'d007','1999-12-01','2002-01-02'),
522
+ (10473,'d004','1997-09-23','9999-01-01'),
523
+ (10474,'d004','1987-02-21','9999-01-01'),
524
+ (10475,'d004','1992-05-13','1994-12-30'),
525
+ (10476,'d008','1987-09-20','9999-01-01'),
526
+ (10477,'d005','1997-05-26','9999-01-01'),
527
+ (10478,'d005','1993-02-10','9999-01-01'),
528
+ (10478,'d009','1992-06-09','1993-02-10'),
529
+ (10479,'d004','1993-07-24','9999-01-01'),
530
+ (10480,'d002','1988-05-18','1989-06-03'),
531
+ (10481,'d004','1989-10-03','9999-01-01'),
532
+ (10482,'d005','1996-02-26','9999-01-01'),
533
+ (10483,'d006','1993-11-10','9999-01-01'),
534
+ (10484,'d003','1996-12-20','9999-01-01'),
535
+ (10485,'d005','1996-01-21','9999-01-01'),
536
+ (10486,'d006','1987-10-08','9999-01-01'),
537
+ (10487,'d004','1992-08-14','9999-01-01'),
538
+ (10488,'d005','1994-07-09','1996-11-18'),
539
+ (10488,'d008','1996-11-18','9999-01-01'),
540
+ (10489,'d005','1989-09-10','1989-10-06'),
541
+ (10490,'d007','1992-11-22','9999-01-01'),
542
+ (10491,'d001','1990-01-17','9999-01-01'),
543
+ (10492,'d005','1988-04-29','9999-01-01'),
544
+ (10493,'d007','1998-10-29','9999-01-01'),
545
+ (10494,'d004','1991-12-18','9999-01-01'),
546
+ (10495,'d004','1989-09-24','9999-01-01'),
547
+ (10496,'d002','1995-08-29','1999-01-26'),
548
+ (10497,'d004','1992-01-22','9999-01-01'),
549
+ (10498,'d004','1994-03-09','9999-01-01'),
550
+ (10499,'d001','1996-07-31','1998-03-16'),
551
+ (10499,'d007','1998-03-16','9999-01-01'),
552
+ (10500,'d005','1996-12-16','9999-01-01'),
553
+ (10501,'d005','1988-09-08','9999-01-01'),
554
+ (10502,'d006','1993-03-04','9999-01-01'),
555
+ (10503,'d004','1997-03-13','9999-01-01'),
556
+ (10504,'d007','1999-10-19','9999-01-01'),
557
+ (10505,'d007','1985-07-23','1998-03-26'),
558
+ (10506,'d005','1996-12-01','9999-01-01'),
559
+ (10507,'d003','1990-09-30','9999-01-01'),
560
+ (10508,'d004','1991-05-01','9999-01-01'),
561
+ (10509,'d007','1992-10-06','9999-01-01'),
562
+ (10510,'d007','1990-04-20','1992-09-21'),
563
+ (10510,'d009','1992-09-21','9999-01-01'),
564
+ (10511,'d004','1992-01-27','9999-01-01'),
565
+ (10512,'d003','1989-11-28','9999-01-01'),
566
+ (10513,'d002','1991-04-02','9999-01-01'),
567
+ (10514,'d008','1992-04-29','1995-04-02'),
568
+ (10515,'d007','1990-01-06','1998-07-21'),
569
+ (10516,'d005','1985-10-19','9999-01-01'),
570
+ (10517,'d007','1990-12-25','9999-01-01'),
571
+ (10518,'d005','1993-09-03','9999-01-01'),
572
+ (10519,'d005','1994-02-09','2001-10-13'),
573
+ (10519,'d008','1992-12-05','1994-02-09'),
574
+ (10520,'d004','1996-09-05','9999-01-01'),
575
+ (10521,'d007','1989-05-11','9999-01-01'),
576
+ (10522,'d003','1986-12-12','9999-01-01'),
577
+ (10523,'d004','1989-12-23','9999-01-01'),
578
+ (10524,'d004','1985-10-09','9999-01-01'),
579
+ (10525,'d007','1990-07-08','1995-12-20'),
580
+ (10526,'d004','1988-02-27','9999-01-01'),
581
+ (10527,'d005','1996-01-25','9999-01-01'),
582
+ (10528,'d005','1993-10-28','9999-01-01'),
583
+ (10529,'d004','1999-06-12','9999-01-01'),
584
+ (10529,'d005','1997-07-04','1999-06-12'),
585
+ (10530,'d005','1987-09-23','9999-01-01'),
586
+ (10531,'d003','1995-03-16','9999-01-01'),
587
+ (10532,'d007','1986-05-18','9999-01-01'),
588
+ (10533,'d007','1990-08-17','9999-01-01'),
589
+ (10534,'d008','1998-01-26','2001-03-03'),
590
+ (10535,'d009','1991-08-22','9999-01-01'),
591
+ (10536,'d007','1988-10-07','9999-01-01'),
592
+ (10537,'d007','1996-09-25','9999-01-01'),
593
+ (10538,'d004','1991-09-22','1998-12-13'),
594
+ (10538,'d005','1987-07-23','1991-09-22'),
595
+ (10539,'d007','1990-06-05','9999-01-01'),
596
+ (10540,'d004','1994-05-03','9999-01-01'),
597
+ (10541,'d007','1986-02-28','1986-10-01'),
598
+ (10542,'d005','1992-02-07','9999-01-01'),
599
+ (10543,'d002','1998-11-24','9999-01-01'),
600
+ (10544,'d008','1995-04-29','9999-01-01'),
601
+ (10545,'d004','1990-06-30','9999-01-01'),
602
+ (10546,'d008','1991-04-14','9999-01-01'),
603
+ (10547,'d005','1988-02-14','1989-06-19'),
604
+ (10548,'d001','1991-10-04','9999-01-01'),
605
+ (10548,'d007','1986-07-04','1991-10-04'),
606
+ (10549,'d005','1996-10-11','9999-01-01'),
607
+ (10550,'d006','1985-02-03','9999-01-01'),
608
+ (10551,'d006','1988-08-06','9999-01-01'),
609
+ (10552,'d004','1998-08-31','9999-01-01'),
610
+ (10553,'d005','1990-07-22','9999-01-01'),
611
+ (10554,'d005','1990-11-28','9999-01-01'),
612
+ (10555,'d007','1992-05-22','1993-01-19'),
613
+ (10556,'d002','1992-04-15','9999-01-01'),
614
+ (10557,'d005','1992-09-18','1994-08-25'),
615
+ (10557,'d008','1994-08-25','9999-01-01'),
616
+ (10558,'d004','1992-04-22','9999-01-01'),
617
+ (10559,'d007','1999-04-05','9999-01-01'),
618
+ (10560,'d005','1996-09-03','9999-01-01'),
619
+ (10561,'d007','1997-06-30','9999-01-01'),
620
+ (10562,'d005','1997-07-24','9999-01-01'),
621
+ (10563,'d005','1992-09-29','2002-01-01'),
622
+ (10564,'d004','1995-11-23','9999-01-01'),
623
+ (10565,'d004','1996-08-05','9999-01-01'),
624
+ (10566,'d005','1990-08-23','1997-10-26'),
625
+ (10567,'d001','1997-02-17','9999-01-01'),
626
+ (10567,'d007','1992-10-18','1997-02-17'),
627
+ (10568,'d007','1995-07-08','9999-01-01'),
628
+ (10569,'d008','1987-03-13','9999-01-01'),
629
+ (10570,'d007','1986-06-16','2000-03-25'),
630
+ (10571,'d005','1985-02-24','9999-01-01'),
631
+ (10572,'d004','1988-02-16','9999-01-01'),
632
+ (10573,'d007','1999-08-20','9999-01-01'),
633
+ (10574,'d003','1999-11-15','9999-01-01'),
634
+ (10575,'d004','1988-10-04','2000-11-22'),
635
+ (10576,'d002','1991-01-03','9999-01-01'),
636
+ (10577,'d004','2001-08-01','9999-01-01'),
637
+ (10577,'d008','1993-07-02','2001-08-01'),
638
+ (10578,'d005','1989-11-24','9999-01-01'),
639
+ (10579,'d005','1991-06-02','9999-01-01'),
640
+ (10580,'d009','1991-03-02','9999-01-01'),
641
+ (10581,'d004','1994-04-13','9999-01-01'),
642
+ (10582,'d005','1995-11-06','9999-01-01'),
643
+ (10583,'d004','1985-02-14','1998-05-29'),
644
+ (10584,'d005','1986-02-17','9999-01-01'),
645
+ (10585,'d005','1991-01-09','1994-08-24'),
646
+ (10585,'d008','1994-08-24','9999-01-01'),
647
+ (10586,'d004','1992-02-04','9999-01-01'),
648
+ (10587,'d005','1991-11-20','9999-01-01'),
649
+ (10588,'d004','1988-07-25','9999-01-01'),
650
+ (10589,'d002','1994-01-26','9999-01-01'),
651
+ (10590,'d008','1986-04-09','9999-01-01'),
652
+ (10591,'d001','1987-06-18','1988-09-20'),
653
+ (10592,'d007','1993-09-27','9999-01-01'),
654
+ (10593,'d004','2000-03-29','9999-01-01'),
655
+ (10593,'d005','1990-09-12','2000-03-29'),
656
+ (10594,'d005','1988-04-02','9999-01-01'),
657
+ (10595,'d004','1989-11-24','9999-01-01'),
658
+ (10596,'d007','1996-05-23','9999-01-01'),
659
+ (10597,'d007','1990-04-01','9999-01-01'),
660
+ (10598,'d004','1998-06-22','2000-09-27'),
661
+ (10599,'d005','1991-11-17','9999-01-01'),
662
+ (10600,'d007','1992-04-27','9999-01-01'),
663
+ (10601,'d009','1999-07-24','2002-05-09'),
664
+ (10602,'d001','1989-04-23','1993-11-06'),
665
+ (10603,'d007','1995-07-20','9999-01-01'),
666
+ (10604,'d004','2002-07-29','9999-01-01'),
667
+ (10604,'d005','1990-04-07','2002-07-29'),
668
+ (10605,'d006','1993-07-01','9999-01-01'),
669
+ (10606,'d005','1987-05-02','9999-01-01'),
670
+ (10607,'d005','1996-01-13','9999-01-01'),
671
+ (10608,'d004','1986-05-25','1991-06-02'),
672
+ (10609,'d005','1994-12-03','9999-01-01'),
673
+ (10610,'d005','1997-03-30','9999-01-01'),
674
+ (10611,'d005','1989-09-16','9999-01-01'),
675
+ (10612,'d004','1991-09-02','9999-01-01'),
676
+ (10613,'d003','1997-10-13','9999-01-01'),
677
+ (10614,'d004','1990-03-03','1997-02-27'),
678
+ (10614,'d009','1997-02-27','9999-01-01'),
679
+ (10615,'d002','1996-03-10','9999-01-01'),
680
+ (10616,'d007','1996-11-07','9999-01-01'),
681
+ (10617,'d009','1991-10-30','2001-10-03'),
682
+ (10618,'d004','1994-10-07','9999-01-01'),
683
+ (10619,'d007','1993-04-09','9999-01-01'),
684
+ (10620,'d005','1990-11-10','9999-01-01'),
685
+ (10621,'d005','1992-02-10','9999-01-01'),
686
+ (10622,'d004','1989-05-15','9999-01-01'),
687
+ (10623,'d005','1992-01-15','1996-02-11'),
688
+ (10623,'d008','1996-02-11','9999-01-01'),
689
+ (10624,'d004','1990-05-07','9999-01-01'),
690
+ (10625,'d005','1986-07-15','1995-01-13'),
691
+ (10626,'d003','1996-12-03','9999-01-01'),
692
+ (10627,'d003','1995-03-13','9999-01-01'),
693
+ (10628,'d005','1987-03-14','9999-01-01'),
694
+ (10629,'d007','1999-10-20','2001-12-07'),
695
+ (10630,'d004','1997-01-13','9999-01-01'),
696
+ (10631,'d005','1994-10-18','9999-01-01'),
697
+ (10632,'d005','1985-07-25','1987-11-20'),
698
+ (10633,'d007','1997-05-16','9999-01-01'),
699
+ (10634,'d005','1990-11-11','1994-04-02'),
700
+ (10634,'d008','1994-04-02','9999-01-01'),
701
+ (10635,'d004','1991-09-22','1999-12-20'),
702
+ (10636,'d003','1996-09-25','9999-01-01'),
703
+ (10637,'d007','1993-07-11','2000-01-19'),
704
+ (10638,'d007','1994-11-10','9999-01-01'),
705
+ (10639,'d005','1992-10-25','9999-01-01'),
706
+ (10640,'d007','1992-12-04','9999-01-01'),
707
+ (10641,'d005','1993-03-21','9999-01-01'),
708
+ (10642,'d005','1998-10-05','9999-01-01'),
709
+ (10643,'d005','1987-11-11','9999-01-01'),
710
+ (10644,'d002','1985-05-29','1995-07-19'),
711
+ (10644,'d007','1995-07-19','1995-08-25'),
712
+ (10645,'d004','1988-03-01','9999-01-01'),
713
+ (10646,'d009','1996-01-31','9999-01-01'),
714
+ (10647,'d004','1997-09-03','9999-01-01'),
715
+ (10648,'d005','1988-02-16','9999-01-01'),
716
+ (10649,'d009','1998-06-23','9999-01-01'),
717
+ (10650,'d005','1992-10-04','9999-01-01'),
718
+ (10651,'d008','1996-01-08','9999-01-01'),
719
+ (10652,'d008','1990-02-12','1992-01-13'),
720
+ (10653,'d005','1987-04-30','9999-01-01'),
721
+ (10654,'d004','1990-03-25','9999-01-01'),
722
+ (10655,'d002','1997-07-04','2000-11-22'),
723
+ (10655,'d007','2000-11-22','9999-01-01'),
724
+ (10656,'d004','1988-06-21','9999-01-01'),
725
+ (10657,'d002','1992-03-26','9999-01-01'),
726
+ (10658,'d001','1994-04-29','9999-01-01'),
727
+ (10659,'d005','1995-06-01','9999-01-01'),
728
+ (10660,'d005','1988-08-12','1991-07-12'),
729
+ (10661,'d001','1988-01-12','9999-01-01'),
730
+ (10662,'d004','1999-12-17','9999-01-01'),
731
+ (10663,'d004','1999-02-12','9999-01-01'),
732
+ (10663,'d005','1993-01-23','1999-02-12'),
733
+ (10664,'d004','1989-12-24','9999-01-01'),
734
+ (10665,'d005','1988-01-23','2000-07-13'),
735
+ (10666,'d002','1989-05-20','9999-01-01'),
736
+ (10667,'d009','1999-07-28','9999-01-01'),
737
+ (10668,'d002','1997-11-28','1999-09-03'),
738
+ (10669,'d009','1996-11-17','9999-01-01'),
739
+ (10670,'d007','1988-03-23','9999-01-01'),
740
+ (10671,'d003','1995-09-14','9999-01-01'),
741
+ (10672,'d004','1991-09-29','1996-04-19'),
742
+ (10673,'d005','1994-07-29','1997-11-18'),
743
+ (10673,'d008','1997-11-18','1998-01-14'),
744
+ (10674,'d005','1999-03-17','9999-01-01'),
745
+ (10675,'d002','1993-02-02','9999-01-01'),
746
+ (10676,'d005','1999-09-04','9999-01-01'),
747
+ (10677,'d005','1999-10-13','9999-01-01'),
748
+ (10678,'d005','1987-08-02','9999-01-01'),
749
+ (10679,'d003','1990-05-13','9999-01-01'),
750
+ (10680,'d005','1992-11-21','1998-12-08'),
751
+ (10681,'d001','2002-01-08','9999-01-01'),
752
+ (10681,'d007','1995-10-02','2002-01-08'),
753
+ (10682,'d009','1990-11-09','9999-01-01'),
754
+ (10683,'d004','1997-06-23','9999-01-01'),
755
+ (10684,'d004','1999-10-28','9999-01-01'),
756
+ (10685,'d002','1995-12-27','1996-10-20'),
757
+ (10686,'d005','1987-05-17','9999-01-01'),
758
+ (10687,'d008','1990-03-13','9999-01-01'),
759
+ (10688,'d002','1986-04-13','9999-01-01'),
760
+ (10689,'d003','1988-08-05','9999-01-01'),
761
+ (10690,'d004','1995-10-04','9999-01-01'),
762
+ (10690,'d005','1989-08-22','1995-10-04'),
763
+ (10691,'d005','1989-09-17','9999-01-01'),
764
+ (10692,'d007','1993-03-22','9999-01-01'),
765
+ (10693,'d009','1986-01-08','9999-01-01'),
766
+ (10694,'d001','1988-01-26','2001-07-11'),
767
+ (10695,'d004','1998-05-19','9999-01-01'),
768
+ (10696,'d005','1991-09-09','9999-01-01'),
769
+ (10697,'d009','1999-08-29','9999-01-01'),
770
+ (10698,'d005','1994-12-08','9999-01-01'),
771
+ (10699,'d006','1985-11-17','9999-01-01'),
772
+ (10700,'d005','1998-04-14','2002-06-27'),
773
+ (10701,'d007','1986-10-27','1989-10-07'),
774
+ (10701,'d009','1989-10-07','9999-01-01'),
775
+ (10702,'d005','1991-01-14','9999-01-01'),
776
+ (10703,'d004','1996-05-12','9999-01-01'),
777
+ (10704,'d008','1995-02-17','9999-01-01'),
778
+ (10705,'d007','1990-07-18','9999-01-01'),
779
+ (10706,'d004','1994-05-03','2001-04-08'),
780
+ (10707,'d005','1990-12-24','9999-01-01'),
781
+ (10708,'d008','1999-11-09','9999-01-01'),
782
+ (10709,'d005','1986-02-02','1988-02-21'),
783
+ (10709,'d008','1988-02-21','9999-01-01'),
784
+ (10710,'d007','1995-07-09','9999-01-01'),
785
+ (10711,'d005','1991-06-21','9999-01-01'),
786
+ (10712,'d005','1994-08-18','9999-01-01'),
787
+ (10713,'d008','1986-04-26','2001-02-21'),
788
+ (10714,'d005','1999-11-24','9999-01-01'),
789
+ (10715,'d004','1999-10-28','9999-01-01'),
790
+ (10716,'d005','1987-08-12','9999-01-01'),
791
+ (10717,'d003','1991-09-13','9999-01-01'),
792
+ (10718,'d005','1988-07-21','9999-01-01'),
793
+ (10719,'d005','1995-09-05','1999-07-31'),
794
+ (10720,'d004','2001-08-05','9999-01-01'),
795
+ (10720,'d008','1996-06-26','2001-08-05'),
796
+ (10721,'d009','1999-07-15','9999-01-01'),
797
+ (10722,'d001','1989-01-17','2000-04-14'),
798
+ (10723,'d004','1997-07-14','9999-01-01'),
799
+ (10724,'d004','1995-12-07','9999-01-01'),
800
+ (10725,'d007','1990-09-08','9999-01-01'),
801
+ (10726,'d005','1992-02-25','9999-01-01'),
802
+ (10727,'d002','1991-01-08','2000-06-06'),
803
+ (10728,'d006','1989-12-09','9999-01-01'),
804
+ (10729,'d004','1986-04-20','9999-01-01'),
805
+ (10730,'d004','1996-05-27','1998-06-07'),
806
+ (10730,'d005','1996-05-14','1996-05-27'),
807
+ (10731,'d002','1987-02-20','2000-10-09'),
808
+ (10732,'d004','1994-12-21','9999-01-01'),
809
+ (10733,'d009','1996-02-20','9999-01-01'),
810
+ (10734,'d004','1995-12-19','9999-01-01'),
811
+ (10735,'d009','1985-10-29','9999-01-01'),
812
+ (10736,'d006','1991-09-26','9999-01-01'),
813
+ (10737,'d004','1999-06-22','9999-01-01'),
814
+ (10738,'d005','1991-04-30','1992-01-06'),
815
+ (10738,'d008','1992-01-06','9999-01-01'),
816
+ (10739,'d005','1985-03-30','9999-01-01'),
817
+ (10740,'d005','1996-04-30','2002-03-17'),
818
+ (10741,'d001','1989-01-06','9999-01-01'),
819
+ (10742,'d005','1997-04-03','9999-01-01'),
820
+ (10743,'d002','1999-11-05','9999-01-01'),
821
+ (10744,'d007','1985-12-29','1992-06-03'),
822
+ (10745,'d004','1988-01-23','9999-01-01'),
823
+ (10746,'d005','1990-08-31','9999-01-01'),
824
+ (10747,'d004','1990-10-08','1999-09-20'),
825
+ (10748,'d002','1990-08-14','1992-04-04'),
826
+ (10748,'d003','1992-04-04','9999-01-01'),
827
+ (10749,'d004','1985-09-26','9999-01-01'),
828
+ (10750,'d005','1998-11-06','9999-01-01'),
829
+ (10751,'d005','1999-12-14','2000-12-05'),
830
+ (10752,'d006','1993-05-28','9999-01-01'),
831
+ (10753,'d004','1985-05-17','1999-08-25'),
832
+ (10754,'d007','1988-01-11','9999-01-01'),
833
+ (10755,'d005','1995-04-01','2001-11-13'),
834
+ (10756,'d004','2000-12-16','9999-01-01'),
835
+ (10756,'d005','1997-10-07','2000-12-16'),
836
+ (10757,'d005','1986-01-06','1991-10-18'),
837
+ (10758,'d004','1999-07-01','9999-01-01'),
838
+ (10759,'d004','1991-12-04','9999-01-01'),
839
+ (10760,'d002','1997-08-22','9999-01-01'),
840
+ (10761,'d002','1992-05-30','1999-01-04'),
841
+ (10762,'d008','1992-01-21','9999-01-01'),
842
+ (10763,'d004','1987-02-23','9999-01-01'),
843
+ (10764,'d005','1989-11-27','9999-01-01'),
844
+ (10765,'d001','1994-05-08','1994-05-11'),
845
+ (10765,'d007','1994-05-07','1994-05-08'),
846
+ (10766,'d003','1999-09-18','9999-01-01'),
847
+ (10767,'d007','1997-07-15','9999-01-01'),
848
+ (10768,'d004','1985-07-04','9999-01-01'),
849
+ (10769,'d005','1991-08-30','9999-01-01'),
850
+ (10770,'d007','1987-12-25','1989-02-27'),
851
+ (10771,'d009','1996-04-01','9999-01-01'),
852
+ (10772,'d005','1990-02-22','9999-01-01'),
853
+ (10773,'d009','1997-02-09','1997-11-29'),
854
+ (10774,'d004','1990-01-26','9999-01-01'),
855
+ (10775,'d004','1994-12-30','1999-03-17'),
856
+ (10775,'d009','1999-03-17','9999-01-01'),
857
+ (10776,'d005','1986-03-16','9999-01-01'),
858
+ (10777,'d004','1990-03-17','2001-03-27'),
859
+ (10778,'d001','1986-07-04','9999-01-01'),
860
+ (10779,'d009','1988-01-11','9999-01-01'),
861
+ (10780,'d004','1994-08-01','1996-08-18'),
862
+ (10781,'d009','1991-02-04','9999-01-01'),
863
+ (10782,'d008','1997-07-06','2002-03-30'),
864
+ (10783,'d003','1994-05-15','9999-01-01'),
865
+ (10784,'d005','1998-10-14','9999-01-01'),
866
+ (10785,'d006','1994-11-11','9999-01-01'),
867
+ (10786,'d004','1997-06-06','2001-12-10'),
868
+ (10786,'d006','2001-12-10','9999-01-01'),
869
+ (10787,'d001','1991-07-19','2002-07-27'),
870
+ (10788,'d007','1998-05-29','9999-01-01'),
871
+ (10789,'d009','1998-01-26','9999-01-01'),
872
+ (10790,'d004','1999-03-02','9999-01-01'),
873
+ (10791,'d005','1988-07-30','9999-01-01'),
874
+ (10792,'d005','1985-08-10','1993-12-20'),
875
+ (10793,'d005','1990-09-18','9999-01-01'),
876
+ (10794,'d008','1994-05-24','9999-01-01'),
877
+ (10795,'d007','1993-05-03','9999-01-01'),
878
+ (10796,'d006','1990-11-08','9999-01-01'),
879
+ (10797,'d004','1997-06-02','9999-01-01'),
880
+ (10797,'d005','1988-08-21','1997-06-02'),
881
+ (10798,'d004','1996-09-21','9999-01-01'),
882
+ (10799,'d005','1989-03-01','9999-01-01'),
883
+ (10800,'d004','1993-05-20','9999-01-01'),
884
+ (10801,'d004','1998-04-07','2001-01-15'),
885
+ (10802,'d004','1985-08-24','9999-01-01'),
886
+ (10803,'d006','1988-04-20','2002-04-02'),
887
+ (10804,'d007','1997-06-09','9999-01-01'),
888
+ (10805,'d008','1987-05-26','9999-01-01'),
889
+ (10806,'d002','1993-04-25','1994-04-08'),
890
+ (10806,'d003','1994-04-08','9999-01-01'),
891
+ (10807,'d007','1999-10-19','9999-01-01'),
892
+ (10808,'d005','1987-03-07','9999-01-01'),
893
+ (10809,'d005','1988-02-25','9999-01-01'),
894
+ (10810,'d007','1994-09-07','9999-01-01'),
895
+ (10811,'d004','1997-07-08','9999-01-01'),
896
+ (10812,'d004','1996-09-20','1997-10-06'),
897
+ (10813,'d007','1990-04-27','9999-01-01'),
898
+ (10814,'d007','1993-07-17','9999-01-01'),
899
+ (10815,'d003','1994-04-19','9999-01-01'),
900
+ (10816,'d009','1991-05-22','9999-01-01'),
901
+ (10817,'d007','1990-12-26','2000-01-24'),
902
+ (10817,'d009','2000-01-24','9999-01-01'),
903
+ (10818,'d003','1998-04-09','9999-01-01'),
904
+ (10819,'d004','1986-08-02','1999-12-28'),
905
+ (10820,'d001','1992-06-26','9999-01-01'),
906
+ (10821,'d005','1988-10-06','1990-04-17'),
907
+ (10822,'d005','1986-01-11','9999-01-01'),
908
+ (10823,'d003','1999-08-19','9999-01-01'),
909
+ (10824,'d001','1995-08-01','9999-01-01'),
910
+ (10825,'d004','2000-06-03','9999-01-01'),
911
+ (10825,'d005','1993-12-04','2000-06-03'),
912
+ (10826,'d005','1993-01-22','9999-01-01'),
913
+ (10827,'d002','1996-11-07','9999-01-01'),
914
+ (10828,'d007','1986-02-14','1990-03-30'),
915
+ (10829,'d003','1993-07-21','1993-11-29'),
916
+ (10830,'d001','1991-08-24','9999-01-01'),
917
+ (10831,'d005','1998-02-22','9999-01-01'),
918
+ (10832,'d007','1986-10-11','9999-01-01'),
919
+ (10833,'d006','1998-12-23','9999-01-01'),
920
+ (10834,'d004','1990-11-24','9999-01-01'),
921
+ (10835,'d004','1995-08-22','9999-01-01'),
922
+ (10836,'d007','1987-08-10','1991-07-01'),
923
+ (10836,'d009','1991-07-01','9999-01-01'),
924
+ (10837,'d007','1986-01-14','2002-02-22'),
925
+ (10838,'d006','1994-04-26','9999-01-01'),
926
+ (10839,'d004','1996-12-30','9999-01-01'),
927
+ (10840,'d004','1993-06-04','9999-01-01'),
928
+ (10841,'d009','1992-01-22','9999-01-01'),
929
+ (10842,'d005','1986-07-14','1998-06-27'),
930
+ (10843,'d005','1990-04-26','9999-01-01'),
931
+ (10844,'d005','1997-04-25','9999-01-01'),
932
+ (10845,'d005','1997-01-25','9999-01-01'),
933
+ (10846,'d005','1995-01-17','1997-04-03'),
934
+ (10846,'d008','1997-04-03','9999-01-01'),
935
+ (10847,'d008','1986-07-25','9999-01-01'),
936
+ (10848,'d004','1985-04-20','9999-01-01'),
937
+ (10849,'d005','1995-06-25','9999-01-01'),
938
+ (10850,'d002','1990-04-22','1995-05-11'),
939
+ (10851,'d008','1994-11-21','9999-01-01'),
940
+ (10852,'d004','1999-08-21','9999-01-01'),
941
+ (10853,'d006','1993-05-03','9999-01-01'),
942
+ (10854,'d005','1998-07-13','9999-01-01'),
943
+ (10855,'d002','1993-03-29','1997-03-02'),
944
+ (10855,'d007','1997-03-02','9999-01-01'),
945
+ (10856,'d009','1986-12-31','1990-06-18'),
946
+ (10857,'d007','1990-04-04','9999-01-01'),
947
+ (10858,'d005','1997-01-01','9999-01-01'),
948
+ (10859,'d001','1996-05-21','9999-01-01'),
949
+ (10860,'d006','1998-01-22','9999-01-01'),
950
+ (10861,'d005','1989-06-10','1992-04-12'),
951
+ (10862,'d007','1985-07-23','9999-01-01'),
952
+ (10863,'d004','1985-12-25','9999-01-01'),
953
+ (10864,'d007','1986-09-25','9999-01-01'),
954
+ (10865,'d007','1993-05-29','1993-07-03'),
955
+ (10865,'d009','1993-07-03','1993-09-19'),
956
+ (10866,'d002','1990-12-27','9999-01-01'),
957
+ (10867,'d004','1997-03-23','2002-03-22'),
958
+ (10868,'d004','1990-03-20','9999-01-01'),
959
+ (10869,'d009','1997-09-04','1998-10-15'),
960
+ (10870,'d004','1988-01-13','9999-01-01'),
961
+ (10871,'d009','1999-06-16','9999-01-01'),
962
+ (10872,'d002','1990-09-06','9999-01-01'),
963
+ (10873,'d002','1994-03-23','9999-01-01'),
964
+ (10874,'d004','1986-04-22','1997-12-28'),
965
+ (10874,'d006','1997-12-28','9999-01-01'),
966
+ (10875,'d006','1988-05-19','9999-01-01'),
967
+ (10876,'d007','1995-01-29','1999-09-14'),
968
+ (10877,'d001','1986-06-06','9999-01-01'),
969
+ (10878,'d007','1997-04-25','9999-01-01'),
970
+ (10879,'d005','1985-08-15','9999-01-01'),
971
+ (10880,'d004','1992-01-11','9999-01-01'),
972
+ (10881,'d004','1997-02-18','1998-10-25'),
973
+ (10882,'d005','1999-04-29','9999-01-01'),
974
+ (10883,'d004','1996-12-28','9999-01-01'),
975
+ (10884,'d005','1993-04-15','9999-01-01'),
976
+ (10885,'d001','1997-09-29','9999-01-01'),
977
+ (10885,'d007','1991-08-19','1997-09-29'),
978
+ (10886,'d005','1995-03-26','9999-01-01'),
979
+ (10887,'d005','1989-03-17','9999-01-01'),
980
+ (10888,'d005','1987-06-28','1989-09-11'),
981
+ (10889,'d007','1987-08-11','9999-01-01'),
982
+ (10890,'d007','1990-03-10','9999-01-01'),
983
+ (10891,'d005','1995-10-06','9999-01-01'),
984
+ (10892,'d003','1990-04-11','9999-01-01'),
985
+ (10893,'d001','1989-08-23','9999-01-01'),
986
+ (10894,'d004','1995-12-05','9999-01-01'),
987
+ (10895,'d007','1986-04-26','1986-12-25'),
988
+ (10895,'d009','1986-12-25','1987-04-13'),
989
+ (10896,'d004','1997-11-27','9999-01-01'),
990
+ (10897,'d007','1986-04-09','9999-01-01'),
991
+ (10898,'d004','1993-01-08','9999-01-01'),
992
+ (10899,'d001','1990-04-05','9999-01-01'),
993
+ (10900,'d005','1995-09-07','9999-01-01'),
994
+ (10901,'d002','1998-08-05','9999-01-01'),
995
+ (10902,'d005','1990-06-11','1990-09-25'),
996
+ (10903,'d009','1989-02-14','9999-01-01'),
997
+ (10904,'d005','1993-04-16','9999-01-01'),
998
+ (10905,'d004','1985-02-28','1986-03-07'),
999
+ (10906,'d002','1998-10-18','2001-04-25'),
1000
+ (10906,'d007','2001-04-25','9999-01-01'),
1001
+ (10907,'d003','1988-12-25','9999-01-01'),
1002
+ (10908,'d003','1986-04-05','9999-01-01'),
1003
+ (10909,'d005','1993-12-26','9999-01-01'),
1004
+ (10910,'d009','1989-09-02','9999-01-01'),
1005
+ (10911,'d004','1988-06-25','9999-01-01'),
1006
+ (10912,'d002','1986-04-23','1999-09-26'),
1007
+ (10913,'d002','1998-10-25','9999-01-01'),
1008
+ (10914,'d007','1998-03-24','1998-09-01'),
1009
+ (10915,'d004','1999-10-28','9999-01-01'),
1010
+ (10916,'d004','1998-10-02','9999-01-01'),
1011
+ (10916,'d005','1998-03-12','1998-10-02'),
1012
+ (10917,'d005','1993-01-30','9999-01-01'),
1013
+ (10918,'d002','1990-01-29','1990-10-10'),
1014
+ (10919,'d001','1999-10-30','9999-01-01'),
1015
+ (10920,'d003','1992-02-24','9999-01-01'),
1016
+ (10921,'d004','1986-07-27','9999-01-01'),
1017
+ (10922,'d007','1996-02-02','1999-01-16'),
1018
+ (10923,'d007','1990-04-09','9999-01-01'),
1019
+ (10924,'d007','1988-08-14','9999-01-01'),
1020
+ (10925,'d004','1991-06-11','9999-01-01'),
1021
+ (10926,'d004','1990-04-30','1992-11-04'),
1022
+ (10926,'d009','1992-11-04','9999-01-01'),
1023
+ (10927,'d001','1986-09-12','9999-01-01'),
1024
+ (10928,'d001','1991-04-07','9999-01-01'),
1025
+ (10929,'d001','1991-04-15','9999-01-01'),
1026
+ (10930,'d004','1991-11-22','9999-01-01'),
1027
+ (10931,'d004','1992-06-14','1999-09-19'),
1028
+ (10932,'d005','1994-09-09','9999-01-01'),
1029
+ (10933,'d004','1993-08-02','9999-01-01'),
1030
+ (10934,'d002','1995-09-17','9999-01-01'),
1031
+ (10935,'d002','1994-10-17','9999-01-01'),
1032
+ (10936,'d003','1990-05-09','9999-01-01'),
1033
+ (10937,'d004','1991-05-03','9999-01-01'),
1034
+ (10937,'d005','1988-06-16','1991-05-03'),
1035
+ (10938,'d001','1985-09-24','9999-01-01'),
1036
+ (10939,'d006','1997-12-11','9999-01-01'),
1037
+ (10940,'d005','1997-06-30','1999-12-02'),
1038
+ (10941,'d001','1993-08-22','9999-01-01'),
1039
+ (10942,'d005','1996-01-21','9999-01-01'),
1040
+ (10943,'d005','1993-05-22','9999-01-01'),
1041
+ (10944,'d004','1995-09-07','9999-01-01'),
1042
+ (10945,'d004','1993-04-04','9999-01-01'),
1043
+ (10946,'d009','1996-10-26','9999-01-01'),
1044
+ (10947,'d009','1995-11-16','9999-01-01'),
1045
+ (10948,'d005','1996-09-30','1997-04-29'),
1046
+ (10948,'d008','1997-04-29','1997-06-23'),
1047
+ (10949,'d002','1990-06-29','9999-01-01'),
1048
+ (10950,'d004','1996-06-08','1998-01-13'),
1049
+ (10951,'d002','1989-07-06','9999-01-01'),
1050
+ (10952,'d005','1986-07-22','1988-04-26'),
1051
+ (10953,'d007','1987-02-12','9999-01-01'),
1052
+ (10954,'d009','1995-12-14','9999-01-01'),
1053
+ (10955,'d007','1986-09-27','9999-01-01'),
1054
+ (10956,'d004','1997-02-10','9999-01-01'),
1055
+ (10956,'d005','1995-12-02','1997-02-10'),
1056
+ (10957,'d007','1990-10-01','9999-01-01'),
1057
+ (10958,'d005','1988-11-27','9999-01-01'),
1058
+ (10959,'d007','1994-03-01','1996-04-12'),
1059
+ (10960,'d007','1995-07-07','9999-01-01'),
1060
+ (10961,'d005','1993-11-04','9999-01-01'),
1061
+ (10962,'d007','1986-12-16','9999-01-01'),
1062
+ (10963,'d005','1988-01-14','1995-04-10'),
1063
+ (10964,'d002','1991-05-05','9999-01-01'),
1064
+ (10965,'d007','1986-07-29','9999-01-01'),
1065
+ (10966,'d004','1999-11-12','9999-01-01'),
1066
+ (10966,'d008','1997-02-05','1999-11-12'),
1067
+ (10967,'d005','1993-08-01','9999-01-01'),
1068
+ (10968,'d007','1985-08-11','9999-01-01'),
1069
+ (10969,'d005','1994-05-12','9999-01-01'),
1070
+ (10970,'d004','1995-11-14','9999-01-01'),
1071
+ (10971,'d005','1991-07-30','1998-10-24'),
1072
+ (10972,'d005','1987-06-06','9999-01-01'),
1073
+ (10973,'d005','1989-03-05','9999-01-01'),
1074
+ (10974,'d005','1999-05-17','9999-01-01'),
1075
+ (10975,'d004','1992-03-30','1997-01-14'),
1076
+ (10975,'d009','1997-01-14','9999-01-01'),
1077
+ (10976,'d004','1998-10-31','9999-01-01'),
1078
+ (10977,'d007','1987-08-10','1987-10-01'),
1079
+ (10978,'d004','1985-05-18','9999-01-01'),
1080
+ (10979,'d004','1986-01-27','9999-01-01'),
1081
+ (10980,'d005','1989-01-04','9999-01-01'),
1082
+ (10981,'d007','1992-07-07','9999-01-01'),
1083
+ (10982,'d008','1989-11-11','9999-01-01'),
1084
+ (10983,'d004','1988-02-22','9999-01-01'),
1085
+ (10984,'d004','1988-07-09','1993-05-14'),
1086
+ (10985,'d005','1999-02-11','1999-02-27'),
1087
+ (10985,'d008','1999-02-27','1999-03-10'),
1088
+ (10986,'d005','1985-10-11','9999-01-01'),
1089
+ (10987,'d005','1997-05-21','9999-01-01'),
1090
+ (10988,'d005','1985-06-19','9999-01-01'),
1091
+ (10989,'d002','1985-07-20','9999-01-01'),
1092
+ (10990,'d005','1990-08-06','9999-01-01'),
1093
+ (10991,'d005','1999-07-13','9999-01-01'),
1094
+ (10992,'d005','1997-04-27','9999-01-01'),
1095
+ (10993,'d006','1992-05-29','9999-01-01'),
1096
+ (10994,'d004','1987-11-13','1989-05-24'),
1097
+ (10994,'d005','1987-06-29','1987-11-13'),
1098
+ (10995,'d001','1997-07-19','9999-01-01'),
1099
+ (10996,'d007','1990-02-07','9999-01-01'),
1100
+ (10997,'d004','2000-01-04','9999-01-01'),
1101
+ (10998,'d007','1996-08-07','9999-01-01'),
1102
+ (10999,'d005','1996-03-05','1997-04-19'),
1103
+ (11000,'d005','1996-01-28','9999-01-01');
employee-sample-database/mysql/dataset_small/load_dept_manager.sql ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ INSERT INTO `dept_manager` VALUES
2
+ (10002,'d001','1985-01-01','1991-10-01'),
3
+
4
+ (10039,'d001','1991-10-01','9999-01-01'),
5
+
6
+ (10085,'d002','1985-01-01','1989-12-17'),
7
+
8
+ (10114,'d002','1989-12-17','9999-01-01'),
9
+
10
+ (10183,'d003','1985-01-01','1992-03-21'),
11
+
12
+ (10228,'d003','1992-03-21','9999-01-01'),
13
+
14
+ (10303,'d004','1985-01-01','1988-09-09'),
15
+
16
+ (10344,'d004','1988-09-09','1992-08-02'),
17
+
18
+ (10386,'d004','1992-08-02','1996-08-30'),
19
+
20
+ (10420,'d004','1996-08-30','9999-01-01'),
21
+
22
+ (10511,'d005','1985-01-01','1992-04-25'),
23
+
24
+ (10567,'d005','1992-04-25','9999-01-01'),
25
+
26
+ (10725,'d006','1985-01-01','1989-05-06'),
27
+
28
+ (10765,'d006','1989-05-06','1991-09-12'),
29
+
30
+ (10800,'d006','1991-09-12','1994-06-28'),
31
+
32
+ (10854,'d006','1994-06-28','9999-01-01');
employee-sample-database/mysql/dataset_small/load_employee.sql ADDED
@@ -0,0 +1,1000 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ INSERT INTO `employee` VALUES (10001,'1953-09-02','Georgi','Facello','M','1986-06-26'),
2
+ (10002,'1964-06-02','Bezalel','Simmel','F','1985-11-21'),
3
+ (10003,'1959-12-03','Parto','Bamford','M','1986-08-28'),
4
+ (10004,'1954-05-01','Chirstian','Koblick','M','1986-12-01'),
5
+ (10005,'1955-01-21','Kyoichi','Maliniak','M','1989-09-12'),
6
+ (10006,'1953-04-20','Anneke','Preusig','F','1989-06-02'),
7
+ (10007,'1957-05-23','Tzvetan','Zielinski','F','1989-02-10'),
8
+ (10008,'1958-02-19','Saniya','Kalloufi','M','1994-09-15'),
9
+ (10009,'1952-04-19','Sumant','Peac','F','1985-02-18'),
10
+ (10010,'1963-06-01','Duangkaew','Piveteau','F','1989-08-24'),
11
+ (10011,'1953-11-07','Mary','Sluis','F','1990-01-22'),
12
+ (10012,'1960-10-04','Patricio','Bridgland','M','1992-12-18'),
13
+ (10013,'1963-06-07','Eberhardt','Terkki','M','1985-10-20'),
14
+ (10014,'1956-02-12','Berni','Genin','M','1987-03-11'),
15
+ (10015,'1959-08-19','Guoxiang','Nooteboom','M','1987-07-02'),
16
+ (10016,'1961-05-02','Kazuhito','Cappelletti','M','1995-01-27'),
17
+ (10017,'1958-07-06','Cristinel','Bouloucos','F','1993-08-03'),
18
+ (10018,'1954-06-19','Kazuhide','Peha','F','1987-04-03'),
19
+ (10019,'1953-01-23','Lillian','Haddadi','M','1999-04-30'),
20
+ (10020,'1952-12-24','Mayuko','Warwick','M','1991-01-26'),
21
+ (10021,'1960-02-20','Ramzi','Erde','M','1988-02-10'),
22
+ (10022,'1952-07-08','Shahaf','Famili','M','1995-08-22'),
23
+ (10023,'1953-09-29','Bojan','Montemayor','F','1989-12-17'),
24
+ (10024,'1958-09-05','Suzette','Pettey','F','1997-05-19'),
25
+ (10025,'1958-10-31','Prasadram','Heyers','M','1987-08-17'),
26
+ (10026,'1953-04-03','Yongqiao','Berztiss','M','1995-03-20'),
27
+ (10027,'1962-07-10','Divier','Reistad','F','1989-07-07'),
28
+ (10028,'1963-11-26','Domenick','Tempesti','M','1991-10-22'),
29
+ (10029,'1956-12-13','Otmar','Herbst','M','1985-11-20'),
30
+ (10030,'1958-07-14','Elvis','Demeyer','M','1994-02-17'),
31
+ (10031,'1959-01-27','Karsten','Joslin','M','1991-09-01'),
32
+ (10032,'1960-08-09','Jeong','Reistad','F','1990-06-20'),
33
+ (10033,'1956-11-14','Arif','Merlo','M','1987-03-18'),
34
+ (10034,'1962-12-29','Bader','Swan','M','1988-09-21'),
35
+ (10035,'1953-02-08','Alain','Chappelet','M','1988-09-05'),
36
+ (10036,'1959-08-10','Adamantios','Portugali','M','1992-01-03'),
37
+ (10037,'1963-07-22','Pradeep','Makrucki','M','1990-12-05'),
38
+ (10038,'1960-07-20','Huan','Lortz','M','1989-09-20'),
39
+ (10039,'1959-10-01','Alejandro','Brender','M','1988-01-19'),
40
+ (10040,'1959-09-13','Weiyi','Meriste','F','1993-02-14'),
41
+ (10041,'1959-08-27','Uri','Lenart','F','1989-11-12'),
42
+ (10042,'1956-02-26','Magy','Stamatiou','F','1993-03-21'),
43
+ (10043,'1960-09-19','Yishay','Tzvieli','M','1990-10-20'),
44
+ (10044,'1961-09-21','Mingsen','Casley','F','1994-05-21'),
45
+ (10045,'1957-08-14','Moss','Shanbhogue','M','1989-09-02'),
46
+ (10046,'1960-07-23','Lucien','Rosenbaum','M','1992-06-20'),
47
+ (10047,'1952-06-29','Zvonko','Nyanchama','M','1989-03-31'),
48
+ (10048,'1963-07-11','Florian','Syrotiuk','M','1985-02-24'),
49
+ (10049,'1961-04-24','Basil','Tramer','F','1992-05-04'),
50
+ (10050,'1958-05-21','Yinghua','Dredge','M','1990-12-25'),
51
+ (10051,'1953-07-28','Hidefumi','Caine','M','1992-10-15'),
52
+ (10052,'1961-02-26','Heping','Nitsch','M','1988-05-21'),
53
+ (10053,'1954-09-13','Sanjiv','Zschoche','F','1986-02-04'),
54
+ (10054,'1957-04-04','Mayumi','Schueller','M','1995-03-13'),
55
+ (10055,'1956-06-06','Georgy','Dredge','M','1992-04-27'),
56
+ (10056,'1961-09-01','Brendon','Bernini','F','1990-02-01'),
57
+ (10057,'1954-05-30','Ebbe','Callaway','F','1992-01-15'),
58
+ (10058,'1954-10-01','Berhard','McFarlin','M','1987-04-13'),
59
+ (10059,'1953-09-19','Alejandro','McAlpine','F','1991-06-26'),
60
+ (10060,'1961-10-15','Breannda','Billingsley','M','1987-11-02'),
61
+ (10061,'1962-10-19','Tse','Herber','M','1985-09-17'),
62
+ (10062,'1961-11-02','Anoosh','Peyn','M','1991-08-30'),
63
+ (10063,'1952-08-06','Gino','Leonhardt','F','1989-04-08'),
64
+ (10064,'1959-04-07','Udi','Jansch','M','1985-11-20'),
65
+ (10065,'1963-04-14','Satosi','Awdeh','M','1988-05-18'),
66
+ (10066,'1952-11-13','Kwee','Schusler','M','1986-02-26'),
67
+ (10067,'1953-01-07','Claudi','Stavenow','M','1987-03-04'),
68
+ (10068,'1962-11-26','Charlene','Brattka','M','1987-08-07'),
69
+ (10069,'1960-09-06','Margareta','Bierman','F','1989-11-05'),
70
+ (10070,'1955-08-20','Reuven','Garigliano','M','1985-10-14'),
71
+ (10071,'1958-01-21','Hisao','Lipner','M','1987-10-01'),
72
+ (10072,'1952-05-15','Hironoby','Sidou','F','1988-07-21'),
73
+ (10073,'1954-02-23','Shir','McClurg','M','1991-12-01'),
74
+ (10074,'1955-08-28','Mokhtar','Bernatsky','F','1990-08-13'),
75
+ (10075,'1960-03-09','Gao','Dolinsky','F','1987-03-19'),
76
+ (10076,'1952-06-13','Erez','Ritzmann','F','1985-07-09'),
77
+ (10077,'1964-04-18','Mona','Azuma','M','1990-03-02'),
78
+ (10078,'1959-12-25','Danel','Mondadori','F','1987-05-26'),
79
+ (10079,'1961-10-05','Kshitij','Gils','F','1986-03-27'),
80
+ (10080,'1957-12-03','Premal','Baek','M','1985-11-19'),
81
+ (10081,'1960-12-17','Zhongwei','Rosen','M','1986-10-30'),
82
+ (10082,'1963-09-09','Parviz','Lortz','M','1990-01-03'),
83
+ (10083,'1959-07-23','Vishv','Zockler','M','1987-03-31'),
84
+ (10084,'1960-05-25','Tuval','Kalloufi','M','1995-12-15'),
85
+ (10085,'1962-11-07','Kenroku','Malabarba','M','1994-04-09'),
86
+ (10086,'1962-11-19','Somnath','Foote','M','1990-02-16'),
87
+ (10087,'1959-07-23','Xinglin','Eugenio','F','1986-09-08'),
88
+ (10088,'1954-02-25','Jungsoon','Syrzycki','F','1988-09-02'),
89
+ (10089,'1963-03-21','Sudharsan','Flasterstein','F','1986-08-12'),
90
+ (10090,'1961-05-30','Kendra','Hofting','M','1986-03-14'),
91
+ (10091,'1955-10-04','Amabile','Gomatam','M','1992-11-18'),
92
+ (10092,'1964-10-18','Valdiodio','Niizuma','F','1989-09-22'),
93
+ (10093,'1964-06-11','Sailaja','Desikan','M','1996-11-05'),
94
+ (10094,'1957-05-25','Arumugam','Ossenbruggen','F','1987-04-18'),
95
+ (10095,'1965-01-03','Hilari','Morton','M','1986-07-15'),
96
+ (10096,'1954-09-16','Jayson','Mandell','M','1990-01-14'),
97
+ (10097,'1952-02-27','Remzi','Waschkowski','M','1990-09-15'),
98
+ (10098,'1961-09-23','Sreekrishna','Servieres','F','1985-05-13'),
99
+ (10099,'1956-05-25','Valter','Sullins','F','1988-10-18'),
100
+ (10100,'1953-04-21','Hironobu','Haraldson','F','1987-09-21'),
101
+ (10101,'1952-04-15','Perla','Heyers','F','1992-12-28'),
102
+ (10102,'1959-11-04','Paraskevi','Luby','F','1994-01-26'),
103
+ (10103,'1953-11-26','Akemi','Birch','M','1986-12-02'),
104
+ (10104,'1961-11-19','Xinyu','Warwick','M','1987-04-16'),
105
+ (10105,'1962-02-05','Hironoby','Piveteau','M','1999-03-23'),
106
+ (10106,'1952-08-29','Eben','Aingworth','M','1990-12-19'),
107
+ (10107,'1956-06-13','Dung','Baca','F','1994-03-22'),
108
+ (10108,'1952-04-07','Lunjin','Giveon','M','1986-10-02'),
109
+ (10109,'1958-11-25','Mariusz','Prampolini','F','1993-06-16'),
110
+ (10110,'1957-03-07','Xuejia','Ullian','F','1986-08-22'),
111
+ (10111,'1963-08-29','Hugo','Rosis','F','1988-06-19'),
112
+ (10112,'1963-08-13','Yuichiro','Swick','F','1985-10-08'),
113
+ (10113,'1963-11-13','Jaewon','Syrzycki','M','1989-12-24'),
114
+ (10114,'1957-02-16','Munir','Demeyer','F','1992-07-17'),
115
+ (10115,'1964-12-25','Chikara','Rissland','M','1986-01-23'),
116
+ (10116,'1955-08-26','Dayanand','Czap','F','1985-05-28'),
117
+ (10117,'1961-10-24','Kiyotoshi','Blokdijk','F','1990-05-28'),
118
+ (10118,'1957-03-29','Zhonghui','Zyda','F','1990-09-13'),
119
+ (10119,'1960-12-01','Domenick','Peltason','M','1986-03-14'),
120
+ (10120,'1960-03-26','Armond','Fairtlough','F','1996-07-06'),
121
+ (10121,'1962-07-14','Guoxiang','Ramsay','M','1989-05-03'),
122
+ (10122,'1965-01-19','Ohad','Esposito','M','1992-12-23'),
123
+ (10123,'1962-05-12','Hinrich','Randi','M','1993-01-15'),
124
+ (10124,'1962-05-23','Geraldo','Marwedel','M','1991-09-05'),
125
+ (10125,'1957-09-13','Syozo','Hiltgen','F','1990-10-26'),
126
+ (10126,'1954-08-07','Kayoko','Valtorta','M','1985-09-08'),
127
+ (10127,'1952-02-24','Subir','Baja','F','1989-01-14'),
128
+ (10128,'1958-02-15','Babette','Lamba','F','1988-06-06'),
129
+ (10129,'1955-12-02','Armond','Peir','M','1985-12-10'),
130
+ (10130,'1955-04-27','Nishit','Casperson','M','1988-06-21'),
131
+ (10131,'1952-02-19','Magdalena','Eldridge','M','1994-11-17'),
132
+ (10132,'1956-12-15','Ayakannu','Skrikant','M','1994-10-30'),
133
+ (10133,'1963-12-12','Giri','Isaak','M','1985-12-15'),
134
+ (10134,'1953-04-15','Diederik','Siprelle','M','1987-12-12'),
135
+ (10135,'1956-12-23','Nathan','Monkewich','M','1988-02-19'),
136
+ (10136,'1961-09-14','Zissis','Pintelas','M','1986-02-11'),
137
+ (10137,'1959-07-30','Maren','Hutton','M','1985-02-18'),
138
+ (10138,'1955-04-24','Perry','Shimshoni','M','1986-09-18'),
139
+ (10139,'1963-03-03','Ewing','Foong','F','1998-03-15'),
140
+ (10140,'1957-03-11','Yucel','Auria','F','1991-03-14'),
141
+ (10141,'1960-01-17','Shahaf','Ishibashi','F','1993-05-06'),
142
+ (10142,'1956-08-29','Tzvetan','Hettesheimer','M','1993-10-28'),
143
+ (10143,'1961-07-16','Sakthirel','Bakhtari','M','1988-09-30'),
144
+ (10144,'1959-06-17','Marla','Brendel','M','1985-10-14'),
145
+ (10145,'1956-03-30','Akemi','Esposito','F','1987-08-01'),
146
+ (10146,'1959-01-12','Chenyi','Syang','M','1988-06-28'),
147
+ (10147,'1964-10-13','Kazuhito','Encarnacion','M','1986-08-21'),
148
+ (10148,'1957-10-04','Douadi','Azumi','M','1995-10-10'),
149
+ (10149,'1953-05-20','Xiadong','Perry','F','1986-11-05'),
150
+ (10150,'1955-01-29','Zhenbing','Perng','F','1986-11-16'),
151
+ (10151,'1959-03-06','Itzchak','Lichtner','M','1990-04-10'),
152
+ (10152,'1954-12-01','Jaques','Munro','F','1986-01-27'),
153
+ (10153,'1955-12-15','Heekeun','Majewski','M','1987-04-08'),
154
+ (10154,'1957-01-17','Abdulah','Thibadeau','F','1990-12-12'),
155
+ (10155,'1959-12-07','Adas','Nastansky','M','1990-01-05'),
156
+ (10156,'1964-09-19','Sumali','Fargier','M','1985-03-10'),
157
+ (10157,'1954-04-23','Nigel','Aloisi','M','1985-11-02'),
158
+ (10158,'1958-04-01','Khedija','Mitsuhashi','M','1986-01-29'),
159
+ (10159,'1955-03-03','Serif','Buescher','M','1991-05-29'),
160
+ (10160,'1953-10-18','Debatosh','Khasidashvili','M','1989-01-30'),
161
+ (10161,'1953-04-06','Hairong','Mellouli','F','1988-04-03'),
162
+ (10162,'1957-10-05','Florina','Eugenio','M','1991-05-01'),
163
+ (10163,'1952-09-17','Karsten','Szmurlo','M','1989-07-19'),
164
+ (10164,'1956-01-19','Jagoda','Braunmuhl','M','1985-11-12'),
165
+ (10165,'1960-06-16','Miyeon','Macedo','M','1988-05-17'),
166
+ (10166,'1953-05-10','Samphel','Siegrist','F','1993-01-01'),
167
+ (10167,'1958-05-23','Duangkaew','Rassart','M','1992-04-04'),
168
+ (10168,'1964-09-11','Dharmaraja','Stassinopoulos','M','1986-12-06'),
169
+ (10169,'1961-05-03','Sampalli','Snedden','F','1992-07-24'),
170
+ (10170,'1960-10-03','Kasturi','Jenevein','F','1986-01-02'),
171
+ (10171,'1957-09-11','Herbert','Trachtenberg','M','1989-07-22'),
172
+ (10172,'1957-03-25','Shigeu','Matzen','F','1995-10-13'),
173
+ (10173,'1962-10-28','Shrikanth','Mahmud','M','1992-03-21'),
174
+ (10174,'1959-05-15','Badri','Furudate','M','1987-06-01'),
175
+ (10175,'1960-01-11','Aleksandar','Ananiadou','F','1988-01-11'),
176
+ (10176,'1957-01-24','Brendon','Lenart','F','1994-12-22'),
177
+ (10177,'1954-11-08','Pragnesh','Iisaka','M','1993-02-06'),
178
+ (10178,'1963-03-13','Valery','Litvinov','M','1986-10-07'),
179
+ (10179,'1961-11-25','Deniz','Duclos','F','1990-10-04'),
180
+ (10180,'1956-01-29','Shaw','Wendorf','M','1986-02-25'),
181
+ (10181,'1963-01-22','Sibyl','Nooteboom','M','1988-06-22'),
182
+ (10182,'1961-02-04','Moriyoshi','Merey','F','1990-09-02'),
183
+ (10183,'1954-10-17','Mechthild','Bonifati','M','1996-08-11'),
184
+ (10184,'1957-05-22','Mihalis','Lowrie','M','1987-10-29'),
185
+ (10185,'1959-12-05','Duro','Sidhu','F','1986-03-01'),
186
+ (10186,'1953-07-16','Shigehito','Kropatsch','M','1986-03-28'),
187
+ (10187,'1961-05-26','Tommaso','Narwekar','F','1991-06-01'),
188
+ (10188,'1956-07-13','Christ','Muchinsky','F','1987-08-27'),
189
+ (10189,'1955-11-12','Khalid','Erva','M','1989-10-05'),
190
+ (10190,'1964-12-11','Arve','Fairtlough','F','1986-06-23'),
191
+ (10191,'1959-04-08','Zdislav','Nastansky','M','1986-04-10'),
192
+ (10192,'1960-09-16','Mohua','Falck','M','1988-06-13'),
193
+ (10193,'1960-06-29','Masaru','Cheshire','M','1991-07-28'),
194
+ (10194,'1954-01-29','Josyula','Hofmeyr','F','1989-05-15'),
195
+ (10195,'1963-11-13','Annemarie','Redmiles','M','1985-02-15'),
196
+ (10196,'1954-01-27','Marc','Hellwagner','M','1994-11-16'),
197
+ (10197,'1963-08-06','Kasidit','Krzyzanowski','F','1993-11-22'),
198
+ (10198,'1953-05-28','Pranav','Furedi','M','1985-08-31'),
199
+ (10199,'1959-04-07','Kazuhisa','Ranta','M','1997-04-29'),
200
+ (10200,'1961-12-31','Vidya','Awdeh','M','1985-10-16'),
201
+ (10201,'1956-12-15','Idoia','Kavraki','F','1986-11-22'),
202
+ (10202,'1956-01-05','Greger','Lichtner','M','1991-10-06'),
203
+ (10203,'1955-07-27','Steen','Escriba','M','1989-04-06'),
204
+ (10204,'1956-12-09','Nevio','Ritcey','F','1986-12-04'),
205
+ (10205,'1953-05-20','Mabhin','Leijenhorst','F','1993-08-23'),
206
+ (10206,'1960-09-19','Alassane','Iwayama','F','1988-04-19'),
207
+ (10207,'1955-05-28','Girolamo','Anandan','F','1992-10-11'),
208
+ (10208,'1960-01-02','Xiping','Klerer','M','1991-12-23'),
209
+ (10209,'1956-12-12','Yolla','Ellozy','F','1991-11-23'),
210
+ (10210,'1958-01-24','Yuping','Alpin','M','1994-05-10'),
211
+ (10211,'1964-08-05','Vishu','Strehl','F','1989-11-18'),
212
+ (10212,'1959-05-09','Divier','Esteva','M','1990-07-11'),
213
+ (10213,'1964-05-24','Jackson','Kakkad','M','1992-11-06'),
214
+ (10214,'1962-04-14','Tadahiko','Ciolek','M','1988-02-29'),
215
+ (10215,'1954-04-02','Xiaobin','Duclos','M','1987-10-19'),
216
+ (10216,'1958-07-16','Amstein','Ghemri','M','1987-10-30'),
217
+ (10217,'1954-07-07','Yongmin','Roison','F','1986-05-12'),
218
+ (10218,'1958-12-07','Zhenhua','Magalhaes','M','1997-01-15'),
219
+ (10219,'1952-05-02','Genta','Kolvik','M','1993-03-31'),
220
+ (10220,'1958-05-25','Kish','Fasbender','F','1992-06-25'),
221
+ (10221,'1957-01-03','Yucai','Granlund','M','1988-06-08'),
222
+ (10222,'1962-09-21','Tze','Nourani','M','1986-06-08'),
223
+ (10223,'1963-09-17','Carrsten','Schmiedel','F','1985-11-18'),
224
+ (10224,'1954-05-17','Leon','Trogemann','M','1988-01-09'),
225
+ (10225,'1957-02-13','Kellie','Chinen','F','1986-06-19'),
226
+ (10226,'1964-12-28','Xinglin','Plessier','M','1989-10-27'),
227
+ (10227,'1957-07-04','Anneli','Kaiser','M','1994-04-24'),
228
+ (10228,'1953-04-21','Karoline','Cesareni','F','1991-08-26'),
229
+ (10229,'1952-02-10','Ulises','Takanami','M','1987-11-22'),
230
+ (10230,'1955-09-11','Clyde','Vernadat','M','1996-06-16'),
231
+ (10231,'1963-07-21','Shaowen','Desikan','F','1996-04-13'),
232
+ (10232,'1956-03-11','Marko','Auria','F','1992-06-04'),
233
+ (10233,'1954-04-01','Lein','Vendrig','F','1985-07-05'),
234
+ (10234,'1961-01-18','Arunachalam','Bakhtari','M','1990-11-19'),
235
+ (10235,'1958-03-27','Susanta','Roccetti','F','1995-04-06'),
236
+ (10236,'1960-03-26','Susumu','Bade','F','1996-08-30'),
237
+ (10237,'1952-09-22','Yannis','Mandell','F','1989-08-11'),
238
+ (10238,'1964-11-02','Mototsugu','Gire','F','1986-11-19'),
239
+ (10239,'1955-03-31','Nikolaos','Llado','F','1995-05-08'),
240
+ (10240,'1952-04-01','Remko','Maccarone','M','1998-10-06'),
241
+ (10241,'1958-07-01','Ortrud','Murillo','M','1988-06-12'),
242
+ (10242,'1964-02-22','Lunjin','Ozeri','M','1988-01-18'),
243
+ (10243,'1960-12-22','Wonhee','Pouyioutas','M','1985-11-24'),
244
+ (10244,'1961-10-24','Foong','Flasterstein','M','1985-12-23'),
245
+ (10245,'1962-08-23','Ramalingam','Gente','F','1985-04-26'),
246
+ (10246,'1962-06-23','Basem','Teitelbaum','M','1987-07-12'),
247
+ (10247,'1964-06-30','Heon','Riefers','F','1992-08-14'),
248
+ (10248,'1955-09-24','Frederique','Tempesti','F','1991-08-13'),
249
+ (10249,'1954-06-10','Marie','Boreale','M','1991-12-08'),
250
+ (10250,'1958-08-12','Serap','Etalle','M','1992-08-30'),
251
+ (10251,'1957-04-25','Alair','Rosenbaum','M','1992-06-25'),
252
+ (10252,'1961-01-30','Shirish','Wegerle','F','1990-11-08'),
253
+ (10253,'1964-11-12','Zsolt','Salinas','F','1985-02-21'),
254
+ (10254,'1959-12-07','Shen','Brattka','M','1990-06-14'),
255
+ (10255,'1964-02-08','Roddy','Garnick','M','1993-05-12'),
256
+ (10256,'1960-12-02','Irene','Radhakrishnan','M','1985-10-12'),
257
+ (10257,'1957-09-12','Aiman','Riexinger','M','1986-08-05'),
258
+ (10258,'1955-12-12','Basil','Ishibashi','F','1985-05-17'),
259
+ (10259,'1964-11-24','Susanna','Vesel','M','1986-06-25'),
260
+ (10260,'1961-07-14','Alper','Suomi','F','1991-04-13'),
261
+ (10261,'1959-12-25','Mang','Erie','M','1993-10-20'),
262
+ (10262,'1955-08-04','Mahendra','Maraist','F','1992-07-27'),
263
+ (10263,'1961-02-08','Takahiro','Waterhouse','M','1994-02-05'),
264
+ (10264,'1958-09-08','Nalini','Kawashimo','F','1997-07-16'),
265
+ (10265,'1960-12-01','Ramalingam','Muniz','M','1989-07-13'),
266
+ (10266,'1958-02-24','Sukumar','Rassart','M','1990-05-25'),
267
+ (10267,'1956-01-16','Shaunak','Cullers','M','1996-12-11'),
268
+ (10268,'1958-06-03','Nishit','Siochi','M','1986-12-17'),
269
+ (10269,'1959-10-07','Taizo','Oxman','F','1988-07-24'),
270
+ (10270,'1963-01-30','Bedir','Hartvigsen','F','1990-04-26'),
271
+ (10271,'1962-04-24','Sham','Eastman','M','1986-05-23'),
272
+ (10272,'1954-11-30','Yishai','Cannane','M','1988-05-23'),
273
+ (10273,'1962-08-29','Baocai','Lieblein','M','1985-11-06'),
274
+ (10274,'1957-08-23','Dmitri','Pearson','F','1991-04-21'),
275
+ (10275,'1961-10-22','Marek','Luck','F','1987-09-08'),
276
+ (10276,'1964-07-27','Xuejun','Hempstead','M','1985-07-21'),
277
+ (10277,'1964-08-15','Isaac','Schwartzbauer','M','1985-06-16'),
278
+ (10278,'1955-03-09','Lubomir','Nitsch','M','1991-05-17'),
279
+ (10279,'1964-08-20','Barton','Jumpertz','F','1994-12-20'),
280
+ (10280,'1964-10-29','Stabislas','Delgrange','M','1988-03-18'),
281
+ (10281,'1953-05-13','Moty','Kusakari','M','1994-12-03'),
282
+ (10282,'1953-11-27','Hercules','Benzmuller','M','1986-06-04'),
283
+ (10283,'1953-07-08','Kauko','Birjandi','M','1988-05-25'),
284
+ (10284,'1954-04-08','Masali','Murrill','F','1997-07-02'),
285
+ (10285,'1956-09-21','Zhonghui','Preusig','F','1995-02-27'),
286
+ (10286,'1952-05-14','Saddek','Gopalakrishnan','F','1988-03-21'),
287
+ (10287,'1963-11-28','Marie','Pietracaprina','M','1992-12-28'),
288
+ (10288,'1959-06-02','Selwyn','Perri','M','1994-08-29'),
289
+ (10289,'1956-11-30','Shay','Poulakidas','M','1990-06-06'),
290
+ (10290,'1957-05-29','Yongmao','Pleszkun','M','1991-09-18'),
291
+ (10291,'1965-01-23','Dipayan','Seghrouchni','M','1986-09-29'),
292
+ (10292,'1963-01-27','Yucel','Ghelli','F','1989-06-05'),
293
+ (10293,'1956-11-24','Mihalis','Avouris','F','1992-12-12'),
294
+ (10294,'1955-01-05','Rutger','Miara','M','1996-04-08'),
295
+ (10295,'1953-01-13','Kristine','Velardi','M','1990-08-27'),
296
+ (10296,'1964-05-13','Petter','Lorho','M','1989-09-16'),
297
+ (10297,'1956-06-17','Narain','Oaver','F','1986-05-28'),
298
+ (10298,'1954-07-06','Dietrich','DuCasse','F','1999-03-30'),
299
+ (10299,'1960-06-21','Ipke','Stentiford','F','1990-01-10'),
300
+ (10300,'1960-07-12','Tadahiko','Ulupinar','F','1991-05-17'),
301
+ (10301,'1962-08-26','Lucien','Staudhammer','M','1988-05-23'),
302
+ (10302,'1954-10-11','Faiza','Baer','F','1986-07-22'),
303
+ (10303,'1961-09-11','Marlo','Zschoche','M','1990-02-05'),
304
+ (10304,'1956-03-07','Bernt','Erie','M','1992-11-16'),
305
+ (10305,'1952-06-30','Hirochika','Piancastelli','M','1988-10-31'),
306
+ (10306,'1953-06-02','Heng','Kilgour','M','1993-09-06'),
307
+ (10307,'1955-07-20','Nikolaos','Leaver','M','1991-04-10'),
308
+ (10308,'1961-03-14','Dzung','Holburn','F','1992-12-29'),
309
+ (10309,'1964-11-06','Prodip','Schusler','F','1985-06-20'),
310
+ (10310,'1964-08-29','Aksel','Alencar','M','1990-10-24'),
311
+ (10311,'1958-11-24','Hsiangchu','Molenkamp','F','1991-04-01'),
312
+ (10312,'1957-06-18','Rasiah','Deyuan','F','1986-08-28'),
313
+ (10313,'1962-05-30','Subbu','Riexinger','M','1994-10-10'),
314
+ (10314,'1961-05-04','Christfried','Apsitis','M','1986-01-16'),
315
+ (10315,'1956-08-03','Maris','Angelopoulos','M','1987-08-28'),
316
+ (10316,'1958-06-20','Christoper','Schwaller','M','1987-09-04'),
317
+ (10317,'1957-12-25','Arie','Birge','M','1986-12-10'),
318
+ (10318,'1958-08-27','Mototsugu','Beilner','F','1985-06-29'),
319
+ (10319,'1963-03-09','Mechthild','Miyakawa','M','1985-08-15'),
320
+ (10320,'1956-06-22','Uinam','Stasinski','F','1988-11-03'),
321
+ (10321,'1955-12-12','Guenter','Ravishankar','M','1991-09-24'),
322
+ (10322,'1954-05-28','Isamu','Dahlbom','F','1990-01-29'),
323
+ (10323,'1958-06-20','Kankanahalli','Hinsberger','M','1991-06-06'),
324
+ (10324,'1957-12-29','Bernardo','Rouquie','F','1988-03-19'),
325
+ (10325,'1953-01-12','Arunachalam','Badr','M','1990-09-20'),
326
+ (10326,'1953-02-13','Masali','Czap','F','1985-05-13'),
327
+ (10327,'1954-04-01','Roded','Facello','M','1987-09-18'),
328
+ (10328,'1955-06-28','Serenella','Kawashima','M','1994-01-16'),
329
+ (10329,'1958-04-28','Remko','Shigei','F','1986-01-20'),
330
+ (10330,'1957-02-02','Kasturi','Bellmore','M','1985-06-12'),
331
+ (10331,'1961-08-12','Arto','Binkley','M','1985-04-06'),
332
+ (10332,'1961-11-05','Masanao','Bain','F','1988-06-08'),
333
+ (10333,'1953-04-27','Snehasis','Dymetman','M','1993-01-16'),
334
+ (10334,'1958-04-02','Falguni','Erie','M','1996-12-28'),
335
+ (10335,'1963-03-13','Toshimori','Bahi','F','1992-04-06'),
336
+ (10336,'1961-07-16','Goa','Rothe','F','1992-01-07'),
337
+ (10337,'1957-12-10','Jeong','Sadowsky','M','1995-08-06'),
338
+ (10338,'1961-02-12','Heon','Ranai','M','1988-09-01'),
339
+ (10339,'1957-08-27','Teunis','Liedekerke','M','1989-11-30'),
340
+ (10340,'1952-08-20','Djelloul','Laventhal','M','1987-06-05'),
341
+ (10341,'1960-11-22','Wilmer','Greenaway','F','1987-04-29'),
342
+ (10342,'1960-03-17','Stella','Hiroyama','F','1987-07-25'),
343
+ (10343,'1954-11-01','Dinah','Syrzycki','M','1993-10-14'),
344
+ (10344,'1957-07-24','Uwe','Garnier','F','1994-06-25'),
345
+ (10345,'1960-12-13','Arra','Ratnakar','M','1993-11-08'),
346
+ (10346,'1963-01-29','Aamod','Radwan','M','1987-01-27'),
347
+ (10347,'1953-10-03','Pradeep','Kaminger','M','1985-12-12'),
348
+ (10348,'1956-03-11','Mahendra','Picco','F','1995-10-22'),
349
+ (10349,'1954-04-29','Oksana','Brodie','F','1991-09-28'),
350
+ (10350,'1954-11-14','Kristen','Kavvadias','F','1990-08-19'),
351
+ (10351,'1963-08-23','Tadahiko','Strehl','F','1985-03-07'),
352
+ (10352,'1960-01-28','Erzsebet','Ohori','M','1996-01-21'),
353
+ (10353,'1953-01-15','Phule','Hammerschmidt','M','1989-08-24'),
354
+ (10354,'1961-04-21','Moto','Kusakari','M','1996-03-26'),
355
+ (10355,'1952-12-10','Satyanarayana','Cochrane','M','1987-11-15'),
356
+ (10356,'1952-08-12','Vasilis','Standera','M','1988-08-06'),
357
+ (10357,'1964-01-10','Hausi','Sidhu','M','1994-04-04'),
358
+ (10358,'1953-04-08','Qunsheng','Tagansky','M','1991-02-19'),
359
+ (10359,'1960-04-18','Heekeun','Sambasivam','F','1991-05-09'),
360
+ (10360,'1960-11-04','Irene','Munck','M','1996-09-04'),
361
+ (10361,'1961-04-22','Seshu','Sidou','F','1986-10-23'),
362
+ (10362,'1963-09-16','Shalesh','dAstous','M','1988-08-24'),
363
+ (10363,'1953-11-28','Toshiki','Muniz','F','1985-09-11'),
364
+ (10364,'1954-09-21','Nakhoon','Dengi','M','1985-11-14'),
365
+ (10365,'1958-04-28','Rosine','Granlund','F','1987-06-02'),
366
+ (10366,'1960-01-25','Morrie','Piazza','M','1994-04-11'),
367
+ (10367,'1955-12-24','Hyuckchul','Gini','M','1991-06-24'),
368
+ (10368,'1956-03-25','Hatim','Koshiba','M','1991-04-05'),
369
+ (10369,'1957-01-08','Qunsheng','Toyoshima','M','1986-05-17'),
370
+ (10370,'1957-08-03','Clyde','Fandrianto','M','1992-04-04'),
371
+ (10371,'1959-02-10','Ioana','Kirkerud','M','1989-11-28'),
372
+ (10372,'1952-04-08','Anneli','Frijda','F','1985-07-30'),
373
+ (10373,'1959-01-08','Hongzue','Heijenga','M','1997-04-26'),
374
+ (10374,'1955-10-08','Willard','Rosin','F','1993-12-08'),
375
+ (10375,'1957-10-09','Dante','Kalafatis','F','1994-05-29'),
376
+ (10376,'1959-02-12','Fai','Bale','M','1989-01-14'),
377
+ (10377,'1954-08-19','Marl','Grospietsch','M','1990-05-07'),
378
+ (10378,'1964-09-05','Takahira','Lichtner','M','1990-12-30'),
379
+ (10379,'1957-03-02','Mikhail','Rosis','M','1996-07-15'),
380
+ (10380,'1956-05-25','Alejandro','Kamble','F','1985-03-19'),
381
+ (10381,'1963-03-04','Jiong','Parfitt','M','1991-12-04'),
382
+ (10382,'1955-06-12','Shirish','Dredge','M','1990-07-04'),
383
+ (10383,'1963-11-13','Leucio','Aumann','M','1991-06-19'),
384
+ (10384,'1956-08-22','Feiyu','Luft','M','1986-01-16'),
385
+ (10385,'1963-05-14','Khatoun','Imataki','M','1992-12-20'),
386
+ (10386,'1956-11-09','Eishiro','Miyakawa','F','1985-08-02'),
387
+ (10387,'1952-11-03','Parto','Wrigley','F','1987-02-19'),
388
+ (10388,'1953-03-29','Hironoby','Kaiser','M','1996-03-24'),
389
+ (10389,'1953-03-24','Make','Peir','M','1995-10-31'),
390
+ (10390,'1960-03-07','Wanqing','Bratten','M','1989-05-17'),
391
+ (10391,'1956-06-13','Hongzue','Akaboshi','M','1989-12-24'),
392
+ (10392,'1962-02-17','Jiann','Hainaut','M','1992-03-01'),
393
+ (10393,'1958-03-24','Yagil','DasSarma','M','1989-06-23'),
394
+ (10394,'1957-05-22','Shawna','Meriste','M','1991-03-14'),
395
+ (10395,'1952-02-17','Takahiro','Deverell','M','1987-02-04'),
396
+ (10396,'1955-08-21','Sibyl','Rahier','M','1986-01-11'),
397
+ (10397,'1955-11-11','Irena','Reutenauer','M','1993-05-21'),
398
+ (10398,'1958-07-16','Shooichi','Escriba','F','1990-10-12'),
399
+ (10399,'1957-06-13','Guenter','Marchegay','F','1985-05-07'),
400
+ (10400,'1961-12-16','Ortrud','Nitto','M','1993-10-17'),
401
+ (10401,'1962-04-25','Eckart','Barriga','M','1991-04-05'),
402
+ (10402,'1953-07-23','Volkmar','Ebeling','M','1987-01-02'),
403
+ (10403,'1956-04-01','Atreyi','Mungall','F','1991-09-13'),
404
+ (10404,'1955-04-27','Prodip','Rosti','F','1988-08-28'),
405
+ (10405,'1957-01-20','Hilary','Budinsky','F','1985-11-04'),
406
+ (10406,'1956-09-21','Sigeru','Wynblatt','F','1987-03-11'),
407
+ (10407,'1955-07-05','Ulf','Siepmann','M','1990-03-08'),
408
+ (10408,'1964-03-17','Martijn','Kaiser','M','1998-10-07'),
409
+ (10409,'1958-08-28','Mario','Straney','M','1997-07-09'),
410
+ (10410,'1965-01-19','Takahito','Gecsei','F','1993-10-16'),
411
+ (10411,'1956-07-10','Lidong','Klerer','F','1989-09-02'),
412
+ (10412,'1958-02-26','Masoud','Fabrizio','F','1986-05-06'),
413
+ (10413,'1952-05-05','Danel','Impagliazzo','F','1990-03-26'),
414
+ (10414,'1954-04-09','Yinlin','Alpin','M','1990-05-30'),
415
+ (10415,'1957-11-12','Mark','Coorg','M','1993-10-25'),
416
+ (10416,'1956-05-26','Uli','Keustermans','M','1989-03-24'),
417
+ (10417,'1964-02-02','Bingning','Bakhtari','M','1992-03-12'),
418
+ (10418,'1952-06-29','Candida','Porotnikoff','F','1989-04-20'),
419
+ (10419,'1964-06-22','Maria','Bauknecht','F','1992-04-25'),
420
+ (10420,'1963-03-03','Kaijung','Riesenhuber','M','1988-01-17'),
421
+ (10421,'1959-03-22','Divine','Marzano','M','1989-09-12'),
422
+ (10422,'1954-06-02','Greger','Rubsam','F','1990-12-07'),
423
+ (10423,'1956-01-10','Dante','Cronin','F','1998-09-06'),
424
+ (10424,'1959-08-17','Babette','Straney','M','1989-08-07'),
425
+ (10425,'1963-10-24','Sashi','Osgood','M','1991-10-29'),
426
+ (10426,'1955-12-28','Arunas','Luce','F','1985-07-06'),
427
+ (10427,'1958-08-13','Khosrow','Sudbeck','F','1991-11-01'),
428
+ (10428,'1957-06-25','Cathie','Brlek','M','1992-06-04'),
429
+ (10429,'1952-02-13','Martien','Improta','F','1986-03-09'),
430
+ (10430,'1958-06-30','Ferdinand','Chenney','M','1990-11-16'),
431
+ (10431,'1961-05-25','Patricio','Bugrara','M','1987-10-08'),
432
+ (10432,'1953-11-06','Hisao','Tiemann','F','1985-04-30'),
433
+ (10433,'1954-09-02','Reuven','Dengi','M','1989-02-14'),
434
+ (10434,'1959-07-17','Dzung','Peltason','F','1995-06-27'),
435
+ (10435,'1957-10-12','Marsha','Tagansky','M','1986-12-19'),
436
+ (10436,'1963-06-17','Yahiko','Lammel','M','1988-01-30'),
437
+ (10437,'1956-07-07','Narain','Reeker','F','1996-04-12'),
438
+ (10438,'1961-12-25','Evgueni','Srimani','F','1990-01-19'),
439
+ (10439,'1958-04-09','Jolita','Jarecki','M','1990-01-11'),
440
+ (10440,'1959-04-10','Akeel','Narahara','F','1994-03-31'),
441
+ (10441,'1958-04-27','Adel','Perfilyeva','M','1988-07-12'),
442
+ (10442,'1955-09-09','Volkmar','Unno','M','1988-03-13'),
443
+ (10443,'1952-12-03','Shichao','Litvinov','F','1989-08-01'),
444
+ (10444,'1956-07-29','Kazuhira','Rosis','M','1993-03-31'),
445
+ (10445,'1957-01-10','Junichi','Kavanagh','F','1987-11-04'),
446
+ (10446,'1960-02-08','Ebru','Chepyzhov','F','1994-11-17'),
447
+ (10447,'1962-10-24','Ronghao','Yavatkar','F','1988-12-29'),
448
+ (10448,'1963-12-10','Phule','Oxenboll','F','1992-03-12'),
449
+ (10449,'1959-09-28','Aleksandar','Sudkamp','M','1987-03-28'),
450
+ (10450,'1959-11-05','Khun','Harbusch','M','1990-01-17'),
451
+ (10451,'1952-10-06','Bodh','Ranta','F','1988-03-12'),
452
+ (10452,'1956-11-24','Werner','Hasham','M','1988-09-05'),
453
+ (10453,'1953-07-19','Tsvetan','Matzel','F','1985-04-02'),
454
+ (10454,'1961-01-22','Wonhee','Badr','M','1987-04-10'),
455
+ (10455,'1963-12-17','Sverrir','Streng','F','1989-02-14'),
456
+ (10456,'1963-01-24','Stepehn','Hardjono','F','1995-12-25'),
457
+ (10457,'1963-11-10','Oddvar','Schlenzig','M','1991-11-23'),
458
+ (10458,'1961-01-06','Gina','Engelmann','F','1988-07-23'),
459
+ (10459,'1959-09-30','Ennio','Trogemann','M','1997-06-28'),
460
+ (10460,'1963-02-19','Shushma','VanScheik','M','1994-07-01'),
461
+ (10461,'1956-10-26','Gal','Karcich','M','1987-08-03'),
462
+ (10462,'1956-04-08','Sumali','Schlenzig','M','1996-03-25'),
463
+ (10463,'1954-05-20','Ung','Zaiane','M','1987-12-25'),
464
+ (10464,'1962-09-04','Mang','Maginnis','F','1989-10-09'),
465
+ (10465,'1963-03-13','Claudi','Shackel','M','1987-09-01'),
466
+ (10466,'1954-12-25','Jiakeng','Himler','M','1985-09-29'),
467
+ (10467,'1956-01-30','Dipayan','Suomi','F','1988-07-14'),
468
+ (10468,'1960-08-28','Yoshimitsu','Shobatake','M','1991-05-28'),
469
+ (10469,'1964-12-22','Munehiko','Ananiadou','M','1985-06-05'),
470
+ (10470,'1956-04-12','Peternela','Iwayama','M','1988-06-01'),
471
+ (10471,'1963-11-30','Jouko','Yamaashi','M','1990-11-18'),
472
+ (10472,'1959-08-20','Salvador','Lodder','M','1996-07-29'),
473
+ (10473,'1963-10-13','Przemyslawa','Oskamp','M','1987-10-30'),
474
+ (10474,'1962-02-24','Kenton','Garnham','F','1985-09-28'),
475
+ (10475,'1956-12-19','Mario','Rodite','M','1987-01-19'),
476
+ (10476,'1965-01-01','Kokou','Iisaka','M','1987-09-20'),
477
+ (10477,'1952-12-07','Guoxiang','Trogemann','F','1989-03-04'),
478
+ (10478,'1957-03-08','Maik','Ushiama','M','1992-06-09'),
479
+ (10479,'1959-01-27','Duro','Coney','F','1987-02-28'),
480
+ (10480,'1965-01-25','Make','Baba','F','1988-05-18'),
481
+ (10481,'1959-10-18','Yongmao','Pintelas','F','1988-10-06'),
482
+ (10482,'1961-07-17','Goa','Pleszkun','F','1991-07-20'),
483
+ (10483,'1957-03-13','Zhiwei','Anick','M','1992-11-08'),
484
+ (10484,'1961-08-30','Nirmal','Varley','F','1995-10-31'),
485
+ (10485,'1961-09-20','Teruyuki','Sundgren','M','1985-10-27'),
486
+ (10486,'1952-08-24','Amstein','Kossowski','F','1987-10-08'),
487
+ (10487,'1956-08-23','Perla','Middleton','F','1992-08-14'),
488
+ (10488,'1959-10-17','Mihalis','Heering','M','1994-06-09'),
489
+ (10489,'1958-08-24','Elvia','Homond','M','1989-09-10'),
490
+ (10490,'1961-09-28','Huiqun','Vuskovic','F','1992-10-07'),
491
+ (10491,'1964-09-09','Garnik','Narahari','M','1990-01-17'),
492
+ (10492,'1957-04-03','Lobel','Kumaresan','M','1988-04-24'),
493
+ (10493,'1962-01-12','Maris','Haraldson','M','1992-05-16'),
494
+ (10494,'1953-12-21','Yakkov','Servieres','F','1986-01-18'),
495
+ (10495,'1961-05-24','Anyuan','Zhiwei','F','1985-09-29'),
496
+ (10496,'1959-04-18','Gretta','Baig','M','1987-02-26'),
497
+ (10497,'1953-06-09','Pramod','Rabehasaina','M','1992-01-22'),
498
+ (10498,'1964-09-15','Valter','Cappelletti','F','1988-02-01'),
499
+ (10499,'1953-10-04','Maik','Luft','F','1989-11-23'),
500
+ (10500,'1957-04-29','Vojin','Narwekar','M','1996-12-16'),
501
+ (10501,'1962-09-09','Susuma','Larfeldt','M','1987-04-20'),
502
+ (10502,'1957-10-07','Yonghoan','Marshall','M','1993-03-04'),
503
+ (10503,'1952-05-17','Dannz','Pell','M','1991-04-30'),
504
+ (10504,'1953-04-07','Xiong','Varker','M','1988-12-03'),
505
+ (10505,'1964-02-04','Isamu','Auria','M','1985-07-23'),
506
+ (10506,'1958-10-06','Kazuhisa','Kroll','F','1996-12-01'),
507
+ (10507,'1964-02-18','Kasidit','Belinskaya','M','1985-04-26'),
508
+ (10508,'1962-06-02','Kotesh','Liedekerke','M','1991-05-01'),
509
+ (10509,'1953-10-03','Abdelwaheb','Riesenhuber','F','1990-02-23'),
510
+ (10510,'1960-02-13','Keung','Slobodova','F','1990-04-20'),
511
+ (10511,'1963-06-18','Khoa','Marrevee','M','1992-01-27'),
512
+ (10512,'1955-11-16','Udi','Gihr','M','1986-01-12'),
513
+ (10513,'1959-07-07','Yuichiro','Schicker','F','1991-04-02'),
514
+ (10514,'1963-04-03','Tomofumi','McClure','M','1992-04-29'),
515
+ (10515,'1963-12-15','Raimond','Kirkerud','M','1989-10-28'),
516
+ (10516,'1960-02-20','Xiadong','Luga','M','1985-10-19'),
517
+ (10517,'1953-06-18','Tiina','Speek','M','1990-12-25'),
518
+ (10518,'1963-05-23','Marin','Lanphier','M','1993-09-03'),
519
+ (10519,'1955-12-28','Yonghoan','Alencar','F','1986-03-22'),
520
+ (10520,'1964-03-06','Jenwei','Ecklund','M','1994-03-27'),
521
+ (10521,'1957-07-31','Kwangsub','Setia','M','1989-05-11'),
522
+ (10522,'1955-07-24','Marke','Cesareni','F','1986-12-12'),
523
+ (10523,'1956-05-16','Malu','Skafidas','M','1988-12-28'),
524
+ (10524,'1959-05-02','Shigehiro','Cincotta','F','1985-10-09'),
525
+ (10525,'1963-03-29','Yuchang','Lunt','M','1990-07-08'),
526
+ (10526,'1963-12-31','Kwangho','Theuretzbacher','F','1988-02-27'),
527
+ (10527,'1964-09-15','Tetsushi','Barvinok','F','1996-01-25'),
528
+ (10528,'1963-05-16','Koichi','Lakshmanan','F','1991-12-29'),
529
+ (10529,'1952-11-21','Ymte','Yetto','M','1992-01-05'),
530
+ (10530,'1956-07-19','Boriana','Coors','F','1987-09-23'),
531
+ (10531,'1954-06-11','Oguz','Gimbel','F','1991-02-20'),
532
+ (10532,'1959-08-31','Mary','Wossner','F','1986-05-18'),
533
+ (10533,'1963-06-25','Mohamadou','Smailagic','F','1986-10-31'),
534
+ (10534,'1964-10-23','Dinah','Bahl','M','1989-01-15'),
535
+ (10535,'1961-05-19','Shalesh','Stroustrup','F','1985-02-21'),
536
+ (10536,'1964-10-29','Yechiam','Sambasivam','F','1988-03-25'),
537
+ (10537,'1962-06-29','Stella','Benzmuller','M','1996-09-25'),
538
+ (10538,'1955-08-18','Przemyslawa','Falby','M','1987-07-23'),
539
+ (10539,'1959-05-13','Yucel','Reinhard','M','1990-06-05'),
540
+ (10540,'1961-02-24','Martins','Barriga','M','1994-05-03'),
541
+ (10541,'1955-11-05','Godehard','Eiter','M','1986-02-28'),
542
+ (10542,'1955-01-05','Yannis','Couchot','F','1989-03-28'),
543
+ (10543,'1962-10-06','Lein','Lichtman','M','1998-10-16'),
544
+ (10544,'1962-02-01','Ishfaq','Krzyzanowski','F','1995-04-29'),
545
+ (10545,'1963-01-12','Hauke','dAstous','M','1990-06-30'),
546
+ (10546,'1957-12-20','Nechama','Schapiro','M','1987-09-06'),
547
+ (10547,'1963-05-12','Snehasis','Brobst','M','1988-02-14'),
548
+ (10548,'1952-06-12','Ramalingam','Gunderson','M','1986-05-04'),
549
+ (10549,'1957-03-20','Beshir','Kisuki','M','1995-10-26'),
550
+ (10550,'1959-08-03','Manton','Leuchs','M','1985-02-03'),
551
+ (10551,'1963-10-07','Jeong','Rijsenbrij','M','1988-08-06'),
552
+ (10552,'1953-03-25','Kazuhito','Shiratori','M','1998-08-18'),
553
+ (10553,'1964-02-08','Rajmohan','Wallrath','F','1985-10-27'),
554
+ (10554,'1958-08-01','Dines','Gerlach','M','1990-11-28'),
555
+ (10555,'1962-09-25','Vitaly','Picci','M','1989-11-06'),
556
+ (10556,'1962-12-31','JoAnna','Taubman','F','1992-04-15'),
557
+ (10557,'1957-08-23','Sashi','Karlin','M','1986-03-31'),
558
+ (10558,'1964-10-08','Hisao','Famili','M','1990-04-06'),
559
+ (10559,'1956-01-18','Arumugam','Comellas','F','1988-01-06'),
560
+ (10560,'1960-05-01','Yinlin','Esteva','F','1988-09-28'),
561
+ (10561,'1958-09-07','Serge','Joslin','F','1990-12-15'),
562
+ (10562,'1963-04-17','Shuky','Pearson','M','1996-07-06'),
563
+ (10563,'1956-10-27','Mohit','Spelt','M','1992-09-29'),
564
+ (10564,'1955-04-14','Jianhao','Thisen','M','1986-05-08'),
565
+ (10565,'1961-11-05','Yishay','Harnett','M','1992-01-09'),
566
+ (10566,'1958-01-30','Jianhui','Zuberek','F','1988-03-19'),
567
+ (10567,'1957-05-21','Dietrich','Journel','M','1992-10-18'),
568
+ (10568,'1953-12-02','Gao','Poulakidas','F','1989-02-14'),
569
+ (10569,'1962-12-03','Sreenivas','Bashian','M','1987-03-13'),
570
+ (10570,'1958-10-30','Alassane','Morrin','M','1985-05-05'),
571
+ (10571,'1963-12-10','Fun','Varman','M','1985-02-24'),
572
+ (10572,'1960-10-10','Cordelia','Axelband','M','1988-02-16'),
573
+ (10573,'1964-02-23','Tetsushi','Speel','F','1993-07-07'),
574
+ (10574,'1960-11-11','Salvador','Olano','F','1990-02-16'),
575
+ (10575,'1954-06-29','Theirry','Yeung','M','1988-10-04'),
576
+ (10576,'1957-08-23','Xiaoqiu','Krychniak','M','1988-05-17'),
577
+ (10577,'1957-09-20','Ennio','Schmiedel','M','1990-08-18'),
578
+ (10578,'1958-07-18','Shigeaki','Shanbhogue','F','1989-11-24'),
579
+ (10579,'1958-07-17','Aiman','Stentiford','M','1985-09-01'),
580
+ (10580,'1956-05-28','Christoper','Rehfuss','M','1987-09-11'),
581
+ (10581,'1956-11-20','Odinaldo','Prochazka','F','1988-02-09'),
582
+ (10582,'1960-05-08','Shmuel','Juneja','M','1986-06-22'),
583
+ (10583,'1964-03-03','Prasadram','Stille','F','1985-02-14'),
584
+ (10584,'1961-07-12','Mana','Papastamatiou','M','1986-02-17'),
585
+ (10585,'1963-11-10','Sajjad','Willoner','F','1986-01-05'),
586
+ (10586,'1954-06-23','Kirk','Vuskovic','M','1992-02-04'),
587
+ (10587,'1962-03-04','Behnaam','Srimani','F','1989-09-20'),
588
+ (10588,'1956-07-30','Shigeo','Dulay','F','1987-01-28'),
589
+ (10589,'1958-09-25','Subbu','Sanella','M','1994-01-26'),
590
+ (10590,'1963-10-01','Yongqiao','Kalloufi','M','1986-04-09'),
591
+ (10591,'1952-12-22','Hidde','Hettesheimer','F','1987-06-18'),
592
+ (10592,'1964-08-01','Almudena','Alvarado','M','1990-06-05'),
593
+ (10593,'1952-07-24','Falguni','Kenevan','M','1990-09-12'),
594
+ (10594,'1960-10-22','Kiyokazu','Whitcomb','M','1988-04-02'),
595
+ (10595,'1964-12-10','Giri','Undy','M','1989-11-24'),
596
+ (10596,'1954-01-24','Sanjit','Coors','M','1995-04-01'),
597
+ (10597,'1961-05-07','Lucien','Schaad','F','1990-04-01'),
598
+ (10598,'1957-11-10','Margo','Gronowski','M','1989-03-31'),
599
+ (10599,'1956-10-15','Seshu','Crelier','F','1989-03-17'),
600
+ (10600,'1963-08-17','Emran','Rettelbach','F','1985-12-22'),
601
+ (10601,'1959-10-23','Barton','Usdin','M','1994-08-29'),
602
+ (10602,'1959-11-27','Douadi','Wossner','M','1988-03-12'),
603
+ (10603,'1955-08-02','Wayne','Restivo','M','1995-07-20'),
604
+ (10604,'1957-04-24','Susanna','Brizzi','M','1990-04-07'),
605
+ (10605,'1956-05-21','Moti','Wixon','F','1985-04-29'),
606
+ (10606,'1964-03-04','Toshiki','Marakhovsky','M','1987-05-02'),
607
+ (10607,'1964-11-30','Rosalyn','Hambrick','F','1990-06-18'),
608
+ (10608,'1955-07-11','Adhemar','Talmor','F','1986-05-25'),
609
+ (10609,'1956-10-02','Janche','Zhang','M','1994-12-03'),
610
+ (10610,'1955-06-24','Irena','Roccetti','F','1996-04-11'),
611
+ (10611,'1964-05-11','Karsten','Blokdijk','M','1989-09-16'),
612
+ (10612,'1959-01-01','Gil','Peroz','M','1991-09-02'),
613
+ (10613,'1960-11-04','Inderjeet','Jansen','M','1990-09-01'),
614
+ (10614,'1953-07-11','Gila','Ozeri','F','1990-03-03'),
615
+ (10615,'1955-08-30','Keung','Delgrande','M','1996-03-10'),
616
+ (10616,'1958-05-05','Tommaso','Marwedel','F','1988-03-10'),
617
+ (10617,'1955-01-26','Hidekazu','Angel','F','1985-03-29'),
618
+ (10618,'1963-08-03','Ranga','Yeung','F','1988-11-27'),
619
+ (10619,'1961-04-27','Vivian','Kusakabe','M','1989-03-24'),
620
+ (10620,'1959-11-23','Marit','Veeraraghavan','M','1990-11-10'),
621
+ (10621,'1962-02-03','Hinrich','Siepmann','F','1991-06-23'),
622
+ (10622,'1959-09-15','Turgut','Narlikar','M','1989-01-28'),
623
+ (10623,'1953-07-11','Aleksander','Danlos','F','1987-03-07'),
624
+ (10624,'1955-12-19','Sham','Gyorkos','F','1990-05-07'),
625
+ (10625,'1958-02-08','Leszek','Petereit','F','1985-10-31'),
626
+ (10626,'1957-06-26','Danil','Deverell','M','1996-12-03'),
627
+ (10627,'1962-10-06','Shigeu','Itzfeldt','M','1991-11-07'),
628
+ (10628,'1954-04-18','Krisda','Krogh','M','1985-09-11'),
629
+ (10629,'1954-03-23','Lalit','Francisci','F','1986-01-30'),
630
+ (10630,'1954-08-10','Bezalel','Katzenelson','F','1993-06-26'),
631
+ (10631,'1955-05-17','Inderjeet','Chaudhuri','M','1988-02-16'),
632
+ (10632,'1960-04-05','Yoshimitsu','Velardi','F','1985-07-25'),
633
+ (10633,'1957-02-09','Sorina','Herber','M','1985-06-17'),
634
+ (10634,'1954-08-01','Nahid','Chepyzhov','M','1990-11-11'),
635
+ (10635,'1960-10-29','Toney','Angiulli','F','1991-09-22'),
636
+ (10636,'1955-08-25','Saeko','Porotnikoff','F','1994-11-16'),
637
+ (10637,'1954-07-11','Heejo','Frolund','M','1993-07-11'),
638
+ (10638,'1960-11-04','Jenwei','Borovoy','M','1991-05-19'),
639
+ (10639,'1953-04-18','Pramod','Erol','M','1992-10-25'),
640
+ (10640,'1958-11-09','Anneke','Meszaros','M','1992-12-04'),
641
+ (10641,'1953-12-24','Guozhong','Zucker','M','1993-03-21'),
642
+ (10642,'1955-12-19','Hirochika','Narlikar','M','1986-08-06'),
643
+ (10643,'1957-07-25','Slavian','Keirsey','M','1987-11-11'),
644
+ (10644,'1962-02-22','Pranas','Benaini','M','1985-05-29'),
645
+ (10645,'1957-03-01','Fumiyo','Esposito','M','1988-03-01'),
646
+ (10646,'1957-11-24','Uri','Chorvat','M','1988-08-07'),
647
+ (10647,'1960-01-12','Tesuro','Bahk','M','1995-09-28'),
648
+ (10648,'1962-01-19','Marlo','Ratnaker','F','1988-02-16'),
649
+ (10649,'1956-03-25','Vitali','Welham','M','1997-09-10'),
650
+ (10650,'1959-04-09','Hongzhu','Chepyzhov','M','1992-10-04'),
651
+ (10651,'1958-12-31','Zijian','Maginnis','M','1985-08-07'),
652
+ (10652,'1960-04-25','Danai','Chachaty','M','1990-02-12'),
653
+ (10653,'1953-06-16','Otmar','Feinberg','M','1987-04-30'),
654
+ (10654,'1960-03-17','Nahla','Castellani','F','1987-05-28'),
655
+ (10655,'1959-02-02','Remko','Dalton','F','1985-07-14'),
656
+ (10656,'1962-06-18','Sanjay','Litzkow','M','1988-06-21'),
657
+ (10657,'1958-03-09','Juichirou','Kitsuregawa','M','1989-12-31'),
658
+ (10658,'1956-11-21','Junsik','Rijckaert','F','1994-04-29'),
659
+ (10659,'1956-12-09','Dinah','Shackel','F','1991-09-20'),
660
+ (10660,'1964-01-03','Jouko','Kolinko','M','1988-08-12'),
661
+ (10661,'1956-04-07','Ottavia','Giarratana','F','1988-01-12'),
662
+ (10662,'1959-10-17','Arto','Serra','F','1986-09-28'),
663
+ (10663,'1965-01-09','Teunis','Noriega','M','1993-01-23'),
664
+ (10664,'1962-06-02','Xumin','Peck','M','1989-12-24'),
665
+ (10665,'1964-07-28','Qingxiang','Snyers','M','1988-01-23'),
666
+ (10666,'1964-10-03','Zhonghua','Reeker','M','1989-05-20'),
667
+ (10667,'1955-08-05','Makato','Cusworth','F','1990-06-25'),
668
+ (10668,'1959-03-20','Maren','Granlund','F','1989-09-25'),
669
+ (10669,'1956-05-30','Yurij','Iisaka','F','1995-06-09'),
670
+ (10670,'1962-04-23','Shunichi','McAffer','M','1988-03-23'),
671
+ (10671,'1953-06-12','Parviz','Rebaine','M','1987-01-08'),
672
+ (10672,'1954-03-23','Bluma','Zeilberger','M','1986-07-13'),
673
+ (10673,'1959-12-26','Hyuckchul','Casperson','M','1990-03-01'),
674
+ (10674,'1961-03-03','Abdelaziz','Bisiani','M','1988-09-16'),
675
+ (10675,'1960-03-26','Ymte','Waschkowski','F','1991-11-05'),
676
+ (10676,'1953-08-26','Valeri','Danley','F','1986-03-20'),
677
+ (10677,'1963-02-20','Alejandra','Perng','F','1996-10-07'),
678
+ (10678,'1958-08-21','Chriss','Gide','F','1987-08-02'),
679
+ (10679,'1956-09-25','Neven','Brender','M','1990-05-13'),
680
+ (10680,'1962-10-11','Kish','Honglei','M','1986-06-20'),
681
+ (10681,'1964-12-25','Florina','Garnier','M','1992-10-25'),
682
+ (10682,'1956-07-04','Bedir','Haumacher','M','1990-11-09'),
683
+ (10683,'1952-06-18','Guiseppe','Stranks','F','1993-09-07'),
684
+ (10684,'1956-01-23','Aimee','Tokunaga','F','1999-10-28'),
685
+ (10685,'1959-01-14','Zongyan','Cusworth','M','1990-04-24'),
686
+ (10686,'1963-05-25','Avishai','Azadmanesh','F','1987-05-17'),
687
+ (10687,'1961-07-25','Leon','Kaiser','F','1990-03-13'),
688
+ (10688,'1964-02-28','Xiaopeng','Lanphier','F','1985-03-25'),
689
+ (10689,'1958-09-13','Satoru','Otillio','M','1988-08-05'),
690
+ (10690,'1962-09-06','Matt','Jumpertz','F','1989-08-22'),
691
+ (10691,'1957-11-18','Denny','Setia','M','1989-09-17'),
692
+ (10692,'1960-08-11','Larisa','Bage','M','1993-03-22'),
693
+ (10693,'1953-12-14','Berhard','Daescu','F','1986-01-08'),
694
+ (10694,'1955-12-16','Rildo','Straney','M','1988-01-26'),
695
+ (10695,'1962-08-30','Zorica','Acton','M','1989-08-05'),
696
+ (10696,'1952-03-23','Unal','Fendler','M','1991-09-09'),
697
+ (10697,'1958-04-09','Bluma','Hiltgen','M','1998-03-04'),
698
+ (10698,'1959-09-13','Barton','Engberts','M','1994-12-08'),
699
+ (10699,'1964-02-02','Hatim','Deverell','M','1985-11-17'),
700
+ (10700,'1962-11-30','Angel','Mondadori','M','1987-04-02'),
701
+ (10701,'1961-09-30','Hyuncheol','Zolotykh','M','1986-10-27'),
702
+ (10702,'1952-11-25','Bader','Szemeredi','M','1985-07-23'),
703
+ (10703,'1958-06-13','Giri','Baumann','F','1996-05-12'),
704
+ (10704,'1960-04-08','Yolla','Kropatsch','M','1988-07-08'),
705
+ (10705,'1963-06-17','Hironobu','Wynblatt','M','1990-07-18'),
706
+ (10706,'1959-10-11','Gonzalo','Eldridge','M','1989-12-17'),
707
+ (10707,'1957-06-04','Moty','Trystram','M','1990-12-24'),
708
+ (10708,'1959-07-02','Aral','Erman','M','1996-05-18'),
709
+ (10709,'1961-01-06','Jiafu','Mateescu','F','1986-02-02'),
710
+ (10710,'1962-12-25','Sorina','Kermarrec','M','1992-01-10'),
711
+ (10711,'1963-06-20','Arvind','DuBourdieux','F','1991-06-21'),
712
+ (10712,'1952-04-12','Uma','Koprowski','F','1994-08-18'),
713
+ (10713,'1959-04-14','Jagoda','Naumovich','M','1986-04-26'),
714
+ (10714,'1960-09-28','Aran','Sadowsky','M','1997-03-11'),
715
+ (10715,'1959-11-21','Goa','Poehlman','M','1995-09-25'),
716
+ (10716,'1963-10-08','Aiman','Constantine','M','1985-08-20'),
717
+ (10717,'1956-01-27','Serap','Tasistro','M','1987-06-27'),
718
+ (10718,'1955-12-19','Adib','Rullman','M','1988-07-21'),
719
+ (10719,'1959-09-26','Guenter','Karunanithi','F','1995-09-05'),
720
+ (10720,'1956-06-17','Odinaldo','Kruskal','M','1985-08-01'),
721
+ (10721,'1964-07-12','Bernd','Redmiles','F','1995-03-17'),
722
+ (10722,'1960-10-03','Dung','Gornas','M','1989-01-17'),
723
+ (10723,'1964-01-14','Eckart','Harnett','F','1993-05-26'),
724
+ (10724,'1957-10-06','Aluzio','Narlikar','M','1991-11-04'),
725
+ (10725,'1958-10-22','Garnet','Isard','M','1990-09-08'),
726
+ (10726,'1954-01-11','Zita','Minakawa','F','1985-09-01'),
727
+ (10727,'1959-06-16','Saeed','Kitai','F','1991-01-08'),
728
+ (10728,'1958-11-17','Ugo','Maliniak','F','1989-12-09'),
729
+ (10729,'1961-05-24','Percy','Lorho','F','1986-04-20'),
730
+ (10730,'1962-07-22','Mohit','Janetzko','M','1988-11-24'),
731
+ (10731,'1952-11-17','Fumitaka','Peak','M','1987-02-20'),
732
+ (10732,'1962-04-22','Morris','Andreotta','F','1991-03-10'),
733
+ (10733,'1962-04-06','Sangeeta','Rodham','F','1996-02-20'),
734
+ (10734,'1954-07-06','Sachar','Erdi','M','1985-04-03'),
735
+ (10735,'1964-09-12','Morrie','Gewali','M','1985-10-29'),
736
+ (10736,'1962-07-09','Gurbir','Hellwagner','F','1991-09-26'),
737
+ (10737,'1960-10-10','Vincent','Schwartzbauer','M','1990-10-15'),
738
+ (10738,'1963-10-08','Rosita','Oppitz','M','1988-01-17'),
739
+ (10739,'1961-02-11','Gor','Iacovou','F','1985-03-12'),
740
+ (10740,'1956-04-19','Suzette','Sadowski','M','1995-08-15'),
741
+ (10741,'1954-01-02','Sven','Huttel','F','1989-01-06'),
742
+ (10742,'1955-03-13','Shim','Wiegley','M','1991-01-03'),
743
+ (10743,'1963-12-26','Kiyomitsu','Peltason','M','1985-06-10'),
744
+ (10744,'1957-02-17','Yaghout','Syang','M','1985-12-29'),
745
+ (10745,'1953-10-23','Poorav','Ranze','F','1987-05-26'),
746
+ (10746,'1958-12-29','Kolar','Usery','F','1990-08-31'),
747
+ (10747,'1955-02-02','Falguni','Khalid','M','1990-10-08'),
748
+ (10748,'1964-04-12','Yuchang','Francisci','F','1990-08-14'),
749
+ (10749,'1955-08-21','King','Brendel','M','1985-09-26'),
750
+ (10750,'1953-06-14','Roddy','Demeyer','F','1991-08-04'),
751
+ (10751,'1952-12-02','Jordanka','Ushiama','M','1987-04-15'),
752
+ (10752,'1964-07-18','Byong','Conde','M','1993-05-28'),
753
+ (10753,'1958-09-30','Pradeep','Harbusch','F','1985-05-17'),
754
+ (10754,'1956-09-08','Chenyi','Feinberg','M','1988-01-11'),
755
+ (10755,'1962-06-10','Odysseas','Ressouche','M','1988-06-16'),
756
+ (10756,'1958-06-24','Paddy','Brizzi','M','1995-11-21'),
757
+ (10757,'1961-01-11','Florina','Simkin','M','1986-01-06'),
758
+ (10758,'1962-11-26','Fumiyo','Boyle','F','1988-02-06'),
759
+ (10759,'1956-04-12','JiYoung','Chenney','M','1991-12-04'),
760
+ (10760,'1963-05-27','Phillip','Dratva','M','1994-06-15'),
761
+ (10761,'1959-04-10','Sumali','Liedekerke','M','1992-05-30'),
762
+ (10762,'1965-01-19','Lech','Himler','M','1992-01-21'),
763
+ (10763,'1962-04-15','Giap','Bolsens','M','1987-02-23'),
764
+ (10764,'1953-01-12','Yunming','Beetstra','F','1989-11-27'),
765
+ (10765,'1961-02-24','Goetz','Norsworthy','M','1994-05-07'),
766
+ (10766,'1964-06-10','Nathalie','Standera','M','1996-08-05'),
767
+ (10767,'1954-02-28','Monique','Doering','F','1987-06-17'),
768
+ (10768,'1955-06-24','Ishfaq','Candan','M','1985-07-04'),
769
+ (10769,'1962-11-02','Vishv','Bouloucos','M','1987-08-16'),
770
+ (10770,'1956-06-18','Bedir','Perry','F','1987-12-25'),
771
+ (10771,'1960-05-10','Guiseppe','Kleiser','F','1989-11-08'),
772
+ (10772,'1956-01-21','Munehiro','Dayana','M','1987-06-29'),
773
+ (10773,'1960-07-11','Avishai','Bahr','F','1985-12-01'),
774
+ (10774,'1958-10-03','Jacqueline','Masand','M','1990-01-26'),
775
+ (10775,'1956-03-12','Xiaoheng','Sluis','M','1988-12-09'),
776
+ (10776,'1958-01-27','Mahmut','Skafidas','F','1986-03-16'),
777
+ (10777,'1955-08-11','Mizuhito','Kemmerer','F','1988-07-05'),
778
+ (10778,'1953-03-13','Selwyn','Merey','M','1986-07-04'),
779
+ (10779,'1961-07-09','Mori','Yavatkar','F','1988-01-11'),
780
+ (10780,'1955-09-12','Goncalo','Staudhammer','M','1989-11-06'),
781
+ (10781,'1958-09-19','Patricio','Leuchs','M','1991-02-04'),
782
+ (10782,'1952-09-18','Kish','Perna','F','1991-10-21'),
783
+ (10783,'1963-11-13','Moty','Kenevan','M','1994-05-15'),
784
+ (10784,'1957-01-27','Weijing','Bottner','F','1987-05-12'),
785
+ (10785,'1963-02-09','Keiichiro','Marzano','M','1994-11-11'),
786
+ (10786,'1964-05-19','Patricia','dAstous','M','1989-03-14'),
787
+ (10787,'1958-07-10','Shiv','Neimat','F','1991-04-16'),
788
+ (10788,'1963-06-28','Frazer','Ullian','M','1993-12-13'),
789
+ (10789,'1964-05-19','Aruna','Journel','F','1987-02-02'),
790
+ (10790,'1962-04-01','Yurij','Schonegge','M','1990-07-03'),
791
+ (10791,'1954-05-27','Tadahiko','Sgarro','M','1988-07-30'),
792
+ (10792,'1962-09-04','Chinya','Birdsall','M','1985-08-10'),
793
+ (10793,'1960-08-27','Oksana','Roisin','F','1987-10-02'),
794
+ (10794,'1962-06-26','Teunis','Berztiss','M','1992-03-29'),
795
+ (10795,'1954-12-14','Supot','Naudin','M','1985-05-21'),
796
+ (10796,'1959-06-30','Khoa','Rousseau','M','1990-11-08'),
797
+ (10797,'1956-10-04','Goetz','Hiyoshi','F','1988-08-21'),
798
+ (10798,'1961-07-18','Elliott','Bednarek','M','1992-02-09'),
799
+ (10799,'1957-11-21','Gad','Griswold','F','1988-06-06'),
800
+ (10800,'1961-12-15','Yuchang','Matzke','M','1993-05-20'),
801
+ (10801,'1953-03-05','Uinam','Zschoche','M','1994-06-27'),
802
+ (10802,'1960-10-27','Masato','Setlzner','M','1985-08-24'),
803
+ (10803,'1952-09-15','Katsuyuki','Velasco','F','1988-04-20'),
804
+ (10804,'1964-02-20','Terresa','Benantar','M','1996-04-18'),
805
+ (10805,'1959-09-12','Kerhong','Bernick','F','1987-05-26'),
806
+ (10806,'1958-10-17','Giap','Matzel','M','1993-04-25'),
807
+ (10807,'1964-06-23','Munehiro','Zallocco','F','1986-10-23'),
808
+ (10808,'1955-09-11','Chenxi','Leijenhorst','M','1987-03-07'),
809
+ (10809,'1962-01-06','Shim','Feldhoffer','F','1987-03-04'),
810
+ (10810,'1957-10-23','Lijie','Lunn','F','1994-09-07'),
811
+ (10811,'1954-06-29','Ashish','Fortenbacher','M','1997-07-08'),
812
+ (10812,'1957-09-14','Berthier','Menhoudj','F','1987-08-11'),
813
+ (10813,'1954-07-04','Shalesh','Shumilov','M','1990-04-27'),
814
+ (10814,'1952-09-17','Nidapan','Dymetman','F','1993-07-17'),
815
+ (10815,'1960-11-12','Renny','Pramanik','M','1994-04-19'),
816
+ (10816,'1958-02-24','Morris','Caine','F','1989-06-27'),
817
+ (10817,'1958-10-02','Uri','Rullman','F','1990-12-26'),
818
+ (10818,'1958-12-20','Huan','Monarch','M','1995-10-22'),
819
+ (10819,'1957-02-19','Pascal','Sooriamurthi','M','1986-08-02'),
820
+ (10820,'1956-11-12','Baocai','Pena','F','1986-02-23'),
821
+ (10821,'1959-04-14','Irena','Schurmann','M','1987-03-12'),
822
+ (10822,'1956-08-02','Masaru','Passino','F','1986-01-11'),
823
+ (10823,'1956-06-13','Arfst','Mikschl','M','1995-01-02'),
824
+ (10824,'1958-09-20','Kirk','Kalsbeek','M','1985-03-18'),
825
+ (10825,'1958-03-27','Fan','Fairtlough','M','1985-12-30'),
826
+ (10826,'1952-12-06','Arnd','Anandan','M','1993-01-22'),
827
+ (10827,'1953-09-25','Willard','Danley','M','1996-11-07'),
828
+ (10828,'1962-10-12','Godehard','Gammage','M','1986-02-14'),
829
+ (10829,'1955-07-11','Alper','Narahara','F','1993-02-22'),
830
+ (10830,'1954-08-17','Fen','Fiebach','M','1991-08-24'),
831
+ (10831,'1953-10-11','Toong','Driscoll','M','1996-06-21'),
832
+ (10832,'1964-08-29','Hidde','Bergere','F','1986-10-11'),
833
+ (10833,'1953-04-12','Krisda','Gecseg','F','1989-02-08'),
834
+ (10834,'1954-12-16','Huiqun','Rajcani','M','1990-11-24'),
835
+ (10835,'1952-11-23','Tomoyuki','Kermarrec','M','1985-07-28'),
836
+ (10836,'1953-07-15','Jianhua','Leivant','F','1985-07-26'),
837
+ (10837,'1957-02-06','Chuanti','Karlin','M','1986-01-14'),
838
+ (10838,'1957-10-19','Deniz','Ramras','M','1990-04-11'),
839
+ (10839,'1964-04-02','Gurbir','Katiyar','M','1991-10-05'),
840
+ (10840,'1961-04-26','Mohammad','Koshino','M','1993-06-04'),
841
+ (10841,'1961-10-14','Pranav','Lieberherr','M','1990-04-21'),
842
+ (10842,'1961-08-29','Berni','Sanella','F','1986-07-14'),
843
+ (10843,'1961-09-05','Honesty','Smeets','M','1990-04-26'),
844
+ (10844,'1954-02-03','Dipayan','Koprowski','M','1987-03-03'),
845
+ (10845,'1960-12-24','Hidde','Tasistro','F','1988-06-30'),
846
+ (10846,'1952-06-27','Tokuyasu','Serre','M','1994-01-26'),
847
+ (10847,'1952-03-04','Theirry','Danley','M','1986-07-25'),
848
+ (10848,'1954-07-16','Fen','Bratsberg','F','1985-04-20'),
849
+ (10849,'1953-03-05','Makato','Mayerwieser','M','1995-06-25'),
850
+ (10850,'1963-01-01','Florina','Schapire','F','1990-04-22'),
851
+ (10851,'1959-11-15','Piyawadee','Copas','M','1994-11-21'),
852
+ (10852,'1959-11-24','Hercules','Munck','F','1996-03-21'),
853
+ (10853,'1964-03-22','Yoshinari','Kalloufi','F','1993-05-03'),
854
+ (10854,'1954-08-11','Jagoda','Nannarelli','M','1998-07-13'),
855
+ (10855,'1957-08-07','Kwangho','Reinhart','M','1991-08-05'),
856
+ (10856,'1964-03-13','Sreenivas','Peck','F','1986-12-31'),
857
+ (10857,'1957-06-11','Fusako','Stenning','F','1990-04-04'),
858
+ (10858,'1952-10-01','Kenroku','Gonthier','M','1996-08-15'),
859
+ (10859,'1961-10-16','King','Bernini','F','1993-01-03'),
860
+ (10860,'1961-11-05','Gino','Werthner','M','1992-03-11'),
861
+ (10861,'1962-02-27','Howell','Baek','M','1989-06-10'),
862
+ (10862,'1956-01-19','Zhenbing','Kadhim','F','1985-07-23'),
863
+ (10863,'1962-08-05','Byong','Bhattacharjee','M','1985-12-25'),
864
+ (10864,'1958-01-07','Elliott','Spieker','F','1985-09-04'),
865
+ (10865,'1961-03-16','Danco','Etalle','M','1991-04-19'),
866
+ (10866,'1959-12-13','Fayez','Yeung','F','1990-12-27'),
867
+ (10867,'1952-10-01','Billur','Gyorkos','M','1986-10-08'),
868
+ (10868,'1959-05-11','Houman','Unno','F','1990-03-20'),
869
+ (10869,'1962-10-09','Guangming','Jonsson','F','1996-03-15'),
870
+ (10870,'1956-07-23','Shahid','Leppanen','F','1988-01-13'),
871
+ (10871,'1952-10-24','Aram','Gilg','M','1989-02-15'),
872
+ (10872,'1952-02-21','Karoline','Speel','F','1990-09-06'),
873
+ (10873,'1952-07-09','Sukumar','Wegerle','M','1994-03-23'),
874
+ (10874,'1958-01-18','Mahmut','Borstler','M','1986-04-22'),
875
+ (10875,'1958-10-27','Filipp','Suri','F','1988-05-19'),
876
+ (10876,'1955-08-05','Vincent','Papastamatiou','F','1995-01-29'),
877
+ (10877,'1964-09-11','Subir','Biron','M','1986-06-06'),
878
+ (10878,'1952-06-13','Lakshmi','Deville','M','1988-02-25'),
879
+ (10879,'1953-08-18','Muzhong','Chleq','F','1985-08-15'),
880
+ (10880,'1962-02-11','Weiye','Nitsche','M','1986-04-20'),
881
+ (10881,'1959-06-13','Katsuo','Miake','M','1996-04-18'),
882
+ (10882,'1953-11-01','Fun','Heuser','M','1994-11-29'),
883
+ (10883,'1952-07-30','Shimshon','Champarnaud','M','1987-11-07'),
884
+ (10884,'1958-03-07','Teunis','Kleiser','F','1993-04-15'),
885
+ (10885,'1953-05-06','Rayond','Cronau','M','1991-08-19'),
886
+ (10886,'1964-09-30','Sushant','Begiun','M','1995-03-26'),
887
+ (10887,'1953-01-16','Lunjin','DeMori','M','1989-03-16'),
888
+ (10888,'1959-03-15','Kwangho','Dredge','F','1987-06-28'),
889
+ (10889,'1956-06-21','Cheong','Coors','F','1987-08-11'),
890
+ (10890,'1963-04-13','Ramzi','Furudate','M','1988-04-21'),
891
+ (10891,'1963-12-15','Susanne','Jiang','F','1990-12-07'),
892
+ (10892,'1959-12-13','Kazunori','Vieth','M','1990-04-11'),
893
+ (10893,'1960-01-30','Danil','Kropatsch','M','1989-08-23'),
894
+ (10894,'1958-08-21','Suebskul','Srimani','F','1991-07-18'),
895
+ (10895,'1952-03-21','Vishwani','Petersohn','M','1986-04-26'),
896
+ (10896,'1964-04-12','Adil','Taubenfeld','M','1994-10-08'),
897
+ (10897,'1958-05-27','Arno','Kumaresan','F','1986-04-09'),
898
+ (10898,'1961-11-10','Munenori','Markovitch','F','1986-04-10'),
899
+ (10899,'1962-05-11','Valery','Rousseau','F','1989-10-06'),
900
+ (10900,'1955-07-18','Ferdinand','Prenel','F','1995-09-07'),
901
+ (10901,'1959-06-12','Chrisa','Narahara','M','1992-10-30'),
902
+ (10902,'1964-05-09','Inderjeet','Perly','M','1990-04-22'),
903
+ (10903,'1958-06-04','Visit','Nyanchama','M','1989-02-14'),
904
+ (10904,'1959-08-28','Debatosh','Colorni','F','1993-04-16'),
905
+ (10905,'1961-04-30','Jianhui','Aloia','M','1985-02-28'),
906
+ (10906,'1952-02-06','Munehiro','Carrere','F','1994-01-20'),
907
+ (10907,'1963-09-26','JiYoung','Luks','M','1988-12-25'),
908
+ (10908,'1961-11-27','Rajmohan','Koblick','M','1985-10-08'),
909
+ (10909,'1954-11-11','Georgi','Atchley','M','1985-04-21'),
910
+ (10910,'1958-11-11','Arco','Jervis','M','1989-07-13'),
911
+ (10911,'1959-07-22','Shay','Casley','M','1988-06-25'),
912
+ (10912,'1952-07-27','Oscal','Fasbender','M','1986-04-23'),
913
+ (10913,'1952-09-03','Narain','Thummel','M','1992-06-25'),
914
+ (10914,'1956-04-26','Mizuhito','Prochazka','M','1998-03-24'),
915
+ (10915,'1961-03-11','Valery','Skafidas','M','1987-12-06'),
916
+ (10916,'1962-01-03','Make','Spataro','M','1996-07-01'),
917
+ (10917,'1956-05-10','Tesuya','Slaats','F','1987-12-03'),
918
+ (10918,'1954-12-26','Susumu','Reghbati','M','1985-12-13'),
919
+ (10919,'1961-09-04','Reinhard','Lindenbaum','M','1987-04-19'),
920
+ (10920,'1955-04-08','Ronghao','Narahara','M','1991-07-09'),
921
+ (10921,'1955-07-20','Mara','Bahi','F','1986-07-27'),
922
+ (10922,'1953-10-27','Kyoichi','Wossner','M','1992-08-09'),
923
+ (10923,'1957-04-29','Younwoo','Maquelin','M','1990-04-09'),
924
+ (10924,'1954-04-27','Hironoby','Atchley','F','1988-08-14'),
925
+ (10925,'1960-02-13','Heng','Waterhouse','F','1986-09-04'),
926
+ (10926,'1954-10-13','Leni','Eppinger','F','1990-04-30'),
927
+ (10927,'1953-03-13','Gal','Scallan','M','1985-10-26'),
928
+ (10928,'1961-11-01','Udaiprakash','Schmezko','M','1991-04-07'),
929
+ (10929,'1958-10-26','Sumali','Arlazarov','M','1991-04-15'),
930
+ (10930,'1954-01-13','Arch','Minakawa','M','1990-08-09'),
931
+ (10931,'1963-06-30','Abdulla','Beutelspacher','F','1992-06-14'),
932
+ (10932,'1955-11-19','Avishai','Picci','F','1994-09-09'),
933
+ (10933,'1965-01-24','Juyoung','Seghrouchni','F','1993-08-02'),
934
+ (10934,'1960-05-21','Bartek','Strooper','F','1993-11-11'),
935
+ (10935,'1961-08-09','Morris','Famili','M','1990-03-09'),
936
+ (10936,'1953-04-08','Mountaz','Schicker','F','1987-10-27'),
937
+ (10937,'1964-09-11','Anyuan','Nanard','M','1987-08-29'),
938
+ (10938,'1958-05-11','Shaowei','Iisaku','F','1985-09-24'),
939
+ (10939,'1964-07-13','Matk','Akazan','M','1990-11-01'),
940
+ (10940,'1953-01-07','Aleksander','Fioravanti','F','1994-12-02'),
941
+ (10941,'1960-08-26','Katsuyuki','Norsworthy','M','1993-08-22'),
942
+ (10942,'1952-08-08','Toshimitsu','Larfeldt','F','1989-09-08'),
943
+ (10943,'1955-11-19','Berna','Skafidas','M','1988-02-19'),
944
+ (10944,'1952-05-25','Remko','Zyda','M','1991-05-24'),
945
+ (10945,'1959-09-25','Kazuhiro','Kushnir','F','1990-07-04'),
946
+ (10946,'1956-09-08','Shaz','Kabayashi','M','1996-02-04'),
947
+ (10947,'1954-09-29','Gor','Usery','F','1995-11-16'),
948
+ (10948,'1952-12-23','Shigehito','Brodie','M','1996-09-30'),
949
+ (10949,'1953-08-14','Shigeichiro','Wroclawski','F','1990-03-13'),
950
+ (10950,'1958-12-07','Sushant','Staylopatis','M','1996-06-08'),
951
+ (10951,'1962-01-20','Marco','Iisaku','M','1989-07-06'),
952
+ (10952,'1958-08-26','Inderjeet','Bharadwaj','M','1986-07-22'),
953
+ (10953,'1956-06-23','Jahangir','Laventhal','F','1987-02-12'),
954
+ (10954,'1964-11-16','Ranga','Burnard','F','1990-08-07'),
955
+ (10955,'1959-02-24','Urs','Danley','F','1986-09-27'),
956
+ (10956,'1955-02-02','Arno','Picel','M','1992-06-29'),
957
+ (10957,'1961-06-06','Duke','Schnabel','M','1988-01-23'),
958
+ (10958,'1958-11-07','Huican','Katalagarianos','M','1988-11-27'),
959
+ (10959,'1956-06-19','Kerryn','Vigier','M','1994-03-01'),
960
+ (10960,'1959-10-24','Billur','Braunschweig','M','1988-03-14'),
961
+ (10961,'1957-03-28','Weiwu','Choobineh','M','1986-05-14'),
962
+ (10962,'1956-08-23','Naraig','Kugler','F','1986-12-16'),
963
+ (10963,'1957-04-15','Hatsukazu','Swist','M','1988-01-14'),
964
+ (10964,'1962-04-02','Takushi','Bolsens','F','1990-10-11'),
965
+ (10965,'1955-07-10','Eckart','Braunschweig','M','1986-07-29'),
966
+ (10966,'1962-07-04','Danel','Pardalos','M','1989-11-07'),
967
+ (10967,'1962-10-01','Eran','Adachi','M','1993-08-01'),
968
+ (10968,'1961-03-19','Lakshmi','Kolinko','M','1985-08-11'),
969
+ (10969,'1954-09-05','Premal','Noriega','M','1988-08-22'),
970
+ (10970,'1962-08-24','Gen','Tiemann','F','1994-09-16'),
971
+ (10971,'1955-02-08','Isamu','Vadhan','M','1991-07-30'),
972
+ (10972,'1961-10-05','Fumiko','Asser','F','1987-06-06'),
973
+ (10973,'1961-10-02','Valdiodio','Raczkowsky','M','1989-03-05'),
974
+ (10974,'1952-03-07','Muneo','Papsdorf','M','1985-11-25'),
975
+ (10975,'1962-07-27','Peternela','Birnbaum','F','1986-10-31'),
976
+ (10976,'1963-01-27','Hitomi','Valette','F','1992-12-06'),
977
+ (10977,'1957-03-19','Toong','Murrill','M','1987-08-10'),
978
+ (10978,'1962-09-24','Huiqun','Bellone','M','1985-05-18'),
979
+ (10979,'1959-09-11','Elrique','Raney','F','1986-01-27'),
980
+ (10980,'1963-11-10','Filipp','Munawer','M','1989-01-04'),
981
+ (10981,'1956-07-22','Sugwoo','Dulin','F','1989-01-03'),
982
+ (10982,'1964-02-27','Yishay','Decleir','M','1989-11-11'),
983
+ (10983,'1961-08-09','Somnath','Parascandalo','F','1988-02-22'),
984
+ (10984,'1962-11-10','Pranjal','Billawala','F','1988-07-09'),
985
+ (10985,'1952-05-31','Chiradeep','Furedi','F','1990-12-10'),
986
+ (10986,'1954-08-11','Masako','Schiper','M','1985-10-11'),
987
+ (10987,'1952-11-26','Flemming','Baezner','M','1995-12-19'),
988
+ (10988,'1955-06-24','Chinya','Deyuan','M','1985-06-19'),
989
+ (10989,'1954-09-08','Sumali','Candan','F','1985-07-20'),
990
+ (10990,'1954-10-22','Shin','Foote','M','1988-07-06'),
991
+ (10991,'1957-05-22','Munehiro','Aingworth','M','1993-05-21'),
992
+ (10992,'1958-11-26','Zhensheng','Juneja','M','1988-08-01'),
993
+ (10993,'1958-11-17','Arve','Erde','F','1992-05-29'),
994
+ (10994,'1961-06-17','Divine','Aingworth','M','1987-06-29'),
995
+ (10995,'1963-02-26','Chenye','Hertweck','F','1997-07-19'),
996
+ (10996,'1955-02-01','Matk','Rahimi','F','1990-02-07'),
997
+ (10997,'1959-08-30','Alselm','Parascandalo','F','1994-05-06'),
998
+ (10998,'1956-02-17','Marlo','Kandlur','M','1992-06-28'),
999
+ (10999,'1961-12-04','Insup','Benveniste','F','1996-03-05'),
1000
+ (11000,'1960-09-12','Alain','Bonifati','M','1988-08-20');
employee-sample-database/mysql/dataset_small/load_salary1.sql ADDED
The diff for this file is too large to render. See raw diff
 
employee-sample-database/mysql/dataset_small/load_title.sql ADDED
@@ -0,0 +1,1470 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ INSERT INTO `title` VALUES (10001,'Senior Engineer','1986-06-26','9999-01-01'),
2
+ (10002,'Staff','1996-08-03','9999-01-01'),
3
+ (10003,'Senior Engineer','1995-12-03','9999-01-01'),
4
+ (10004,'Engineer','1986-12-01','1995-12-01'),
5
+ (10004,'Senior Engineer','1995-12-01','9999-01-01'),
6
+ (10005,'Senior Staff','1996-09-12','9999-01-01'),
7
+ (10005,'Staff','1989-09-12','1996-09-12'),
8
+ (10006,'Senior Engineer','1990-08-05','9999-01-01'),
9
+ (10007,'Senior Staff','1996-02-11','9999-01-01'),
10
+ (10007,'Staff','1989-02-10','1996-02-11'),
11
+ (10008,'Assistant Engineer','1998-03-11','2000-07-31'),
12
+ (10009,'Assistant Engineer','1985-02-18','1990-02-18'),
13
+ (10009,'Engineer','1990-02-18','1995-02-18'),
14
+ (10009,'Senior Engineer','1995-02-18','9999-01-01'),
15
+ (10010,'Engineer','1996-11-24','9999-01-01'),
16
+ (10011,'Staff','1990-01-22','1996-11-09'),
17
+ (10012,'Engineer','1992-12-18','2000-12-18'),
18
+ (10012,'Senior Engineer','2000-12-18','9999-01-01'),
19
+ (10013,'Senior Staff','1985-10-20','9999-01-01'),
20
+ (10014,'Engineer','1993-12-29','9999-01-01'),
21
+ (10015,'Senior Staff','1992-09-19','1993-08-22'),
22
+ (10016,'Staff','1998-02-11','9999-01-01'),
23
+ (10017,'Senior Staff','2000-08-03','9999-01-01'),
24
+ (10017,'Staff','1993-08-03','2000-08-03'),
25
+ (10018,'Engineer','1987-04-03','1995-04-03'),
26
+ (10018,'Senior Engineer','1995-04-03','9999-01-01'),
27
+ (10019,'Staff','1999-04-30','9999-01-01'),
28
+ (10020,'Engineer','1997-12-30','9999-01-01'),
29
+ (10021,'Technique Leader','1988-02-10','2002-07-15'),
30
+ (10022,'Engineer','1999-09-03','9999-01-01'),
31
+ (10023,'Engineer','1999-09-27','9999-01-01'),
32
+ (10024,'Assistant Engineer','1998-06-14','9999-01-01'),
33
+ (10025,'Technique Leader','1987-08-17','1997-10-15'),
34
+ (10026,'Engineer','1995-03-20','2001-03-19'),
35
+ (10026,'Senior Engineer','2001-03-19','9999-01-01'),
36
+ (10027,'Engineer','1995-04-02','2001-04-01'),
37
+ (10027,'Senior Engineer','2001-04-01','9999-01-01'),
38
+ (10028,'Engineer','1991-10-22','1998-04-06'),
39
+ (10029,'Engineer','1991-09-18','2000-09-17'),
40
+ (10029,'Senior Engineer','2000-09-17','9999-01-01'),
41
+ (10030,'Engineer','1994-02-17','2001-02-17'),
42
+ (10030,'Senior Engineer','2001-02-17','9999-01-01'),
43
+ (10031,'Engineer','1991-09-01','1998-09-01'),
44
+ (10031,'Senior Engineer','1998-09-01','9999-01-01'),
45
+ (10032,'Engineer','1990-06-20','1995-06-20'),
46
+ (10032,'Senior Engineer','1995-06-20','9999-01-01'),
47
+ (10033,'Technique Leader','1987-03-18','1993-03-24'),
48
+ (10034,'Staff','1995-04-12','1999-10-31'),
49
+ (10035,'Engineer','1988-09-05','1996-09-05'),
50
+ (10035,'Senior Engineer','1996-09-05','9999-01-01'),
51
+ (10036,'Senior Staff','1992-04-28','9999-01-01'),
52
+ (10037,'Engineer','1990-12-05','1995-12-05'),
53
+ (10037,'Senior Engineer','1995-12-05','9999-01-01'),
54
+ (10038,'Senior Staff','1996-09-20','9999-01-01'),
55
+ (10038,'Staff','1989-09-20','1996-09-20'),
56
+ (10039,'Senior Staff','1997-01-18','9999-01-01'),
57
+ (10039,'Staff','1988-01-19','1997-01-18'),
58
+ (10040,'Engineer','1993-02-14','1999-02-14'),
59
+ (10040,'Senior Engineer','1999-02-14','9999-01-01'),
60
+ (10041,'Senior Staff','1998-11-12','9999-01-01'),
61
+ (10041,'Staff','1989-11-12','1998-11-12'),
62
+ (10042,'Senior Staff','2000-03-21','2000-08-10'),
63
+ (10042,'Staff','1993-03-21','2000-03-21'),
64
+ (10043,'Engineer','1990-10-20','1997-10-20'),
65
+ (10043,'Senior Engineer','1997-10-20','9999-01-01'),
66
+ (10044,'Technique Leader','1994-05-21','9999-01-01'),
67
+ (10045,'Engineer','1996-11-16','9999-01-01'),
68
+ (10046,'Senior Staff','2000-06-20','9999-01-01'),
69
+ (10046,'Staff','1992-06-20','2000-06-20'),
70
+ (10047,'Engineer','1989-03-31','1998-03-31'),
71
+ (10047,'Senior Engineer','1998-03-31','9999-01-01'),
72
+ (10048,'Engineer','1985-02-24','1987-01-27'),
73
+ (10049,'Senior Staff','2000-05-04','9999-01-01'),
74
+ (10049,'Staff','1992-05-04','2000-05-04'),
75
+ (10050,'Senior Staff','1999-12-25','9999-01-01'),
76
+ (10050,'Staff','1990-12-25','1999-12-25'),
77
+ (10051,'Engineer','1992-10-15','1998-10-15'),
78
+ (10051,'Senior Engineer','1998-10-15','9999-01-01'),
79
+ (10052,'Senior Staff','2002-01-31','9999-01-01'),
80
+ (10052,'Staff','1997-01-31','2002-01-31'),
81
+ (10053,'Senior Staff','1994-11-13','9999-01-01'),
82
+ (10054,'Senior Staff','2000-07-28','9999-01-01'),
83
+ (10054,'Staff','1995-07-29','2000-07-28'),
84
+ (10055,'Staff','1992-04-27','1995-07-22'),
85
+ (10056,'Engineer','1990-02-01','1999-02-01'),
86
+ (10056,'Senior Engineer','1999-02-01','9999-01-01'),
87
+ (10057,'Engineer','1992-01-15','2000-01-15'),
88
+ (10057,'Senior Engineer','2000-01-15','9999-01-01'),
89
+ (10058,'Senior Staff','1988-04-25','9999-01-01'),
90
+ (10059,'Senior Staff','1991-06-26','9999-01-01'),
91
+ (10060,'Senior Staff','1996-05-28','9999-01-01'),
92
+ (10060,'Staff','1989-05-28','1996-05-28'),
93
+ (10061,'Senior Staff','1989-12-02','9999-01-01'),
94
+ (10062,'Engineer','1991-08-30','1999-08-30'),
95
+ (10062,'Senior Engineer','1999-08-30','9999-01-01'),
96
+ (10063,'Senior Engineer','1989-04-08','9999-01-01'),
97
+ (10064,'Staff','1985-11-20','1992-03-02'),
98
+ (10065,'Engineer','1998-05-24','9999-01-01'),
99
+ (10066,'Assistant Engineer','1986-02-26','1992-02-26'),
100
+ (10066,'Engineer','1992-02-26','1998-02-25'),
101
+ (10066,'Senior Engineer','1998-02-25','9999-01-01'),
102
+ (10067,'Engineer','1987-03-04','1996-03-03'),
103
+ (10067,'Senior Engineer','1996-03-03','9999-01-01'),
104
+ (10068,'Senior Staff','1996-08-06','9999-01-01'),
105
+ (10068,'Staff','1987-08-07','1996-08-06'),
106
+ (10069,'Technique Leader','1992-06-14','9999-01-01'),
107
+ (10070,'Technique Leader','1985-10-14','9999-01-01'),
108
+ (10071,'Staff','1995-08-05','9999-01-01'),
109
+ (10072,'Engineer','1989-05-21','1995-05-21'),
110
+ (10072,'Senior Engineer','1995-05-21','9999-01-01'),
111
+ (10073,'Engineer','1998-02-02','1998-02-22'),
112
+ (10074,'Technique Leader','1990-08-13','9999-01-01'),
113
+ (10075,'Senior Engineer','1988-05-17','2001-01-15'),
114
+ (10076,'Senior Engineer','1996-07-15','9999-01-01'),
115
+ (10077,'Staff','1994-12-23','9999-01-01'),
116
+ (10078,'Engineer','1994-09-29','9999-01-01'),
117
+ (10079,'Technique Leader','1995-12-13','9999-01-01'),
118
+ (10080,'Senior Staff','2001-09-28','9999-01-01'),
119
+ (10080,'Staff','1994-09-28','2001-09-28'),
120
+ (10081,'Engineer','1986-10-30','1991-10-30'),
121
+ (10081,'Senior Engineer','1991-10-30','9999-01-01'),
122
+ (10082,'Staff','1990-01-03','1990-01-15'),
123
+ (10083,'Engineer','1987-03-31','1994-03-31'),
124
+ (10083,'Senior Engineer','1994-03-31','9999-01-01'),
125
+ (10084,'Engineer','1995-12-15','2001-12-14'),
126
+ (10084,'Senior Engineer','2001-12-14','9999-01-01'),
127
+ (10085,'Senior Engineer','1994-04-09','9999-01-01'),
128
+ (10086,'Senior Staff','1999-02-19','9999-01-01'),
129
+ (10086,'Staff','1992-02-19','1999-02-19'),
130
+ (10087,'Staff','1997-05-08','2001-01-09'),
131
+ (10088,'Senior Staff','1993-09-02','9999-01-01'),
132
+ (10088,'Staff','1988-09-02','1993-09-02'),
133
+ (10089,'Senior Staff','1996-01-11','9999-01-01'),
134
+ (10089,'Staff','1989-01-10','1996-01-11'),
135
+ (10090,'Senior Engineer','1986-03-14','1999-05-07'),
136
+ (10091,'Engineer','1992-11-18','2001-11-18'),
137
+ (10091,'Senior Engineer','2001-11-18','9999-01-01'),
138
+ (10092,'Engineer','1996-04-22','9999-01-01'),
139
+ (10093,'Staff','1997-06-08','9999-01-01'),
140
+ (10094,'Senior Staff','1987-04-18','1997-11-08'),
141
+ (10095,'Senior Staff','2000-03-09','9999-01-01'),
142
+ (10095,'Staff','1994-03-10','2000-03-09'),
143
+ (10096,'Engineer','1999-01-23','9999-01-01'),
144
+ (10097,'Senior Staff','1996-09-14','9999-01-01'),
145
+ (10097,'Staff','1990-09-15','1996-09-14'),
146
+ (10098,'Engineer','1985-05-13','1992-05-13'),
147
+ (10098,'Senior Engineer','1992-05-13','1992-12-11'),
148
+ (10099,'Senior Staff','1995-10-19','9999-01-01'),
149
+ (10099,'Staff','1988-10-18','1995-10-19'),
150
+ (10100,'Senior Staff','1994-09-21','9999-01-01'),
151
+ (10100,'Staff','1987-09-21','1994-09-21'),
152
+ (10101,'Staff','1998-10-14','2000-09-23'),
153
+ (10102,'Assistant Engineer','1995-01-02','2002-01-02'),
154
+ (10102,'Engineer','2002-01-02','9999-01-01'),
155
+ (10103,'Engineer','1998-01-12','9999-01-01'),
156
+ (10104,'Senior Staff','1987-04-16','9999-01-01'),
157
+ (10105,'Staff','1999-05-17','2001-06-11'),
158
+ (10106,'Engineer','1991-10-27','1997-10-26'),
159
+ (10106,'Senior Engineer','1997-10-26','9999-01-01'),
160
+ (10107,'Senior Staff','1999-03-30','9999-01-01'),
161
+ (10108,'Staff','1999-03-20','2001-10-20'),
162
+ (10109,'Engineer','1993-06-16','2001-06-16'),
163
+ (10109,'Senior Engineer','2001-06-16','9999-01-01'),
164
+ (10110,'Senior Staff','1992-08-21','9999-01-01'),
165
+ (10110,'Staff','1986-08-22','1992-08-21'),
166
+ (10111,'Engineer','1988-12-19','1996-12-19'),
167
+ (10111,'Senior Engineer','1996-12-19','9999-01-01'),
168
+ (10112,'Staff','1998-05-01','9999-01-01'),
169
+ (10113,'Engineer','1998-09-14','9999-01-01'),
170
+ (10114,'Senior Staff','1999-07-18','9999-01-01'),
171
+ (10114,'Staff','1992-07-17','1999-07-18'),
172
+ (10115,'Staff','1988-03-03','1992-05-24'),
173
+ (10116,'Senior Engineer','1994-02-27','1998-11-01'),
174
+ (10117,'Senior Engineer','1992-03-19','9999-01-01'),
175
+ (10118,'Senior Engineer','1992-02-02','9999-01-01'),
176
+ (10119,'Engineer','1993-12-09','1997-10-30'),
177
+ (10120,'Engineer','1996-07-06','9999-01-01'),
178
+ (10121,'Engineer','1989-05-03','1996-05-03'),
179
+ (10121,'Senior Engineer','1996-05-03','9999-01-01'),
180
+ (10122,'Technique Leader','1998-08-06','9999-01-01'),
181
+ (10123,'Assistant Engineer','1993-01-15','1999-01-15'),
182
+ (10123,'Engineer','1999-01-15','9999-01-01'),
183
+ (10124,'Engineer','1991-09-05','1998-09-05'),
184
+ (10124,'Senior Engineer','1998-09-05','9999-01-01'),
185
+ (10125,'Staff','1990-10-26','1996-03-25'),
186
+ (10126,'Senior Staff','1991-09-08','9999-01-01'),
187
+ (10126,'Staff','1985-09-08','1991-09-08'),
188
+ (10127,'Senior Engineer','1991-05-17','9999-01-01'),
189
+ (10128,'Senior Staff','1995-06-07','9999-01-01'),
190
+ (10128,'Staff','1988-06-06','1995-06-07'),
191
+ (10129,'Technique Leader','1996-01-16','9999-01-01'),
192
+ (10130,'Senior Engineer','1988-06-21','9999-01-01'),
193
+ (10131,'Engineer','1999-09-17','1999-12-06'),
194
+ (10132,'Staff','1997-06-18','9999-01-01'),
195
+ (10133,'Engineer','1985-12-15','1991-12-15'),
196
+ (10133,'Senior Engineer','1991-12-15','9999-01-01'),
197
+ (10134,'Engineer','1987-12-12','1994-12-12'),
198
+ (10134,'Senior Engineer','1994-12-12','9999-01-01'),
199
+ (10135,'Assistant Engineer','1990-01-04','1999-01-04'),
200
+ (10135,'Engineer','1999-01-04','9999-01-01'),
201
+ (10136,'Senior Staff','1997-06-13','1999-09-20'),
202
+ (10136,'Staff','1988-06-13','1997-06-13'),
203
+ (10137,'Senior Staff','1994-02-18','9999-01-01'),
204
+ (10137,'Staff','1985-02-18','1994-02-18'),
205
+ (10138,'Engineer','1992-03-03','2001-03-03'),
206
+ (10138,'Senior Engineer','2001-03-03','9999-01-01'),
207
+ (10139,'Engineer','1998-03-15','9999-01-01'),
208
+ (10140,'Senior Staff','1998-03-14','9999-01-01'),
209
+ (10140,'Staff','1991-03-14','1998-03-14'),
210
+ (10141,'Senior Staff','1998-07-23','9999-01-01'),
211
+ (10142,'Engineer','1993-10-28','2001-10-28'),
212
+ (10142,'Senior Engineer','2001-10-28','9999-01-01'),
213
+ (10143,'Engineer','1988-09-30','1993-09-30'),
214
+ (10143,'Senior Engineer','1993-09-30','9999-01-01'),
215
+ (10144,'Senior Staff','1992-10-14','1993-08-10'),
216
+ (10144,'Staff','1985-10-14','1992-10-14'),
217
+ (10145,'Engineer','1999-11-03','9999-01-01'),
218
+ (10146,'Staff','1988-06-28','1990-09-07'),
219
+ (10147,'Senior Staff','1995-12-18','9999-01-01'),
220
+ (10147,'Staff','1987-12-18','1995-12-18'),
221
+ (10148,'Staff','1996-07-15','9999-01-01'),
222
+ (10149,'Staff','1994-01-28','1996-08-27'),
223
+ (10150,'Engineer','1986-11-16','1995-11-16'),
224
+ (10150,'Senior Engineer','1995-11-16','9999-01-01'),
225
+ (10151,'Senior Staff','1997-12-12','9999-01-01'),
226
+ (10151,'Staff','1992-12-12','1997-12-12'),
227
+ (10152,'Engineer','1986-01-27','1987-08-03'),
228
+ (10153,'Assistant Engineer','2000-01-08','9999-01-01'),
229
+ (10154,'Staff','1996-10-23','9999-01-01'),
230
+ (10155,'Senior Staff','1996-01-05','9999-01-01'),
231
+ (10155,'Staff','1990-01-05','1996-01-05'),
232
+ (10156,'Engineer','1993-05-14','2001-05-14'),
233
+ (10156,'Senior Engineer','2001-05-14','9999-01-01'),
234
+ (10157,'Senior Engineer','1997-12-10','9999-01-01'),
235
+ (10158,'Engineer','1987-06-04','1996-06-03'),
236
+ (10158,'Senior Engineer','1996-06-03','9999-01-01'),
237
+ (10159,'Senior Engineer','1996-06-12','9999-01-01'),
238
+ (10160,'Senior Staff','2000-12-06','9999-01-01'),
239
+ (10160,'Staff','1993-12-06','2000-12-06'),
240
+ (10161,'Engineer','1991-06-09','1994-01-05'),
241
+ (10162,'Engineer','1998-05-27','9999-01-01'),
242
+ (10163,'Senior Staff','1992-02-02','9999-01-01'),
243
+ (10164,'Engineer','1990-10-19','1999-10-19'),
244
+ (10164,'Senior Engineer','1999-10-19','9999-01-01'),
245
+ (10165,'Senior Staff','1988-05-17','9999-01-01'),
246
+ (10166,'Engineer','1996-09-02','9999-01-01'),
247
+ (10167,'Engineer','1992-04-04','2001-04-04'),
248
+ (10167,'Senior Engineer','2001-04-04','9999-01-01'),
249
+ (10168,'Senior Staff','1995-12-06','9999-01-01'),
250
+ (10168,'Staff','1986-12-06','1995-12-06'),
251
+ (10169,'Engineer','1998-06-28','9999-01-01'),
252
+ (10170,'Engineer','1986-01-02','1989-02-06'),
253
+ (10171,'Technique Leader','1996-08-05','9999-01-01'),
254
+ (10172,'Engineer','1998-02-04','9999-01-01'),
255
+ (10173,'Senior Staff','1999-03-22','9999-01-01'),
256
+ (10173,'Staff','1992-03-21','1999-03-22'),
257
+ (10174,'Engineer','1987-06-01','1995-06-01'),
258
+ (10174,'Senior Engineer','1995-06-01','9999-01-01'),
259
+ (10175,'Staff','1988-09-24','1995-05-24'),
260
+ (10176,'Senior Staff','1999-12-22','9999-01-01'),
261
+ (10176,'Staff','1994-12-22','1999-12-22'),
262
+ (10177,'Staff','1993-02-06','1994-03-17'),
263
+ (10178,'Staff','1994-03-21','9999-01-01'),
264
+ (10179,'Engineer','2000-01-25','9999-01-01'),
265
+ (10180,'Senior Staff','2002-07-01','9999-01-01'),
266
+ (10180,'Staff','1994-07-01','2002-07-01'),
267
+ (10181,'Senior Engineer','1988-06-22','9999-01-01'),
268
+ (10182,'Engineer','1990-09-02','1995-09-02'),
269
+ (10182,'Senior Engineer','1995-09-02','9999-01-01'),
270
+ (10183,'Staff','1996-08-11','9999-01-01'),
271
+ (10184,'Staff','1997-12-26','9999-01-01'),
272
+ (10185,'Senior Staff','1992-02-29','9999-01-01'),
273
+ (10185,'Staff','1986-03-01','1992-02-29'),
274
+ (10186,'Staff','1996-12-25','1997-08-16'),
275
+ (10187,'Senior Staff','2000-05-31','9999-01-01'),
276
+ (10187,'Staff','1991-06-01','2000-05-31'),
277
+ (10188,'Senior Engineer','1987-08-27','9999-01-01'),
278
+ (10189,'Engineer','1992-09-13','1993-06-29'),
279
+ (10190,'Engineer','1986-06-23','1994-06-23'),
280
+ (10190,'Senior Engineer','1994-06-23','9999-01-01'),
281
+ (10191,'Senior Engineer','1986-04-10','9999-01-01'),
282
+ (10192,'Engineer','1988-06-13','1993-06-13'),
283
+ (10192,'Senior Engineer','1993-06-13','9999-01-01'),
284
+ (10193,'Engineer','1996-09-21','9999-01-01'),
285
+ (10194,'Senior Staff','2002-02-14','9999-01-01'),
286
+ (10194,'Staff','1997-02-14','2002-02-14'),
287
+ (10195,'Engineer','1985-02-15','1991-02-15'),
288
+ (10195,'Senior Engineer','1991-02-15','2001-04-14'),
289
+ (10196,'Staff','1999-01-31','9999-01-01'),
290
+ (10197,'Engineer','1994-06-28','2001-06-28'),
291
+ (10197,'Senior Engineer','2001-06-28','9999-01-01'),
292
+ (10198,'Engineer','1985-08-31','1993-08-31'),
293
+ (10198,'Senior Engineer','1993-08-31','9999-01-01'),
294
+ (10199,'Staff','1998-02-07','9999-01-01'),
295
+ (10200,'Engineer','1994-02-17','2000-02-17'),
296
+ (10200,'Senior Engineer','2000-02-17','9999-01-01'),
297
+ (10201,'Engineer','1992-11-10','1998-11-10'),
298
+ (10201,'Senior Engineer','1998-11-10','9999-01-01'),
299
+ (10202,'Engineer','1991-10-06','2000-10-05'),
300
+ (10202,'Senior Engineer','2000-10-05','9999-01-01'),
301
+ (10203,'Senior Staff','1995-04-06','9999-01-01'),
302
+ (10203,'Staff','1989-04-06','1995-04-06'),
303
+ (10204,'Engineer','1998-12-18','1999-03-08'),
304
+ (10205,'Senior Engineer','1993-08-23','9999-01-01'),
305
+ (10206,'Technique Leader','1988-04-19','9999-01-01'),
306
+ (10207,'Engineer','1992-10-11','1997-10-11'),
307
+ (10207,'Senior Engineer','1997-10-11','9999-01-01'),
308
+ (10208,'Staff','1995-02-05','1999-05-15'),
309
+ (10209,'Senior Staff','1997-11-22','9999-01-01'),
310
+ (10209,'Staff','1991-11-23','1997-11-22'),
311
+ (10210,'Senior Staff','2002-02-23','9999-01-01'),
312
+ (10210,'Staff','1996-02-24','2002-02-23'),
313
+ (10211,'Engineer','1991-11-22','1996-11-21'),
314
+ (10211,'Senior Engineer','1996-11-21','9999-01-01'),
315
+ (10212,'Engineer','1996-01-28','2001-01-27'),
316
+ (10212,'Senior Engineer','2001-01-27','9999-01-01'),
317
+ (10213,'Staff','1994-10-06','9999-01-01'),
318
+ (10214,'Senior Staff','1988-02-29','9999-01-01'),
319
+ (10215,'Senior Staff','1991-11-23','9999-01-01'),
320
+ (10216,'Senior Staff','1993-10-29','9999-01-01'),
321
+ (10216,'Staff','1987-10-30','1993-10-29'),
322
+ (10217,'Technique Leader','1986-05-12','1993-08-05'),
323
+ (10218,'Senior Engineer','1997-01-31','9999-01-01'),
324
+ (10219,'Senior Staff','1993-03-31','9999-01-01'),
325
+ (10220,'Staff','1997-09-16','9999-01-01'),
326
+ (10221,'Engineer','1988-06-08','1997-06-08'),
327
+ (10221,'Senior Engineer','1997-06-08','2000-10-04'),
328
+ (10222,'Assistant Engineer','1986-06-08','1995-06-08'),
329
+ (10222,'Engineer','1995-06-08','9999-01-01'),
330
+ (10223,'Engineer','1998-04-01','9999-01-01'),
331
+ (10224,'Engineer','1988-01-09','1996-01-09'),
332
+ (10224,'Senior Engineer','1996-01-09','9999-01-01'),
333
+ (10225,'Staff','1995-12-14','9999-01-01'),
334
+ (10226,'Staff','1996-01-29','9999-01-01'),
335
+ (10227,'Technique Leader','1994-11-01','9999-01-01'),
336
+ (10228,'Senior Staff','1998-12-22','9999-01-01'),
337
+ (10228,'Staff','1992-12-22','1998-12-22'),
338
+ (10229,'Engineer','1996-02-20','2000-06-30'),
339
+ (10230,'Senior Staff','2002-06-16','9999-01-01'),
340
+ (10230,'Staff','1996-06-16','2002-06-16'),
341
+ (10231,'Staff','1998-09-09','9999-01-01'),
342
+ (10232,'Senior Staff','1998-06-04','9999-01-01'),
343
+ (10232,'Staff','1992-06-04','1998-06-04'),
344
+ (10233,'Senior Staff','2000-04-28','9999-01-01'),
345
+ (10233,'Staff','1994-04-29','2000-04-28'),
346
+ (10234,'Senior Staff','1995-11-19','1999-08-06'),
347
+ (10234,'Staff','1990-11-19','1995-11-19'),
348
+ (10235,'Senior Engineer','1995-04-06','9999-01-01'),
349
+ (10236,'Staff','1996-08-30','9999-01-01'),
350
+ (10237,'Senior Staff','1997-08-11','2000-02-21'),
351
+ (10237,'Staff','1989-08-11','1997-08-11'),
352
+ (10238,'Engineer','1995-03-31','9999-01-01'),
353
+ (10239,'Staff','1996-05-04','9999-01-01'),
354
+ (10240,'Engineer','1998-10-06','9999-01-01'),
355
+ (10241,'Senior Staff','1995-06-13','9999-01-01'),
356
+ (10241,'Staff','1988-06-12','1995-06-13'),
357
+ (10242,'Engineer','1988-01-18','1995-01-18'),
358
+ (10242,'Senior Engineer','1995-01-18','9999-01-01'),
359
+ (10243,'Senior Staff','1986-06-07','9999-01-01'),
360
+ (10244,'Engineer','1999-09-16','9999-01-01'),
361
+ (10245,'Staff','1994-04-21','1995-02-20'),
362
+ (10246,'Senior Engineer','1991-02-01','9999-01-01'),
363
+ (10247,'Engineer','1992-08-14','1998-08-14'),
364
+ (10247,'Senior Engineer','1998-08-14','9999-01-01'),
365
+ (10248,'Senior Staff','1997-08-12','9999-01-01'),
366
+ (10248,'Staff','1991-08-13','1997-08-12'),
367
+ (10249,'Engineer','1991-12-08','2000-12-07'),
368
+ (10249,'Senior Engineer','2000-12-07','9999-01-01'),
369
+ (10250,'Engineer','1992-08-30','2001-08-30'),
370
+ (10250,'Senior Engineer','2001-08-30','9999-01-01'),
371
+ (10251,'Senior Staff','2001-06-25','9999-01-01'),
372
+ (10251,'Staff','1992-06-25','2001-06-25'),
373
+ (10252,'Engineer','1990-11-08','1998-11-08'),
374
+ (10252,'Senior Engineer','1998-11-08','9999-01-01'),
375
+ (10253,'Senior Staff','1993-02-21','1994-03-20'),
376
+ (10253,'Staff','1985-02-21','1993-02-21'),
377
+ (10254,'Senior Staff','1998-06-14','9999-01-01'),
378
+ (10254,'Staff','1990-06-14','1998-06-14'),
379
+ (10255,'Engineer','1993-05-12','1999-05-12'),
380
+ (10255,'Senior Engineer','1999-05-12','1999-11-14'),
381
+ (10256,'Senior Staff','1990-10-12','9999-01-01'),
382
+ (10256,'Staff','1985-10-12','1990-10-12'),
383
+ (10257,'Technique Leader','1997-07-16','9999-01-01'),
384
+ (10258,'Assistant Engineer','1985-05-17','1991-05-17'),
385
+ (10258,'Engineer','1991-05-17','1997-05-16'),
386
+ (10258,'Senior Engineer','1997-05-16','9999-01-01'),
387
+ (10259,'Senior Staff','1993-07-24','1999-01-06'),
388
+ (10259,'Staff','1987-07-25','1993-07-24'),
389
+ (10260,'Engineer','1993-02-01','2002-02-01'),
390
+ (10260,'Senior Engineer','2002-02-01','9999-01-01'),
391
+ (10261,'Senior Engineer','1996-09-11','1999-02-23'),
392
+ (10262,'Staff','1996-01-22','9999-01-01'),
393
+ (10263,'Staff','1996-12-21','9999-01-01'),
394
+ (10264,'Engineer','1997-07-16','9999-01-01'),
395
+ (10265,'Senior Engineer','1997-09-12','9999-01-01'),
396
+ (10266,'Senior Engineer','1990-05-25','9999-01-01'),
397
+ (10267,'Engineer','1997-04-26','9999-01-01'),
398
+ (10268,'Engineer','1986-12-17','1990-08-17'),
399
+ (10269,'Engineer','1988-07-24','1996-07-24'),
400
+ (10269,'Senior Engineer','1996-07-24','9999-01-01'),
401
+ (10270,'Senior Staff','1999-09-26','9999-01-01'),
402
+ (10270,'Staff','1991-09-26','1999-09-26'),
403
+ (10271,'Engineer','1986-05-23','1992-05-22'),
404
+ (10271,'Senior Engineer','1992-05-22','9999-01-01'),
405
+ (10272,'Staff','1997-10-23','9999-01-01'),
406
+ (10273,'Senior Staff','1991-11-06','9999-01-01'),
407
+ (10273,'Staff','1985-11-06','1991-11-06'),
408
+ (10274,'Engineer','1997-02-02','9999-01-01'),
409
+ (10275,'Senior Engineer','1987-09-08','9999-01-01'),
410
+ (10276,'Engineer','1986-10-19','1993-10-19'),
411
+ (10276,'Senior Engineer','1993-10-19','2000-02-04'),
412
+ (10277,'Senior Staff','1991-06-16','9999-01-01'),
413
+ (10277,'Staff','1985-06-16','1991-06-16'),
414
+ (10278,'Engineer','1993-07-02','1997-02-14'),
415
+ (10279,'Engineer','1995-04-26','9999-01-01'),
416
+ (10280,'Staff','1995-01-27','9999-01-01'),
417
+ (10281,'Engineer','1994-12-03','2000-12-02'),
418
+ (10281,'Senior Engineer','2000-12-02','9999-01-01'),
419
+ (10282,'Assistant Engineer','1996-05-02','2001-05-02'),
420
+ (10282,'Engineer','2001-05-02','9999-01-01'),
421
+ (10283,'Engineer','1988-05-25','1995-05-26'),
422
+ (10283,'Senior Engineer','1995-05-26','9999-01-01'),
423
+ (10284,'Engineer','1999-07-06','9999-01-01'),
424
+ (10285,'Staff','1995-05-25','9999-01-01'),
425
+ (10286,'Staff','1994-12-24','1999-01-24'),
426
+ (10287,'Senior Staff','2000-12-28','9999-01-01'),
427
+ (10287,'Staff','1992-12-28','2000-12-28'),
428
+ (10288,'Technique Leader','1994-08-29','9999-01-01'),
429
+ (10289,'Technique Leader','1993-03-12','2002-01-31'),
430
+ (10290,'Engineer','1991-09-18','1997-09-17'),
431
+ (10290,'Senior Engineer','1997-09-17','9999-01-01'),
432
+ (10291,'Senior Staff','1994-03-30','9999-01-01'),
433
+ (10291,'Staff','1987-03-30','1994-03-30'),
434
+ (10292,'Senior Staff','1997-06-05','9999-01-01'),
435
+ (10292,'Staff','1989-06-05','1997-06-05'),
436
+ (10293,'Engineer','1992-12-12','2001-12-12'),
437
+ (10293,'Senior Engineer','2001-12-12','9999-01-01'),
438
+ (10294,'Senior Engineer','1999-01-30','1999-05-04'),
439
+ (10295,'Senior Staff','2000-06-18','9999-01-01'),
440
+ (10295,'Staff','1995-06-19','2000-06-18'),
441
+ (10296,'Senior Staff','1994-09-16','9999-01-01'),
442
+ (10296,'Staff','1989-09-16','1994-09-16'),
443
+ (10297,'Engineer','1986-05-28','1995-05-28'),
444
+ (10297,'Senior Engineer','1995-05-28','9999-01-01'),
445
+ (10298,'Staff','1999-04-27','9999-01-01'),
446
+ (10299,'Senior Staff','1997-01-10','9999-01-01'),
447
+ (10299,'Staff','1990-01-10','1997-01-10'),
448
+ (10300,'Engineer','1991-05-17','1996-05-16'),
449
+ (10300,'Senior Engineer','1996-05-16','9999-01-01'),
450
+ (10301,'Senior Staff','1995-05-24','9999-01-01'),
451
+ (10301,'Staff','1988-05-23','1995-05-24'),
452
+ (10302,'Senior Staff','1994-07-22','1999-11-09'),
453
+ (10302,'Staff','1986-07-22','1994-07-22'),
454
+ (10303,'Senior Engineer','1990-02-05','2000-11-15'),
455
+ (10304,'Senior Staff','1997-11-16','2002-05-08'),
456
+ (10304,'Staff','1992-11-16','1997-11-16'),
457
+ (10305,'Engineer','1988-10-31','1992-06-02'),
458
+ (10306,'Staff','1993-09-06','9999-01-01'),
459
+ (10307,'Engineer','1999-10-16','9999-01-01'),
460
+ (10308,'Senior Staff','2001-12-29','9999-01-01'),
461
+ (10308,'Staff','1992-12-29','2001-12-29'),
462
+ (10309,'Assistant Engineer','1997-05-02','9999-01-01'),
463
+ (10310,'Senior Engineer','1990-10-24','2001-07-26'),
464
+ (10311,'Engineer','1998-11-04','9999-01-01'),
465
+ (10312,'Senior Engineer','1986-08-28','9999-01-01'),
466
+ (10313,'Staff','1994-10-10','9999-01-01'),
467
+ (10314,'Senior Staff','1994-01-16','9999-01-01'),
468
+ (10314,'Staff','1986-01-16','1994-01-16'),
469
+ (10315,'Engineer','1987-08-28','1994-08-28'),
470
+ (10315,'Senior Engineer','1994-08-28','9999-01-01'),
471
+ (10316,'Engineer','1990-12-18','1991-01-02'),
472
+ (10317,'Staff','1999-01-24','9999-01-01'),
473
+ (10318,'Engineer','1987-03-23','1995-03-23'),
474
+ (10318,'Senior Engineer','1995-03-23','9999-01-01'),
475
+ (10319,'Senior Staff','1999-06-18','9999-01-01'),
476
+ (10319,'Staff','1994-06-18','1999-06-18'),
477
+ (10320,'Senior Staff','1996-11-03','2001-12-23'),
478
+ (10320,'Staff','1988-11-03','1996-11-03'),
479
+ (10321,'Staff','1995-07-24','1999-08-14'),
480
+ (10322,'Engineer','1990-01-29','1997-01-29'),
481
+ (10322,'Senior Engineer','1997-01-29','9999-01-01'),
482
+ (10323,'Engineer','1991-06-06','2000-06-05'),
483
+ (10323,'Senior Engineer','2000-06-05','9999-01-01'),
484
+ (10324,'Engineer','1999-07-19','9999-01-01'),
485
+ (10325,'Senior Staff','1990-09-20','9999-01-01'),
486
+ (10326,'Staff','1998-09-02','9999-01-01'),
487
+ (10327,'Engineer','1987-09-18','1993-05-22'),
488
+ (10328,'Engineer','1998-07-17','9999-01-01'),
489
+ (10329,'Technique Leader','1986-01-20','9999-01-01'),
490
+ (10330,'Staff','1993-10-08','9999-01-01'),
491
+ (10331,'Senior Staff','1991-10-29','9999-01-01'),
492
+ (10331,'Staff','1986-10-29','1991-10-29'),
493
+ (10332,'Engineer','1988-10-20','1994-10-20'),
494
+ (10332,'Senior Engineer','1994-10-20','1997-03-07'),
495
+ (10333,'Engineer','1993-01-16','1998-01-16'),
496
+ (10333,'Senior Engineer','1998-01-16','9999-01-01'),
497
+ (10334,'Staff','1998-02-15','9999-01-01'),
498
+ (10335,'Senior Staff','1992-04-06','9999-01-01'),
499
+ (10336,'Staff','1996-09-27','9999-01-01'),
500
+ (10337,'Assistant Engineer','1998-04-25','9999-01-01'),
501
+ (10338,'Staff','1999-12-29','9999-01-01'),
502
+ (10339,'Engineer','1989-11-30','1997-11-30'),
503
+ (10339,'Senior Engineer','1997-11-30','9999-01-01'),
504
+ (10340,'Senior Staff','1993-03-30','9999-01-01'),
505
+ (10340,'Staff','1988-03-30','1993-03-30'),
506
+ (10341,'Technique Leader','1987-04-29','1998-11-11'),
507
+ (10342,'Engineer','1987-07-25','1993-07-24'),
508
+ (10342,'Senior Engineer','1993-07-24','9999-01-01'),
509
+ (10343,'Senior Engineer','1997-10-03','9999-01-01'),
510
+ (10344,'Assistant Engineer','1999-04-19','9999-01-01'),
511
+ (10345,'Engineer','1993-11-08','1998-11-08'),
512
+ (10345,'Senior Engineer','1998-11-08','9999-01-01'),
513
+ (10346,'Staff','1992-01-17','1996-04-20'),
514
+ (10347,'Staff','1998-02-20','9999-01-01'),
515
+ (10348,'Technique Leader','1995-10-22','9999-01-01'),
516
+ (10349,'Senior Staff','1997-09-27','9999-01-01'),
517
+ (10349,'Staff','1991-09-28','1997-09-27'),
518
+ (10350,'Assistant Engineer','1991-05-11','1997-05-10'),
519
+ (10350,'Engineer','1997-05-10','1998-01-16'),
520
+ (10351,'Staff','1995-05-01','9999-01-01'),
521
+ (10352,'Engineer','1998-12-16','9999-01-01'),
522
+ (10353,'Senior Staff','1989-08-24','9999-01-01'),
523
+ (10354,'Senior Staff','1999-03-03','2002-01-01'),
524
+ (10355,'Staff','1996-01-26','9999-01-01'),
525
+ (10356,'Senior Staff','1995-06-26','9999-01-01'),
526
+ (10357,'Engineer','1994-04-04','1999-04-03'),
527
+ (10357,'Senior Engineer','1999-04-03','9999-01-01'),
528
+ (10358,'Technique Leader','1991-02-19','9999-01-01'),
529
+ (10359,'Engineer','1998-07-20','9999-01-01'),
530
+ (10360,'Staff','1996-09-04','9999-01-01'),
531
+ (10361,'Senior Staff','1991-10-23','9999-01-01'),
532
+ (10361,'Staff','1986-10-23','1991-10-23'),
533
+ (10362,'Senior Staff','1990-11-02','1997-07-16'),
534
+ (10363,'Assistant Engineer','1985-09-11','1993-02-12'),
535
+ (10364,'Senior Engineer','1985-11-14','9999-01-01'),
536
+ (10365,'Staff','1987-10-22','1992-04-04'),
537
+ (10366,'Engineer','1997-08-15','9999-01-01'),
538
+ (10367,'Senior Staff','2000-06-23','9999-01-01'),
539
+ (10367,'Staff','1991-06-24','2000-06-23'),
540
+ (10368,'Assistant Engineer','1996-05-16','9999-01-01'),
541
+ (10369,'Staff','1994-09-05','9999-01-01'),
542
+ (10370,'Senior Staff','1998-04-18','9999-01-01'),
543
+ (10370,'Staff','1992-04-18','1998-04-18'),
544
+ (10371,'Assistant Engineer','1989-11-28','1998-11-28'),
545
+ (10371,'Engineer','1998-11-28','9999-01-01'),
546
+ (10372,'Technique Leader','1985-07-30','9999-01-01'),
547
+ (10373,'Engineer','1997-04-26','9999-01-01'),
548
+ (10374,'Staff','1993-12-08','1996-03-29'),
549
+ (10375,'Senior Staff','2001-05-29','9999-01-01'),
550
+ (10375,'Staff','1994-05-29','2001-05-29'),
551
+ (10376,'Technique Leader','1990-12-08','9999-01-01'),
552
+ (10377,'Senior Engineer','1996-08-24','9999-01-01'),
553
+ (10378,'Senior Staff','1992-08-31','9999-01-01'),
554
+ (10379,'Engineer','1996-07-15','9999-01-01'),
555
+ (10380,'Senior Staff','1994-03-19','9999-01-01'),
556
+ (10380,'Staff','1985-03-19','1994-03-19'),
557
+ (10381,'Assistant Engineer','1991-12-04','2000-12-03'),
558
+ (10381,'Engineer','2000-12-03','9999-01-01'),
559
+ (10382,'Engineer','1998-07-01','2000-10-27'),
560
+ (10383,'Engineer','1991-06-19','1997-06-18'),
561
+ (10383,'Senior Engineer','1997-06-18','9999-01-01'),
562
+ (10384,'Senior Staff','1991-01-16','9999-01-01'),
563
+ (10384,'Staff','1986-01-16','1991-01-16'),
564
+ (10385,'Engineer','1992-12-20','1998-01-23'),
565
+ (10386,'Engineer','1985-08-02','1994-08-02'),
566
+ (10386,'Senior Engineer','1994-08-02','9999-01-01'),
567
+ (10387,'Senior Staff','1999-01-07','9999-01-01'),
568
+ (10387,'Staff','1994-01-07','1999-01-07'),
569
+ (10388,'Staff','1999-05-28','9999-01-01'),
570
+ (10389,'Technique Leader','1999-05-13','9999-01-01'),
571
+ (10390,'Technique Leader','1989-05-17','9999-01-01'),
572
+ (10391,'Assistant Engineer','1993-01-28','2001-01-28'),
573
+ (10391,'Engineer','2001-01-28','9999-01-01'),
574
+ (10392,'Engineer','1992-03-01','1998-03-01'),
575
+ (10392,'Senior Engineer','1998-03-01','9999-01-01'),
576
+ (10393,'Engineer','1989-06-23','1995-06-23'),
577
+ (10393,'Senior Engineer','1995-06-23','9999-01-01'),
578
+ (10394,'Engineer','1991-03-14','1991-08-25'),
579
+ (10395,'Engineer','1998-08-10','2001-08-13'),
580
+ (10396,'Senior Engineer','1986-01-11','9999-01-01'),
581
+ (10397,'Technique Leader','1993-05-21','9999-01-01'),
582
+ (10398,'Senior Staff','1990-10-12','9999-01-01'),
583
+ (10399,'Staff','2000-01-26','9999-01-01'),
584
+ (10400,'Senior Staff','1993-10-17','9999-01-01'),
585
+ (10401,'Engineer','1999-10-25','2001-04-25'),
586
+ (10402,'Technique Leader','1987-01-02','9999-01-01'),
587
+ (10403,'Senior Staff','2000-09-12','2001-06-15'),
588
+ (10403,'Staff','1991-09-13','2000-09-12'),
589
+ (10404,'Engineer','1988-08-28','1996-08-28'),
590
+ (10404,'Senior Engineer','1996-08-28','9999-01-01'),
591
+ (10405,'Assistant Engineer','1998-09-26','2000-12-05'),
592
+ (10406,'Engineer','1996-01-26','9999-01-01'),
593
+ (10407,'Senior Staff','1999-10-30','9999-01-01'),
594
+ (10408,'Staff','1998-10-07','9999-01-01'),
595
+ (10409,'Engineer','1997-09-26','9999-01-01'),
596
+ (10410,'Staff','1993-10-16','1996-07-21'),
597
+ (10411,'Senior Staff','1994-09-02','9999-01-01'),
598
+ (10411,'Staff','1989-09-02','1994-09-02'),
599
+ (10412,'Engineer','1991-11-21','1996-11-20'),
600
+ (10412,'Senior Engineer','1996-11-20','9999-01-01'),
601
+ (10413,'Senior Staff','1997-12-26','9999-01-01'),
602
+ (10413,'Staff','1991-12-27','1997-12-26'),
603
+ (10414,'Senior Engineer','1990-05-30','1994-12-02'),
604
+ (10415,'Senior Engineer','1993-10-25','9999-01-01'),
605
+ (10416,'Senior Staff','1996-03-24','9999-01-01'),
606
+ (10416,'Staff','1989-03-24','1996-03-24'),
607
+ (10417,'Staff','1999-06-27','9999-01-01'),
608
+ (10418,'Staff','1996-10-04','9999-01-01'),
609
+ (10419,'Senior Staff','2000-04-25','2002-07-06'),
610
+ (10419,'Staff','1992-04-25','2000-04-25'),
611
+ (10420,'Senior Staff','1997-01-16','2000-07-09'),
612
+ (10420,'Staff','1988-01-17','1997-01-16'),
613
+ (10421,'Senior Staff','1998-04-07','9999-01-01'),
614
+ (10421,'Staff','1990-04-07','1998-04-07'),
615
+ (10422,'Engineer','1995-01-03','9999-01-01'),
616
+ (10423,'Staff','1999-05-27','9999-01-01'),
617
+ (10424,'Senior Engineer','1989-08-07','9999-01-01'),
618
+ (10425,'Engineer','1995-05-07','2001-05-06'),
619
+ (10425,'Senior Engineer','2001-05-06','2002-05-06'),
620
+ (10426,'Technique Leader','1985-07-06','9999-01-01'),
621
+ (10427,'Senior Staff','1999-10-03','9999-01-01'),
622
+ (10427,'Staff','1994-10-03','1999-10-03'),
623
+ (10428,'Senior Staff','1999-06-05','9999-01-01'),
624
+ (10428,'Staff','1992-06-04','1999-06-05'),
625
+ (10429,'Senior Engineer','1988-09-23','9999-01-01'),
626
+ (10430,'Senior Engineer','1998-07-05','9999-01-01'),
627
+ (10431,'Senior Staff','1995-10-08','9999-01-01'),
628
+ (10431,'Staff','1987-10-08','1995-10-08'),
629
+ (10432,'Senior Staff','1996-08-12','9999-01-01'),
630
+ (10432,'Staff','1990-08-13','1996-08-12'),
631
+ (10433,'Assistant Engineer','1992-11-26','1999-11-27'),
632
+ (10433,'Engineer','1999-11-27','9999-01-01'),
633
+ (10434,'Engineer','1995-06-27','2001-06-26'),
634
+ (10434,'Senior Engineer','2001-06-26','2002-06-22'),
635
+ (10435,'Engineer','1996-06-08','9999-01-01'),
636
+ (10436,'Senior Staff','1988-01-30','9999-01-01'),
637
+ (10437,'Engineer','1996-04-12','9999-01-01'),
638
+ (10438,'Assistant Engineer','1990-01-19','1997-01-19'),
639
+ (10438,'Engineer','1997-01-19','9999-01-01'),
640
+ (10439,'Engineer','1993-05-01','2002-05-01'),
641
+ (10439,'Senior Engineer','2002-05-01','9999-01-01'),
642
+ (10440,'Technique Leader','1997-04-04','9999-01-01'),
643
+ (10441,'Engineer','1988-07-12','1993-07-12'),
644
+ (10441,'Senior Engineer','1993-07-12','9999-01-01'),
645
+ (10442,'Senior Staff','1999-02-12','2001-03-13'),
646
+ (10442,'Staff','1992-02-12','1999-02-12'),
647
+ (10443,'Senior Engineer','1989-08-01','2002-07-06'),
648
+ (10444,'Staff','1994-10-23','9999-01-01'),
649
+ (10445,'Engineer','1987-11-04','1993-11-03'),
650
+ (10445,'Senior Engineer','1993-11-03','9999-01-01'),
651
+ (10446,'Engineer','1996-12-25','9999-01-01'),
652
+ (10447,'Assistant Engineer','1988-12-29','1997-12-29'),
653
+ (10447,'Engineer','1997-12-29','2000-11-15'),
654
+ (10448,'Senior Staff','2000-03-12','9999-01-01'),
655
+ (10448,'Staff','1992-03-12','2000-03-12'),
656
+ (10449,'Senior Staff','1994-03-28','9999-01-01'),
657
+ (10449,'Staff','1987-03-28','1994-03-28'),
658
+ (10450,'Engineer','1997-08-24','9999-01-01'),
659
+ (10451,'Assistant Engineer','1988-03-12','1993-03-12'),
660
+ (10451,'Engineer','1993-03-12','1998-03-12'),
661
+ (10451,'Senior Engineer','1998-03-12','9999-01-01'),
662
+ (10452,'Engineer','1995-11-12','2000-11-11'),
663
+ (10452,'Senior Engineer','2000-11-11','2001-10-11'),
664
+ (10453,'Senior Staff','1993-04-02','9999-01-01'),
665
+ (10453,'Staff','1985-04-02','1993-04-02'),
666
+ (10454,'Senior Staff','1989-04-16','9999-01-01'),
667
+ (10455,'Senior Staff','2002-02-19','9999-01-01'),
668
+ (10455,'Staff','1995-02-19','2002-02-19'),
669
+ (10456,'Staff','2000-01-06','9999-01-01'),
670
+ (10457,'Senior Engineer','1999-10-23','9999-01-01'),
671
+ (10458,'Senior Staff','2002-07-05','9999-01-01'),
672
+ (10458,'Staff','1994-07-05','2002-07-05'),
673
+ (10459,'Staff','1997-06-28','9999-01-01'),
674
+ (10460,'Engineer','1999-06-30','2001-04-15'),
675
+ (10461,'Senior Staff','1992-08-02','9999-01-01'),
676
+ (10461,'Staff','1987-08-03','1992-08-02'),
677
+ (10462,'Senior Engineer','1996-03-25','9999-01-01'),
678
+ (10463,'Staff','1994-02-17','9999-01-01'),
679
+ (10464,'Senior Staff','1999-05-21','9999-01-01'),
680
+ (10464,'Staff','1991-05-21','1999-05-21'),
681
+ (10465,'Senior Staff','2001-12-11','9999-01-01'),
682
+ (10465,'Staff','1994-12-11','2001-12-11'),
683
+ (10466,'Staff','1997-08-22','2000-08-15'),
684
+ (10467,'Staff','1992-05-22','1999-11-01'),
685
+ (10468,'Senior Staff','1998-05-28','9999-01-01'),
686
+ (10468,'Staff','1991-05-28','1998-05-28'),
687
+ (10469,'Senior Engineer','1985-06-05','9999-01-01'),
688
+ (10470,'Engineer','1989-09-19','1994-09-19'),
689
+ (10470,'Senior Engineer','1994-09-19','9999-01-01'),
690
+ (10471,'Senior Engineer','1990-11-18','9999-01-01'),
691
+ (10472,'Staff','1999-12-01','2002-01-02'),
692
+ (10473,'Engineer','1997-09-23','9999-01-01'),
693
+ (10474,'Engineer','1987-02-21','1992-02-21'),
694
+ (10474,'Senior Engineer','1992-02-21','9999-01-01'),
695
+ (10475,'Engineer','1992-05-13','1994-12-30'),
696
+ (10476,'Senior Staff','1994-09-20','9999-01-01'),
697
+ (10476,'Staff','1987-09-20','1994-09-20'),
698
+ (10477,'Engineer','1997-05-26','2002-05-26'),
699
+ (10477,'Senior Engineer','2002-05-26','9999-01-01'),
700
+ (10478,'Senior Staff','1992-06-09','9999-01-01'),
701
+ (10479,'Senior Engineer','1993-07-24','9999-01-01'),
702
+ (10480,'Staff','1988-05-18','1989-06-03'),
703
+ (10481,'Engineer','1989-10-03','1998-10-03'),
704
+ (10481,'Senior Engineer','1998-10-03','9999-01-01'),
705
+ (10482,'Engineer','1996-02-26','9999-01-01'),
706
+ (10483,'Assistant Engineer','1993-11-10','1998-11-10'),
707
+ (10483,'Engineer','1998-11-10','9999-01-01'),
708
+ (10484,'Senior Staff','1996-12-20','9999-01-01'),
709
+ (10485,'Engineer','1996-01-21','9999-01-01'),
710
+ (10486,'Engineer','1987-10-08','1996-10-07'),
711
+ (10486,'Senior Engineer','1996-10-07','9999-01-01'),
712
+ (10487,'Engineer','1992-08-14','2001-08-14'),
713
+ (10487,'Senior Engineer','2001-08-14','9999-01-01'),
714
+ (10488,'Engineer','1994-07-09','2002-07-09'),
715
+ (10488,'Senior Engineer','2002-07-09','9999-01-01'),
716
+ (10489,'Engineer','1989-09-10','1989-10-06'),
717
+ (10490,'Senior Staff','1997-11-22','9999-01-01'),
718
+ (10490,'Staff','1992-11-22','1997-11-22'),
719
+ (10491,'Senior Staff','1998-01-17','9999-01-01'),
720
+ (10491,'Staff','1990-01-17','1998-01-17'),
721
+ (10492,'Engineer','1988-04-29','1997-04-29'),
722
+ (10492,'Senior Engineer','1997-04-29','9999-01-01'),
723
+ (10493,'Senior Staff','1998-10-29','9999-01-01'),
724
+ (10494,'Engineer','1991-12-18','2000-12-17'),
725
+ (10494,'Senior Engineer','2000-12-17','9999-01-01'),
726
+ (10495,'Technique Leader','1989-09-24','9999-01-01'),
727
+ (10496,'Staff','1995-08-29','1999-01-26'),
728
+ (10497,'Engineer','1992-01-22','1999-01-22'),
729
+ (10497,'Senior Engineer','1999-01-22','9999-01-01'),
730
+ (10498,'Engineer','1994-03-09','9999-01-01'),
731
+ (10499,'Senior Staff','2001-07-31','9999-01-01'),
732
+ (10499,'Staff','1996-07-31','2001-07-31'),
733
+ (10500,'Engineer','1996-12-16','9999-01-01'),
734
+ (10501,'Engineer','1988-09-08','1995-09-09'),
735
+ (10501,'Senior Engineer','1995-09-09','9999-01-01'),
736
+ (10502,'Technique Leader','1993-03-04','9999-01-01'),
737
+ (10503,'Engineer','1997-03-13','9999-01-01'),
738
+ (10504,'Staff','1999-10-19','9999-01-01'),
739
+ (10505,'Senior Staff','1994-07-23','1998-03-26'),
740
+ (10505,'Staff','1985-07-23','1994-07-23'),
741
+ (10506,'Senior Engineer','1996-12-01','9999-01-01'),
742
+ (10507,'Senior Staff','1999-09-30','9999-01-01'),
743
+ (10507,'Staff','1990-09-30','1999-09-30'),
744
+ (10508,'Engineer','1991-05-01','2000-04-30'),
745
+ (10508,'Senior Engineer','2000-04-30','9999-01-01'),
746
+ (10509,'Senior Staff','1997-10-06','9999-01-01'),
747
+ (10509,'Staff','1992-10-06','1997-10-06'),
748
+ (10510,'Senior Staff','1997-04-20','9999-01-01'),
749
+ (10510,'Staff','1990-04-20','1997-04-20'),
750
+ (10511,'Assistant Engineer','1992-01-27','2000-01-27'),
751
+ (10511,'Engineer','2000-01-27','9999-01-01'),
752
+ (10512,'Senior Staff','1998-11-28','9999-01-01'),
753
+ (10512,'Staff','1989-11-28','1998-11-28'),
754
+ (10513,'Senior Staff','1997-04-01','9999-01-01'),
755
+ (10513,'Staff','1991-04-02','1997-04-01'),
756
+ (10514,'Staff','1992-04-29','1995-04-02'),
757
+ (10515,'Senior Staff','1997-01-06','1998-07-21'),
758
+ (10515,'Staff','1990-01-06','1997-01-06'),
759
+ (10516,'Engineer','1985-10-19','1994-10-19'),
760
+ (10516,'Senior Engineer','1994-10-19','9999-01-01'),
761
+ (10517,'Senior Staff','1990-12-25','9999-01-01'),
762
+ (10518,'Technique Leader','1993-09-03','9999-01-01'),
763
+ (10519,'Senior Staff','2000-12-05','2001-10-13'),
764
+ (10519,'Staff','1992-12-05','2000-12-05'),
765
+ (10520,'Senior Engineer','1996-09-05','9999-01-01'),
766
+ (10521,'Senior Staff','1997-05-11','9999-01-01'),
767
+ (10521,'Staff','1989-05-11','1997-05-11'),
768
+ (10522,'Senior Staff','1995-12-12','9999-01-01'),
769
+ (10522,'Staff','1986-12-12','1995-12-12'),
770
+ (10523,'Engineer','1989-12-23','1994-12-23'),
771
+ (10523,'Senior Engineer','1994-12-23','9999-01-01'),
772
+ (10524,'Engineer','1985-10-09','1993-10-09'),
773
+ (10524,'Senior Engineer','1993-10-09','9999-01-01'),
774
+ (10525,'Senior Staff','1990-07-08','1995-12-20'),
775
+ (10526,'Engineer','1988-02-27','1997-02-26'),
776
+ (10526,'Senior Engineer','1997-02-26','9999-01-01'),
777
+ (10527,'Technique Leader','1996-01-25','9999-01-01'),
778
+ (10528,'Senior Engineer','1993-10-28','9999-01-01'),
779
+ (10529,'Assistant Engineer','1997-07-04','9999-01-01'),
780
+ (10530,'Engineer','1987-09-23','1994-09-23'),
781
+ (10530,'Senior Engineer','1994-09-23','9999-01-01'),
782
+ (10531,'Staff','1995-03-16','9999-01-01'),
783
+ (10532,'Senior Staff','1993-05-18','9999-01-01'),
784
+ (10532,'Staff','1986-05-18','1993-05-18'),
785
+ (10533,'Senior Staff','1996-08-16','9999-01-01'),
786
+ (10533,'Staff','1990-08-17','1996-08-16'),
787
+ (10534,'Staff','1998-01-26','2001-03-03'),
788
+ (10535,'Senior Staff','1996-08-21','9999-01-01'),
789
+ (10535,'Staff','1991-08-22','1996-08-21'),
790
+ (10536,'Senior Staff','1997-10-07','9999-01-01'),
791
+ (10536,'Staff','1988-10-07','1997-10-07'),
792
+ (10537,'Senior Staff','1996-09-25','9999-01-01'),
793
+ (10538,'Senior Engineer','1987-07-23','1998-12-13'),
794
+ (10539,'Senior Staff','1990-06-05','9999-01-01'),
795
+ (10540,'Engineer','1994-05-03','2002-05-03'),
796
+ (10540,'Senior Engineer','2002-05-03','9999-01-01'),
797
+ (10541,'Staff','1986-02-28','1986-10-01'),
798
+ (10542,'Senior Engineer','1992-02-07','9999-01-01'),
799
+ (10543,'Staff','1998-11-24','9999-01-01'),
800
+ (10544,'Senior Staff','1995-04-29','9999-01-01'),
801
+ (10545,'Engineer','1990-06-30','1996-06-29'),
802
+ (10545,'Senior Engineer','1996-06-29','9999-01-01'),
803
+ (10546,'Senior Staff','1998-04-14','9999-01-01'),
804
+ (10546,'Staff','1991-04-14','1998-04-14'),
805
+ (10547,'Technique Leader','1988-02-14','1989-06-19'),
806
+ (10548,'Senior Staff','1993-07-04','9999-01-01'),
807
+ (10548,'Staff','1986-07-04','1993-07-04'),
808
+ (10549,'Engineer','1996-10-11','2001-10-11'),
809
+ (10549,'Senior Engineer','2001-10-11','9999-01-01'),
810
+ (10550,'Engineer','1985-02-03','1994-02-03'),
811
+ (10550,'Senior Engineer','1994-02-03','9999-01-01'),
812
+ (10551,'Engineer','1988-08-06','1995-08-07'),
813
+ (10551,'Senior Engineer','1995-08-07','9999-01-01'),
814
+ (10552,'Senior Engineer','1998-08-31','9999-01-01'),
815
+ (10553,'Engineer','1990-07-22','1996-07-21'),
816
+ (10553,'Senior Engineer','1996-07-21','9999-01-01'),
817
+ (10554,'Engineer','1990-11-28','1995-11-28'),
818
+ (10554,'Senior Engineer','1995-11-28','9999-01-01'),
819
+ (10555,'Staff','1992-05-22','1993-01-19'),
820
+ (10556,'Senior Staff','1997-04-15','9999-01-01'),
821
+ (10556,'Staff','1992-04-15','1997-04-15'),
822
+ (10557,'Engineer','1992-09-18','2001-09-18'),
823
+ (10557,'Senior Engineer','2001-09-18','9999-01-01'),
824
+ (10558,'Senior Engineer','1992-04-22','9999-01-01'),
825
+ (10559,'Staff','1999-04-05','9999-01-01'),
826
+ (10560,'Engineer','1996-09-03','9999-01-01'),
827
+ (10561,'Senior Staff','1997-06-30','9999-01-01'),
828
+ (10562,'Engineer','1997-07-24','2002-07-24'),
829
+ (10562,'Senior Engineer','2002-07-24','9999-01-01'),
830
+ (10563,'Engineer','1992-09-29','1999-09-30'),
831
+ (10563,'Senior Engineer','1999-09-30','2002-01-01'),
832
+ (10564,'Engineer','1995-11-23','2000-11-22'),
833
+ (10564,'Senior Engineer','2000-11-22','9999-01-01'),
834
+ (10565,'Senior Engineer','1996-08-05','9999-01-01'),
835
+ (10566,'Engineer','1990-08-23','1997-10-26'),
836
+ (10567,'Senior Staff','1997-10-18','9999-01-01'),
837
+ (10567,'Staff','1992-10-18','1997-10-18'),
838
+ (10568,'Staff','1995-07-08','9999-01-01'),
839
+ (10569,'Senior Staff','1996-03-12','9999-01-01'),
840
+ (10569,'Staff','1987-03-13','1996-03-12'),
841
+ (10570,'Senior Staff','1995-06-16','2000-03-25'),
842
+ (10570,'Staff','1986-06-16','1995-06-16'),
843
+ (10571,'Assistant Engineer','1985-02-24','1991-02-24'),
844
+ (10571,'Engineer','1991-02-24','1997-02-23'),
845
+ (10571,'Senior Engineer','1997-02-23','9999-01-01'),
846
+ (10572,'Engineer','1988-02-16','1994-02-15'),
847
+ (10572,'Senior Engineer','1994-02-15','9999-01-01'),
848
+ (10573,'Staff','1999-08-20','9999-01-01'),
849
+ (10574,'Senior Staff','1999-11-15','9999-01-01'),
850
+ (10575,'Senior Engineer','1988-10-04','2000-11-22'),
851
+ (10576,'Senior Staff','1991-01-03','9999-01-01'),
852
+ (10577,'Senior Staff','2002-07-02','9999-01-01'),
853
+ (10577,'Staff','1993-07-02','2002-07-02'),
854
+ (10578,'Senior Engineer','1989-11-24','9999-01-01'),
855
+ (10579,'Senior Engineer','1991-06-02','9999-01-01'),
856
+ (10580,'Senior Staff','1997-03-01','9999-01-01'),
857
+ (10580,'Staff','1991-03-02','1997-03-01'),
858
+ (10581,'Engineer','1994-04-13','1999-04-13'),
859
+ (10581,'Senior Engineer','1999-04-13','9999-01-01'),
860
+ (10582,'Assistant Engineer','1995-11-06','9999-01-01'),
861
+ (10583,'Engineer','1985-02-14','1990-02-14'),
862
+ (10583,'Senior Engineer','1990-02-14','1998-05-29'),
863
+ (10584,'Engineer','1986-02-17','1993-02-17'),
864
+ (10584,'Senior Engineer','1993-02-17','9999-01-01'),
865
+ (10585,'Senior Engineer','1991-01-09','9999-01-01'),
866
+ (10586,'Engineer','1992-02-04','2000-02-04'),
867
+ (10586,'Senior Engineer','2000-02-04','9999-01-01'),
868
+ (10587,'Engineer','1991-11-20','1999-11-20'),
869
+ (10587,'Senior Engineer','1999-11-20','9999-01-01'),
870
+ (10588,'Engineer','1988-07-25','1993-07-25'),
871
+ (10588,'Senior Engineer','1993-07-25','9999-01-01'),
872
+ (10589,'Senior Staff','2002-01-26','9999-01-01'),
873
+ (10589,'Staff','1994-01-26','2002-01-26'),
874
+ (10590,'Senior Staff','1995-04-09','9999-01-01'),
875
+ (10590,'Staff','1986-04-09','1995-04-09'),
876
+ (10591,'Staff','1987-06-18','1988-09-20'),
877
+ (10592,'Staff','1993-09-27','9999-01-01'),
878
+ (10593,'Engineer','1990-09-12','1999-09-12'),
879
+ (10593,'Senior Engineer','1999-09-12','9999-01-01'),
880
+ (10594,'Engineer','1988-04-02','1996-04-02'),
881
+ (10594,'Senior Engineer','1996-04-02','9999-01-01'),
882
+ (10595,'Senior Engineer','1989-11-24','9999-01-01'),
883
+ (10596,'Senior Staff','2001-05-23','9999-01-01'),
884
+ (10596,'Staff','1996-05-23','2001-05-23'),
885
+ (10597,'Senior Staff','1995-04-01','9999-01-01'),
886
+ (10597,'Staff','1990-04-01','1995-04-01'),
887
+ (10598,'Senior Engineer','1998-06-22','2000-09-27'),
888
+ (10599,'Technique Leader','1991-11-17','9999-01-01'),
889
+ (10600,'Senior Staff','1997-04-27','9999-01-01'),
890
+ (10600,'Staff','1992-04-27','1997-04-27'),
891
+ (10601,'Staff','1999-07-24','2002-05-09'),
892
+ (10602,'Staff','1989-04-23','1993-11-06'),
893
+ (10603,'Staff','1995-07-20','9999-01-01'),
894
+ (10604,'Engineer','1990-04-07','1997-04-07'),
895
+ (10604,'Senior Engineer','1997-04-07','9999-01-01'),
896
+ (10605,'Engineer','1993-07-01','1998-07-01'),
897
+ (10605,'Senior Engineer','1998-07-01','9999-01-01'),
898
+ (10606,'Engineer','1987-05-02','1992-05-01'),
899
+ (10606,'Senior Engineer','1992-05-01','9999-01-01'),
900
+ (10607,'Engineer','1996-01-13','9999-01-01'),
901
+ (10608,'Senior Engineer','1986-05-25','1991-06-02'),
902
+ (10609,'Assistant Engineer','1994-12-03','1999-12-03'),
903
+ (10609,'Engineer','1999-12-03','9999-01-01'),
904
+ (10610,'Engineer','1997-03-30','9999-01-01'),
905
+ (10611,'Senior Engineer','1989-09-16','9999-01-01'),
906
+ (10612,'Assistant Engineer','1991-09-02','1996-09-01'),
907
+ (10612,'Engineer','1996-09-01','2001-09-01'),
908
+ (10612,'Senior Engineer','2001-09-01','9999-01-01'),
909
+ (10613,'Staff','1997-10-13','9999-01-01'),
910
+ (10614,'Engineer','1990-03-03','1998-03-03'),
911
+ (10614,'Senior Engineer','1998-03-03','9999-01-01'),
912
+ (10615,'Senior Staff','2002-03-10','9999-01-01'),
913
+ (10615,'Staff','1996-03-10','2002-03-10'),
914
+ (10616,'Staff','1996-11-07','9999-01-01'),
915
+ (10617,'Senior Staff','1991-10-30','2001-10-03'),
916
+ (10618,'Engineer','1994-10-07','9999-01-01'),
917
+ (10619,'Senior Staff','1993-04-09','9999-01-01'),
918
+ (10620,'Assistant Engineer','1990-11-10','1999-11-10'),
919
+ (10620,'Engineer','1999-11-10','9999-01-01'),
920
+ (10621,'Engineer','1992-02-10','1999-02-10'),
921
+ (10621,'Senior Engineer','1999-02-10','9999-01-01'),
922
+ (10622,'Engineer','1989-05-15','1996-05-15'),
923
+ (10622,'Senior Engineer','1996-05-15','9999-01-01'),
924
+ (10623,'Engineer','1992-01-15','1999-01-15'),
925
+ (10623,'Senior Engineer','1999-01-15','9999-01-01'),
926
+ (10624,'Technique Leader','1990-05-07','9999-01-01'),
927
+ (10625,'Engineer','1986-07-15','1991-07-15'),
928
+ (10625,'Senior Engineer','1991-07-15','1995-01-13'),
929
+ (10626,'Staff','1996-12-03','9999-01-01'),
930
+ (10627,'Senior Staff','2001-03-12','9999-01-01'),
931
+ (10627,'Staff','1995-03-13','2001-03-12'),
932
+ (10628,'Assistant Engineer','1987-03-14','1994-03-14'),
933
+ (10628,'Engineer','1994-03-14','2001-03-14'),
934
+ (10628,'Senior Engineer','2001-03-14','9999-01-01'),
935
+ (10629,'Staff','1999-10-20','2001-12-07'),
936
+ (10630,'Engineer','1997-01-13','9999-01-01'),
937
+ (10631,'Engineer','1994-10-18','9999-01-01'),
938
+ (10632,'Technique Leader','1985-07-25','1987-11-20'),
939
+ (10633,'Staff','1997-05-16','9999-01-01'),
940
+ (10634,'Assistant Engineer','1990-11-11','1995-11-11'),
941
+ (10634,'Engineer','1995-11-11','2000-11-10'),
942
+ (10634,'Senior Engineer','2000-11-10','9999-01-01'),
943
+ (10635,'Senior Engineer','1991-09-22','1999-12-20'),
944
+ (10636,'Staff','1996-09-25','9999-01-01'),
945
+ (10637,'Senior Staff','1998-07-11','2000-01-19'),
946
+ (10637,'Staff','1993-07-11','1998-07-11'),
947
+ (10638,'Senior Staff','2000-11-09','9999-01-01'),
948
+ (10638,'Staff','1994-11-10','2000-11-09'),
949
+ (10639,'Engineer','1992-10-25','1999-10-26'),
950
+ (10639,'Senior Engineer','1999-10-26','9999-01-01'),
951
+ (10640,'Senior Staff','1992-12-04','9999-01-01'),
952
+ (10641,'Assistant Engineer','1993-03-21','1999-03-21'),
953
+ (10641,'Engineer','1999-03-21','9999-01-01'),
954
+ (10642,'Engineer','1998-10-05','9999-01-01'),
955
+ (10643,'Engineer','1987-11-11','1994-11-11'),
956
+ (10643,'Senior Engineer','1994-11-11','9999-01-01'),
957
+ (10644,'Senior Staff','1994-05-29','1995-08-25'),
958
+ (10644,'Staff','1985-05-29','1994-05-29'),
959
+ (10645,'Engineer','1988-03-01','1995-03-02'),
960
+ (10645,'Senior Engineer','1995-03-02','9999-01-01'),
961
+ (10646,'Senior Staff','2002-01-30','9999-01-01'),
962
+ (10646,'Staff','1996-01-31','2002-01-30'),
963
+ (10647,'Assistant Engineer','1997-09-03','9999-01-01'),
964
+ (10648,'Engineer','1988-02-16','1993-02-15'),
965
+ (10648,'Senior Engineer','1993-02-15','9999-01-01'),
966
+ (10649,'Senior Staff','1998-06-23','9999-01-01'),
967
+ (10650,'Assistant Engineer','1992-10-04','2000-10-04'),
968
+ (10650,'Engineer','2000-10-04','9999-01-01'),
969
+ (10651,'Senior Staff','2002-01-07','9999-01-01'),
970
+ (10651,'Staff','1996-01-08','2002-01-07'),
971
+ (10652,'Staff','1990-02-12','1992-01-13'),
972
+ (10653,'Senior Engineer','1987-04-30','9999-01-01'),
973
+ (10654,'Engineer','1990-03-25','1999-03-25'),
974
+ (10654,'Senior Engineer','1999-03-25','9999-01-01'),
975
+ (10655,'Senior Staff','1997-07-04','9999-01-01'),
976
+ (10656,'Engineer','1988-06-21','1993-06-21'),
977
+ (10656,'Senior Engineer','1993-06-21','9999-01-01'),
978
+ (10657,'Senior Staff','1999-03-27','9999-01-01'),
979
+ (10657,'Staff','1992-03-26','1999-03-27'),
980
+ (10658,'Senior Staff','1994-04-29','9999-01-01'),
981
+ (10659,'Engineer','1995-06-01','2000-05-31'),
982
+ (10659,'Senior Engineer','2000-05-31','9999-01-01'),
983
+ (10660,'Senior Engineer','1988-08-12','1991-07-12'),
984
+ (10661,'Senior Staff','1993-01-11','9999-01-01'),
985
+ (10661,'Staff','1988-01-12','1993-01-11'),
986
+ (10662,'Engineer','1999-12-17','9999-01-01'),
987
+ (10663,'Technique Leader','1993-01-23','9999-01-01'),
988
+ (10664,'Engineer','1989-12-24','1998-12-24'),
989
+ (10664,'Senior Engineer','1998-12-24','9999-01-01'),
990
+ (10665,'Engineer','1988-01-23','1995-01-23'),
991
+ (10665,'Senior Engineer','1995-01-23','2000-07-13'),
992
+ (10666,'Senior Staff','1998-05-20','9999-01-01'),
993
+ (10666,'Staff','1989-05-20','1998-05-20'),
994
+ (10667,'Senior Staff','1999-07-28','9999-01-01'),
995
+ (10668,'Staff','1997-11-28','1999-09-03'),
996
+ (10669,'Senior Staff','2001-11-17','9999-01-01'),
997
+ (10669,'Staff','1996-11-17','2001-11-17'),
998
+ (10670,'Senior Staff','1993-03-23','9999-01-01'),
999
+ (10670,'Staff','1988-03-23','1993-03-23'),
1000
+ (10671,'Senior Staff','2001-09-13','9999-01-01'),
1001
+ (10671,'Staff','1995-09-14','2001-09-13'),
1002
+ (10672,'Senior Engineer','1991-09-29','1996-04-19'),
1003
+ (10673,'Engineer','1994-07-29','1998-01-14'),
1004
+ (10674,'Engineer','1999-03-17','9999-01-01'),
1005
+ (10675,'Senior Staff','1993-02-02','9999-01-01'),
1006
+ (10676,'Engineer','1999-09-04','9999-01-01'),
1007
+ (10677,'Engineer','1999-10-13','9999-01-01'),
1008
+ (10678,'Engineer','1987-08-02','1995-08-02'),
1009
+ (10678,'Senior Engineer','1995-08-02','9999-01-01'),
1010
+ (10679,'Senior Staff','1997-05-13','9999-01-01'),
1011
+ (10679,'Staff','1990-05-13','1997-05-13'),
1012
+ (10680,'Senior Engineer','1992-11-21','1998-12-08'),
1013
+ (10681,'Staff','1995-10-02','9999-01-01'),
1014
+ (10682,'Senior Staff','1990-11-09','9999-01-01'),
1015
+ (10683,'Senior Engineer','1997-06-23','9999-01-01'),
1016
+ (10684,'Engineer','1999-10-28','9999-01-01'),
1017
+ (10685,'Senior Staff','1995-12-27','1996-10-20'),
1018
+ (10686,'Senior Engineer','1987-05-17','9999-01-01'),
1019
+ (10687,'Senior Staff','1999-03-13','9999-01-01'),
1020
+ (10687,'Staff','1990-03-13','1999-03-13'),
1021
+ (10688,'Senior Staff','1986-04-13','9999-01-01'),
1022
+ (10689,'Senior Staff','1993-08-05','9999-01-01'),
1023
+ (10689,'Staff','1988-08-05','1993-08-05'),
1024
+ (10690,'Engineer','1989-08-22','1994-08-22'),
1025
+ (10690,'Senior Engineer','1994-08-22','9999-01-01'),
1026
+ (10691,'Technique Leader','1989-09-17','9999-01-01'),
1027
+ (10692,'Senior Staff','2000-03-22','9999-01-01'),
1028
+ (10692,'Staff','1993-03-22','2000-03-22'),
1029
+ (10693,'Senior Staff','1991-01-08','9999-01-01'),
1030
+ (10693,'Staff','1986-01-08','1991-01-08'),
1031
+ (10694,'Senior Staff','1993-01-25','2001-07-11'),
1032
+ (10694,'Staff','1988-01-26','1993-01-25'),
1033
+ (10695,'Engineer','1998-05-19','9999-01-01'),
1034
+ (10696,'Technique Leader','1991-09-09','9999-01-01'),
1035
+ (10697,'Staff','1999-08-29','9999-01-01'),
1036
+ (10698,'Senior Engineer','1994-12-08','9999-01-01'),
1037
+ (10699,'Engineer','1985-11-17','1993-11-17'),
1038
+ (10699,'Senior Engineer','1993-11-17','9999-01-01'),
1039
+ (10700,'Engineer','1998-04-14','2002-06-27'),
1040
+ (10701,'Senior Staff','1994-10-27','9999-01-01'),
1041
+ (10701,'Staff','1986-10-27','1994-10-27'),
1042
+ (10702,'Senior Engineer','1991-01-14','9999-01-01'),
1043
+ (10703,'Engineer','1996-05-12','2002-05-12'),
1044
+ (10703,'Senior Engineer','2002-05-12','9999-01-01'),
1045
+ (10704,'Senior Staff','2001-02-16','9999-01-01'),
1046
+ (10704,'Staff','1995-02-17','2001-02-16'),
1047
+ (10705,'Senior Staff','1996-07-17','9999-01-01'),
1048
+ (10705,'Staff','1990-07-18','1996-07-17'),
1049
+ (10706,'Technique Leader','1994-05-03','2001-04-08'),
1050
+ (10707,'Engineer','1990-12-24','1997-12-24'),
1051
+ (10707,'Senior Engineer','1997-12-24','9999-01-01'),
1052
+ (10708,'Staff','1999-11-09','9999-01-01'),
1053
+ (10709,'Engineer','1986-02-02','1992-02-02'),
1054
+ (10709,'Senior Engineer','1992-02-02','9999-01-01'),
1055
+ (10710,'Senior Staff','2000-07-08','9999-01-01'),
1056
+ (10710,'Staff','1995-07-09','2000-07-08'),
1057
+ (10711,'Engineer','1991-06-21','1996-06-20'),
1058
+ (10711,'Senior Engineer','1996-06-20','9999-01-01'),
1059
+ (10712,'Engineer','1994-08-18','2001-08-18'),
1060
+ (10712,'Senior Engineer','2001-08-18','9999-01-01'),
1061
+ (10713,'Senior Staff','1986-04-26','2001-02-21'),
1062
+ (10714,'Engineer','1999-11-24','9999-01-01'),
1063
+ (10715,'Engineer','1999-10-28','9999-01-01'),
1064
+ (10716,'Engineer','1987-08-12','1993-08-11'),
1065
+ (10716,'Senior Engineer','1993-08-11','9999-01-01'),
1066
+ (10717,'Senior Staff','1996-09-12','9999-01-01'),
1067
+ (10717,'Staff','1991-09-13','1996-09-12'),
1068
+ (10718,'Engineer','1988-07-21','1997-07-21'),
1069
+ (10718,'Senior Engineer','1997-07-21','9999-01-01'),
1070
+ (10719,'Assistant Engineer','1995-09-05','1999-07-31'),
1071
+ (10720,'Senior Staff','1996-06-26','9999-01-01'),
1072
+ (10721,'Staff','1999-07-15','9999-01-01'),
1073
+ (10722,'Senior Staff','1994-01-17','2000-04-14'),
1074
+ (10722,'Staff','1989-01-17','1994-01-17'),
1075
+ (10723,'Technique Leader','1997-07-14','9999-01-01'),
1076
+ (10724,'Engineer','1995-12-07','2001-12-06'),
1077
+ (10724,'Senior Engineer','2001-12-06','9999-01-01'),
1078
+ (10725,'Senior Staff','1990-09-08','9999-01-01'),
1079
+ (10726,'Engineer','1992-02-25','2001-02-24'),
1080
+ (10726,'Senior Engineer','2001-02-24','9999-01-01'),
1081
+ (10727,'Senior Staff','1998-01-08','2000-06-06'),
1082
+ (10727,'Staff','1991-01-08','1998-01-08'),
1083
+ (10728,'Engineer','1989-12-09','1998-12-09'),
1084
+ (10728,'Senior Engineer','1998-12-09','9999-01-01'),
1085
+ (10729,'Senior Engineer','1986-04-20','9999-01-01'),
1086
+ (10730,'Senior Engineer','1996-05-14','1998-06-07'),
1087
+ (10731,'Senior Staff','1994-02-20','2000-10-09'),
1088
+ (10731,'Staff','1987-02-20','1994-02-20'),
1089
+ (10732,'Senior Engineer','1994-12-21','9999-01-01'),
1090
+ (10733,'Senior Staff','2002-02-19','9999-01-01'),
1091
+ (10733,'Staff','1996-02-20','2002-02-19'),
1092
+ (10734,'Engineer','1995-12-19','9999-01-01'),
1093
+ (10735,'Senior Staff','1993-10-29','9999-01-01'),
1094
+ (10735,'Staff','1985-10-29','1993-10-29'),
1095
+ (10736,'Senior Engineer','1991-09-26','9999-01-01'),
1096
+ (10737,'Engineer','1999-06-22','9999-01-01'),
1097
+ (10738,'Technique Leader','1991-04-30','9999-01-01'),
1098
+ (10739,'Assistant Engineer','1985-03-30','1994-03-30'),
1099
+ (10739,'Engineer','1994-03-30','9999-01-01'),
1100
+ (10740,'Engineer','1996-04-30','2002-03-17'),
1101
+ (10741,'Senior Staff','1997-01-06','9999-01-01'),
1102
+ (10741,'Staff','1989-01-06','1997-01-06'),
1103
+ (10742,'Technique Leader','1997-04-03','9999-01-01'),
1104
+ (10743,'Staff','1999-11-05','9999-01-01'),
1105
+ (10744,'Staff','1985-12-29','1992-06-03'),
1106
+ (10745,'Engineer','1988-01-23','1997-01-22'),
1107
+ (10745,'Senior Engineer','1997-01-22','9999-01-01'),
1108
+ (10746,'Technique Leader','1990-08-31','9999-01-01'),
1109
+ (10747,'Senior Engineer','1990-10-08','1999-09-20'),
1110
+ (10748,'Senior Staff','1996-08-13','9999-01-01'),
1111
+ (10748,'Staff','1990-08-14','1996-08-13'),
1112
+ (10749,'Engineer','1985-09-26','1990-09-26'),
1113
+ (10749,'Senior Engineer','1990-09-26','9999-01-01'),
1114
+ (10750,'Technique Leader','1998-11-06','9999-01-01'),
1115
+ (10751,'Engineer','1999-12-14','2000-12-05'),
1116
+ (10752,'Senior Engineer','1993-05-28','9999-01-01'),
1117
+ (10753,'Engineer','1985-05-17','1993-05-17'),
1118
+ (10753,'Senior Engineer','1993-05-17','1999-08-25'),
1119
+ (10754,'Senior Staff','1988-01-11','9999-01-01'),
1120
+ (10755,'Assistant Engineer','1995-04-01','2001-11-13'),
1121
+ (10756,'Senior Engineer','1997-10-07','9999-01-01'),
1122
+ (10757,'Engineer','1986-01-06','1991-10-18'),
1123
+ (10758,'Engineer','1999-07-01','9999-01-01'),
1124
+ (10759,'Technique Leader','1991-12-04','9999-01-01'),
1125
+ (10760,'Senior Staff','1997-08-22','9999-01-01'),
1126
+ (10761,'Staff','1992-05-30','1999-01-04'),
1127
+ (10762,'Senior Staff','1999-01-21','9999-01-01'),
1128
+ (10762,'Staff','1992-01-21','1999-01-21'),
1129
+ (10763,'Engineer','1987-02-23','1993-02-22'),
1130
+ (10763,'Senior Engineer','1993-02-22','9999-01-01'),
1131
+ (10764,'Engineer','1989-11-27','1998-11-27'),
1132
+ (10764,'Senior Engineer','1998-11-27','9999-01-01'),
1133
+ (10765,'Staff','1994-05-07','1994-05-11'),
1134
+ (10766,'Staff','1999-09-18','9999-01-01'),
1135
+ (10767,'Staff','1997-07-15','9999-01-01'),
1136
+ (10768,'Engineer','1985-07-04','1990-07-04'),
1137
+ (10768,'Senior Engineer','1990-07-04','9999-01-01'),
1138
+ (10769,'Technique Leader','1991-08-30','9999-01-01'),
1139
+ (10770,'Senior Staff','1987-12-25','1989-02-27'),
1140
+ (10771,'Senior Staff','1996-04-01','9999-01-01'),
1141
+ (10772,'Senior Engineer','1990-02-22','9999-01-01'),
1142
+ (10773,'Staff','1997-02-09','1997-11-29'),
1143
+ (10774,'Engineer','1990-01-26','1995-01-26'),
1144
+ (10774,'Senior Engineer','1995-01-26','9999-01-01'),
1145
+ (10775,'Engineer','1994-12-30','1999-12-30'),
1146
+ (10775,'Senior Engineer','1999-12-30','9999-01-01'),
1147
+ (10776,'Technique Leader','1986-03-16','9999-01-01'),
1148
+ (10777,'Engineer','1990-03-17','1996-03-16'),
1149
+ (10777,'Senior Engineer','1996-03-16','2001-03-27'),
1150
+ (10778,'Senior Staff','1986-07-04','9999-01-01'),
1151
+ (10779,'Senior Staff','1993-01-10','9999-01-01'),
1152
+ (10779,'Staff','1988-01-11','1993-01-10'),
1153
+ (10780,'Engineer','1994-08-01','1996-08-18'),
1154
+ (10781,'Senior Staff','1997-02-03','9999-01-01'),
1155
+ (10781,'Staff','1991-02-04','1997-02-03'),
1156
+ (10782,'Staff','1997-07-06','2002-03-30'),
1157
+ (10783,'Senior Staff','1999-05-15','9999-01-01'),
1158
+ (10783,'Staff','1994-05-15','1999-05-15'),
1159
+ (10784,'Assistant Engineer','1998-10-14','9999-01-01'),
1160
+ (10785,'Engineer','1994-11-11','2001-11-11'),
1161
+ (10785,'Senior Engineer','2001-11-11','9999-01-01'),
1162
+ (10786,'Senior Engineer','1997-06-06','9999-01-01'),
1163
+ (10787,'Senior Staff','2000-07-18','2002-07-27'),
1164
+ (10787,'Staff','1991-07-19','2000-07-18'),
1165
+ (10788,'Staff','1998-05-29','9999-01-01'),
1166
+ (10789,'Staff','1998-01-26','9999-01-01'),
1167
+ (10790,'Engineer','1999-03-02','9999-01-01'),
1168
+ (10791,'Engineer','1988-07-30','1995-07-31'),
1169
+ (10791,'Senior Engineer','1995-07-31','9999-01-01'),
1170
+ (10792,'Engineer','1985-08-10','1992-08-10'),
1171
+ (10792,'Senior Engineer','1992-08-10','1993-12-20'),
1172
+ (10793,'Senior Engineer','1990-09-18','9999-01-01'),
1173
+ (10794,'Senior Staff','2000-05-23','9999-01-01'),
1174
+ (10794,'Staff','1994-05-24','2000-05-23'),
1175
+ (10795,'Senior Staff','1999-05-03','9999-01-01'),
1176
+ (10795,'Staff','1993-05-03','1999-05-03'),
1177
+ (10796,'Technique Leader','1990-11-08','9999-01-01'),
1178
+ (10797,'Assistant Engineer','1988-08-21','1997-08-21'),
1179
+ (10797,'Engineer','1997-08-21','9999-01-01'),
1180
+ (10798,'Engineer','1996-09-21','2001-09-21'),
1181
+ (10798,'Senior Engineer','2001-09-21','9999-01-01'),
1182
+ (10799,'Engineer','1989-03-01','1995-03-01'),
1183
+ (10799,'Senior Engineer','1995-03-01','9999-01-01'),
1184
+ (10800,'Engineer','1993-05-20','1998-05-20'),
1185
+ (10800,'Senior Engineer','1998-05-20','9999-01-01'),
1186
+ (10801,'Engineer','1998-04-07','2001-01-15'),
1187
+ (10802,'Engineer','1985-08-24','1990-08-24'),
1188
+ (10802,'Senior Engineer','1990-08-24','9999-01-01'),
1189
+ (10803,'Engineer','1988-04-20','1997-04-20'),
1190
+ (10803,'Senior Engineer','1997-04-20','2002-04-02'),
1191
+ (10804,'Staff','1997-06-09','9999-01-01'),
1192
+ (10805,'Senior Staff','1996-05-25','9999-01-01'),
1193
+ (10805,'Staff','1987-05-26','1996-05-25'),
1194
+ (10806,'Senior Staff','2000-04-25','9999-01-01'),
1195
+ (10806,'Staff','1993-04-25','2000-04-25'),
1196
+ (10807,'Senior Staff','1999-10-19','9999-01-01'),
1197
+ (10808,'Senior Engineer','1987-03-07','9999-01-01'),
1198
+ (10809,'Engineer','1988-02-25','1994-02-24'),
1199
+ (10809,'Senior Engineer','1994-02-24','9999-01-01'),
1200
+ (10810,'Senior Staff','2000-09-06','9999-01-01'),
1201
+ (10810,'Staff','1994-09-07','2000-09-06'),
1202
+ (10811,'Engineer','1997-07-08','9999-01-01'),
1203
+ (10812,'Engineer','1996-09-20','1997-10-06'),
1204
+ (10813,'Senior Staff','1990-04-27','9999-01-01'),
1205
+ (10814,'Senior Staff','1998-07-17','9999-01-01'),
1206
+ (10814,'Staff','1993-07-17','1998-07-17'),
1207
+ (10815,'Senior Staff','2002-04-19','9999-01-01'),
1208
+ (10815,'Staff','1994-04-19','2002-04-19'),
1209
+ (10816,'Senior Staff','1991-05-22','9999-01-01'),
1210
+ (10817,'Senior Staff','1998-12-26','9999-01-01'),
1211
+ (10817,'Staff','1990-12-26','1998-12-26'),
1212
+ (10818,'Staff','1998-04-09','9999-01-01'),
1213
+ (10819,'Engineer','1986-08-02','1993-08-02'),
1214
+ (10819,'Senior Engineer','1993-08-02','1999-12-28'),
1215
+ (10820,'Senior Staff','1992-06-26','9999-01-01'),
1216
+ (10821,'Engineer','1988-10-06','1990-04-17'),
1217
+ (10822,'Engineer','1986-01-11','1992-01-11'),
1218
+ (10822,'Senior Engineer','1992-01-11','9999-01-01'),
1219
+ (10823,'Staff','1999-08-19','9999-01-01'),
1220
+ (10824,'Staff','1995-08-01','9999-01-01'),
1221
+ (10825,'Engineer','1993-12-04','1998-12-04'),
1222
+ (10825,'Senior Engineer','1998-12-04','9999-01-01'),
1223
+ (10826,'Senior Engineer','1993-01-22','9999-01-01'),
1224
+ (10827,'Staff','1996-11-07','9999-01-01'),
1225
+ (10828,'Staff','1986-02-14','1990-03-30'),
1226
+ (10829,'Staff','1993-07-21','1993-11-29'),
1227
+ (10830,'Senior Staff','1997-08-23','9999-01-01'),
1228
+ (10830,'Staff','1991-08-24','1997-08-23'),
1229
+ (10831,'Technique Leader','1998-02-22','9999-01-01'),
1230
+ (10832,'Senior Staff','1992-10-10','9999-01-01'),
1231
+ (10832,'Staff','1986-10-11','1992-10-10'),
1232
+ (10833,'Technique Leader','1998-12-23','9999-01-01'),
1233
+ (10834,'Assistant Engineer','1990-11-24','1999-11-24'),
1234
+ (10834,'Engineer','1999-11-24','9999-01-01'),
1235
+ (10835,'Engineer','1995-08-22','9999-01-01'),
1236
+ (10836,'Senior Staff','1987-08-10','9999-01-01'),
1237
+ (10837,'Senior Staff','1993-01-14','2002-02-22'),
1238
+ (10837,'Staff','1986-01-14','1993-01-14'),
1239
+ (10838,'Engineer','1994-04-26','2001-04-26'),
1240
+ (10838,'Senior Engineer','2001-04-26','9999-01-01'),
1241
+ (10839,'Assistant Engineer','1996-12-30','9999-01-01'),
1242
+ (10840,'Engineer','1993-06-04','1998-06-04'),
1243
+ (10840,'Senior Engineer','1998-06-04','9999-01-01'),
1244
+ (10841,'Senior Staff','1997-01-21','9999-01-01'),
1245
+ (10841,'Staff','1992-01-22','1997-01-21'),
1246
+ (10842,'Engineer','1986-07-14','1991-07-14'),
1247
+ (10842,'Senior Engineer','1991-07-14','1998-06-27'),
1248
+ (10843,'Engineer','1990-04-26','1998-04-26'),
1249
+ (10843,'Senior Engineer','1998-04-26','9999-01-01'),
1250
+ (10844,'Engineer','1997-04-25','9999-01-01'),
1251
+ (10845,'Engineer','1997-01-25','2002-01-25'),
1252
+ (10845,'Senior Engineer','2002-01-25','9999-01-01'),
1253
+ (10846,'Senior Engineer','1995-01-17','9999-01-01'),
1254
+ (10847,'Senior Staff','1992-07-24','9999-01-01'),
1255
+ (10847,'Staff','1986-07-25','1992-07-24'),
1256
+ (10848,'Engineer','1985-04-20','1992-04-20'),
1257
+ (10848,'Senior Engineer','1992-04-20','9999-01-01'),
1258
+ (10849,'Assistant Engineer','1995-06-25','2001-06-24'),
1259
+ (10849,'Engineer','2001-06-24','9999-01-01'),
1260
+ (10850,'Staff','1990-04-22','1995-05-11'),
1261
+ (10851,'Senior Staff','1999-11-21','9999-01-01'),
1262
+ (10851,'Staff','1994-11-21','1999-11-21'),
1263
+ (10852,'Technique Leader','1999-08-21','9999-01-01'),
1264
+ (10853,'Technique Leader','1993-05-03','9999-01-01'),
1265
+ (10854,'Engineer','1998-07-13','9999-01-01'),
1266
+ (10855,'Senior Staff','1993-03-29','9999-01-01'),
1267
+ (10856,'Staff','1986-12-31','1990-06-18'),
1268
+ (10857,'Senior Staff','1996-04-02','9999-01-01'),
1269
+ (10857,'Staff','1990-04-04','1996-04-02'),
1270
+ (10858,'Engineer','1997-01-01','2002-01-01'),
1271
+ (10858,'Senior Engineer','2002-01-01','9999-01-01'),
1272
+ (10859,'Staff','1996-05-21','9999-01-01'),
1273
+ (10860,'Technique Leader','1998-01-22','9999-01-01'),
1274
+ (10861,'Senior Engineer','1989-06-10','1992-04-12'),
1275
+ (10862,'Senior Staff','1992-07-23','9999-01-01'),
1276
+ (10862,'Staff','1985-07-23','1992-07-23'),
1277
+ (10863,'Engineer','1985-12-25','1991-12-25'),
1278
+ (10863,'Senior Engineer','1991-12-25','9999-01-01'),
1279
+ (10864,'Senior Staff','1992-09-24','9999-01-01'),
1280
+ (10864,'Staff','1986-09-25','1992-09-24'),
1281
+ (10865,'Staff','1993-05-29','1993-09-19'),
1282
+ (10866,'Senior Staff','1995-12-27','9999-01-01'),
1283
+ (10866,'Staff','1990-12-27','1995-12-27'),
1284
+ (10867,'Engineer','1997-03-23','2002-03-22'),
1285
+ (10868,'Engineer','1990-03-20','1999-03-20'),
1286
+ (10868,'Senior Engineer','1999-03-20','9999-01-01'),
1287
+ (10869,'Staff','1997-09-04','1998-10-15'),
1288
+ (10870,'Senior Engineer','1988-01-13','9999-01-01'),
1289
+ (10871,'Staff','1999-06-16','9999-01-01'),
1290
+ (10872,'Senior Staff','1996-09-05','9999-01-01'),
1291
+ (10872,'Staff','1990-09-06','1996-09-05'),
1292
+ (10873,'Staff','1994-03-23','9999-01-01'),
1293
+ (10874,'Engineer','1986-04-22','1992-04-21'),
1294
+ (10874,'Senior Engineer','1992-04-21','9999-01-01'),
1295
+ (10875,'Senior Engineer','1988-05-19','9999-01-01'),
1296
+ (10876,'Staff','1995-01-29','1999-09-14'),
1297
+ (10877,'Senior Staff','1986-06-06','9999-01-01'),
1298
+ (10878,'Staff','1997-04-25','9999-01-01'),
1299
+ (10879,'Senior Engineer','1985-08-15','9999-01-01'),
1300
+ (10880,'Engineer','1992-01-11','1997-01-10'),
1301
+ (10880,'Senior Engineer','1997-01-10','9999-01-01'),
1302
+ (10881,'Engineer','1997-02-18','1998-10-25'),
1303
+ (10882,'Engineer','1999-04-29','9999-01-01'),
1304
+ (10883,'Engineer','1996-12-28','9999-01-01'),
1305
+ (10884,'Engineer','1993-04-15','1998-04-15'),
1306
+ (10884,'Senior Engineer','1998-04-15','9999-01-01'),
1307
+ (10885,'Senior Staff','1991-08-19','9999-01-01'),
1308
+ (10886,'Engineer','1995-03-26','2000-03-25'),
1309
+ (10886,'Senior Engineer','2000-03-25','9999-01-01'),
1310
+ (10887,'Senior Engineer','1989-03-17','9999-01-01'),
1311
+ (10888,'Engineer','1987-06-28','1989-09-11'),
1312
+ (10889,'Senior Staff','1987-08-11','9999-01-01'),
1313
+ (10890,'Senior Staff','1990-03-10','9999-01-01'),
1314
+ (10891,'Assistant Engineer','1995-10-06','2001-10-05'),
1315
+ (10891,'Engineer','2001-10-05','9999-01-01'),
1316
+ (10892,'Senior Staff','1998-04-11','9999-01-01'),
1317
+ (10892,'Staff','1990-04-11','1998-04-11'),
1318
+ (10893,'Senior Staff','1995-08-23','9999-01-01'),
1319
+ (10893,'Staff','1989-08-23','1995-08-23'),
1320
+ (10894,'Engineer','1995-12-05','9999-01-01'),
1321
+ (10895,'Staff','1986-04-26','1987-04-13'),
1322
+ (10896,'Engineer','1997-11-27','9999-01-01'),
1323
+ (10897,'Senior Staff','1995-04-09','9999-01-01'),
1324
+ (10897,'Staff','1986-04-09','1995-04-09'),
1325
+ (10898,'Senior Engineer','1993-01-08','9999-01-01'),
1326
+ (10899,'Senior Staff','1999-04-05','9999-01-01'),
1327
+ (10899,'Staff','1990-04-05','1999-04-05'),
1328
+ (10900,'Senior Engineer','1995-09-07','9999-01-01'),
1329
+ (10901,'Staff','1998-08-05','9999-01-01'),
1330
+ (10902,'Assistant Engineer','1990-06-11','1990-09-25'),
1331
+ (10903,'Senior Staff','1997-02-14','9999-01-01'),
1332
+ (10903,'Staff','1989-02-14','1997-02-14'),
1333
+ (10904,'Engineer','1993-04-16','1999-04-16'),
1334
+ (10904,'Senior Engineer','1999-04-16','9999-01-01'),
1335
+ (10905,'Senior Engineer','1985-02-28','1986-03-07'),
1336
+ (10906,'Staff','1998-10-18','9999-01-01'),
1337
+ (10907,'Senior Staff','1995-12-26','9999-01-01'),
1338
+ (10907,'Staff','1988-12-25','1995-12-26'),
1339
+ (10908,'Senior Staff','1993-04-05','9999-01-01'),
1340
+ (10908,'Staff','1986-04-05','1993-04-05'),
1341
+ (10909,'Engineer','1993-12-26','2000-12-26'),
1342
+ (10909,'Senior Engineer','2000-12-26','9999-01-01'),
1343
+ (10910,'Senior Staff','1995-09-02','9999-01-01'),
1344
+ (10910,'Staff','1989-09-02','1995-09-02'),
1345
+ (10911,'Senior Engineer','1988-06-25','9999-01-01'),
1346
+ (10912,'Senior Staff','1991-04-23','1999-09-26'),
1347
+ (10912,'Staff','1986-04-23','1991-04-23'),
1348
+ (10913,'Staff','1998-10-25','9999-01-01'),
1349
+ (10914,'Staff','1998-03-24','1998-09-01'),
1350
+ (10915,'Senior Engineer','1999-10-28','9999-01-01'),
1351
+ (10916,'Engineer','1998-03-12','9999-01-01'),
1352
+ (10917,'Engineer','1993-01-30','1998-01-30'),
1353
+ (10917,'Senior Engineer','1998-01-30','9999-01-01'),
1354
+ (10918,'Staff','1990-01-29','1990-10-10'),
1355
+ (10919,'Staff','1999-10-30','9999-01-01'),
1356
+ (10920,'Senior Staff','1998-02-23','9999-01-01'),
1357
+ (10920,'Staff','1992-02-24','1998-02-23'),
1358
+ (10921,'Engineer','1986-07-27','1995-07-27'),
1359
+ (10921,'Senior Engineer','1995-07-27','9999-01-01'),
1360
+ (10922,'Staff','1996-02-02','1999-01-16'),
1361
+ (10923,'Senior Staff','1990-04-09','9999-01-01'),
1362
+ (10924,'Senior Staff','1997-08-14','9999-01-01'),
1363
+ (10924,'Staff','1988-08-14','1997-08-14'),
1364
+ (10925,'Technique Leader','1991-06-11','9999-01-01'),
1365
+ (10926,'Engineer','1990-04-30','1995-04-30'),
1366
+ (10926,'Senior Engineer','1995-04-30','9999-01-01'),
1367
+ (10927,'Senior Staff','1993-09-12','9999-01-01'),
1368
+ (10927,'Staff','1986-09-12','1993-09-12'),
1369
+ (10928,'Senior Staff','1997-04-06','9999-01-01'),
1370
+ (10928,'Staff','1991-04-07','1997-04-06'),
1371
+ (10929,'Senior Staff','1998-04-15','9999-01-01'),
1372
+ (10929,'Staff','1991-04-15','1998-04-15'),
1373
+ (10930,'Engineer','1991-11-22','1998-11-22'),
1374
+ (10930,'Senior Engineer','1998-11-22','9999-01-01'),
1375
+ (10931,'Technique Leader','1992-06-14','1999-09-19'),
1376
+ (10932,'Engineer','1994-09-09','1999-09-09'),
1377
+ (10932,'Senior Engineer','1999-09-09','9999-01-01'),
1378
+ (10933,'Senior Engineer','1993-08-02','9999-01-01'),
1379
+ (10934,'Staff','1995-09-17','9999-01-01'),
1380
+ (10935,'Staff','1994-10-17','9999-01-01'),
1381
+ (10936,'Senior Staff','1996-05-08','9999-01-01'),
1382
+ (10936,'Staff','1990-05-09','1996-05-08'),
1383
+ (10937,'Engineer','1988-06-16','1994-06-16'),
1384
+ (10937,'Senior Engineer','1994-06-16','9999-01-01'),
1385
+ (10938,'Senior Staff','1993-09-24','9999-01-01'),
1386
+ (10938,'Staff','1985-09-24','1993-09-24'),
1387
+ (10939,'Assistant Engineer','1997-12-11','9999-01-01'),
1388
+ (10940,'Engineer','1997-06-30','1999-12-02'),
1389
+ (10941,'Senior Staff','2001-08-22','9999-01-01'),
1390
+ (10941,'Staff','1993-08-22','2001-08-22'),
1391
+ (10942,'Engineer','1996-01-21','9999-01-01'),
1392
+ (10943,'Engineer','1993-05-22','1999-05-22'),
1393
+ (10943,'Senior Engineer','1999-05-22','9999-01-01'),
1394
+ (10944,'Senior Engineer','1995-09-07','9999-01-01'),
1395
+ (10945,'Engineer','1993-04-04','2001-04-04'),
1396
+ (10945,'Senior Engineer','2001-04-04','9999-01-01'),
1397
+ (10946,'Staff','1996-10-26','9999-01-01'),
1398
+ (10947,'Senior Staff','2001-11-15','9999-01-01'),
1399
+ (10947,'Staff','1995-11-16','2001-11-15'),
1400
+ (10948,'Senior Engineer','1996-09-30','1997-06-23'),
1401
+ (10949,'Senior Staff','1996-06-28','9999-01-01'),
1402
+ (10949,'Staff','1990-06-29','1996-06-28'),
1403
+ (10950,'Senior Engineer','1996-06-08','1998-01-13'),
1404
+ (10951,'Senior Staff','1994-07-06','9999-01-01'),
1405
+ (10951,'Staff','1989-07-06','1994-07-06'),
1406
+ (10952,'Senior Engineer','1986-07-22','1988-04-26'),
1407
+ (10953,'Senior Staff','1987-02-12','9999-01-01'),
1408
+ (10954,'Staff','1995-12-14','9999-01-01'),
1409
+ (10955,'Senior Staff','1991-09-27','9999-01-01'),
1410
+ (10955,'Staff','1986-09-27','1991-09-27'),
1411
+ (10956,'Engineer','1995-12-02','9999-01-01'),
1412
+ (10957,'Senior Staff','1990-10-01','9999-01-01'),
1413
+ (10958,'Engineer','1988-11-27','1993-11-27'),
1414
+ (10958,'Senior Engineer','1993-11-27','9999-01-01'),
1415
+ (10959,'Staff','1994-03-01','1996-04-12'),
1416
+ (10960,'Senior Staff','1995-07-07','9999-01-01'),
1417
+ (10961,'Engineer','1993-11-04','1999-11-04'),
1418
+ (10961,'Senior Engineer','1999-11-04','9999-01-01'),
1419
+ (10962,'Senior Staff','1986-12-16','9999-01-01'),
1420
+ (10963,'Engineer','1988-01-14','1995-04-10'),
1421
+ (10964,'Senior Staff','1999-05-05','9999-01-01'),
1422
+ (10964,'Staff','1991-05-05','1999-05-05'),
1423
+ (10965,'Senior Staff','1986-07-29','9999-01-01'),
1424
+ (10966,'Staff','1997-02-05','9999-01-01'),
1425
+ (10967,'Engineer','1993-08-01','1998-08-01'),
1426
+ (10967,'Senior Engineer','1998-08-01','9999-01-01'),
1427
+ (10968,'Senior Staff','1985-08-11','9999-01-01'),
1428
+ (10969,'Senior Engineer','1994-05-12','9999-01-01'),
1429
+ (10970,'Engineer','1995-11-14','9999-01-01'),
1430
+ (10971,'Technique Leader','1991-07-30','1998-10-24'),
1431
+ (10972,'Engineer','1987-06-06','1996-06-05'),
1432
+ (10972,'Senior Engineer','1996-06-05','9999-01-01'),
1433
+ (10973,'Engineer','1989-03-05','1995-03-05'),
1434
+ (10973,'Senior Engineer','1995-03-05','9999-01-01'),
1435
+ (10974,'Senior Engineer','1999-05-17','9999-01-01'),
1436
+ (10975,'Engineer','1992-03-30','1998-03-30'),
1437
+ (10975,'Senior Engineer','1998-03-30','9999-01-01'),
1438
+ (10976,'Technique Leader','1998-10-31','9999-01-01'),
1439
+ (10977,'Senior Staff','1987-08-10','1987-10-01'),
1440
+ (10978,'Engineer','1985-05-18','1990-05-18'),
1441
+ (10978,'Senior Engineer','1990-05-18','9999-01-01'),
1442
+ (10979,'Engineer','1986-01-27','1993-01-27'),
1443
+ (10979,'Senior Engineer','1993-01-27','9999-01-01'),
1444
+ (10980,'Engineer','1989-01-04','1997-01-04'),
1445
+ (10980,'Senior Engineer','1997-01-04','9999-01-01'),
1446
+ (10981,'Senior Staff','1992-07-07','9999-01-01'),
1447
+ (10982,'Senior Staff','1994-11-11','9999-01-01'),
1448
+ (10982,'Staff','1989-11-11','1994-11-11'),
1449
+ (10983,'Engineer','1988-02-22','1997-02-21'),
1450
+ (10983,'Senior Engineer','1997-02-21','9999-01-01'),
1451
+ (10984,'Senior Engineer','1988-07-09','1993-05-14'),
1452
+ (10985,'Engineer','1999-02-11','1999-03-10'),
1453
+ (10986,'Technique Leader','1985-10-11','9999-01-01'),
1454
+ (10987,'Engineer','1997-05-21','9999-01-01'),
1455
+ (10988,'Senior Engineer','1985-06-19','9999-01-01'),
1456
+ (10989,'Senior Staff','1991-07-20','9999-01-01'),
1457
+ (10989,'Staff','1985-07-20','1991-07-20'),
1458
+ (10990,'Technique Leader','1990-08-06','9999-01-01'),
1459
+ (10991,'Engineer','1999-07-13','9999-01-01'),
1460
+ (10992,'Engineer','1997-04-27','9999-01-01'),
1461
+ (10993,'Engineer','1992-05-29','2000-05-29'),
1462
+ (10993,'Senior Engineer','2000-05-29','9999-01-01'),
1463
+ (10994,'Assistant Engineer','1987-06-29','1989-05-24'),
1464
+ (10995,'Senior Staff','1997-07-19','9999-01-01'),
1465
+ (10996,'Senior Staff','1996-02-07','9999-01-01'),
1466
+ (10996,'Staff','1990-02-07','1996-02-07'),
1467
+ (10997,'Technique Leader','2000-01-04','9999-01-01'),
1468
+ (10998,'Staff','1996-08-07','9999-01-01'),
1469
+ (10999,'Technique Leader','1996-03-05','1997-04-19'),
1470
+ (11000,'Senior Engineer','1996-01-28','9999-01-01');
employee-sample-database/mysql/dataset_small/object.sql ADDED
@@ -0,0 +1,225 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ use employee;
2
+
3
+ delimiter //
4
+ drop function if exists emp_dept_id //
5
+ drop function if exists emp_dept_name //
6
+ drop function if exists emp_name //
7
+ drop function if exists current_manager //
8
+ drop procedure if exists show_department //
9
+
10
+ --
11
+ -- returns the department id of a given employee
12
+ --
13
+ create function emp_dept_id( employee_id int )
14
+ returns char(4)
15
+ reads sql data
16
+ begin
17
+ declare max_date date;
18
+ set max_date = (
19
+ select
20
+ max(from_date)
21
+ from
22
+ dept_emp
23
+ where
24
+ emp_no = employee_id
25
+ );
26
+ set @max_date=max_date;
27
+ return (
28
+ select
29
+ dept_no
30
+ from
31
+ dept_emp
32
+ where
33
+ emp_no = employee_id
34
+ and
35
+ from_date = max_date
36
+ limit 1
37
+ );
38
+ end //
39
+
40
+ --
41
+ -- returns the department name of a given employee
42
+ --
43
+
44
+ create function emp_dept_name( employee_id int )
45
+ returns varchar(40)
46
+ reads sql data
47
+ begin
48
+ return (
49
+ select
50
+ dept_name
51
+ from
52
+ department
53
+ where
54
+ dept_no = emp_dept_id(employee_id)
55
+ );
56
+ end//
57
+
58
+ --
59
+ -- returns the employee name of a given employee id
60
+ --
61
+ create function emp_name (employee_id int)
62
+ returns varchar(32)
63
+ reads SQL data
64
+ begin
65
+ return (
66
+ select
67
+ concat(first_name, ' ', last_name) as name
68
+ from
69
+ employee
70
+ where
71
+ emp_no = employee_id
72
+ );
73
+ end//
74
+
75
+ --
76
+ -- returns the manager of a department
77
+ -- choosing the most recent one
78
+ -- from the manager list
79
+ --
80
+ create function current_manager( dept_id char(4) )
81
+ returns varchar(32)
82
+ reads sql data
83
+ begin
84
+ declare max_date date;
85
+ set max_date = (
86
+ select
87
+ max(from_date)
88
+ from
89
+ dept_manager
90
+ where
91
+ dept_no = dept_id
92
+ );
93
+ set @max_date=max_date;
94
+ return (
95
+ select
96
+ emp_name(emp_no)
97
+ from
98
+ dept_manager
99
+ where
100
+ dept_no = dept_id
101
+ and
102
+ from_date = max_date
103
+ limit 1
104
+ );
105
+ end //
106
+
107
+ delimiter ;
108
+
109
+ --
110
+ -- selects the employee records with the
111
+ -- latest department
112
+ --
113
+
114
+ CREATE OR REPLACE VIEW v_full_employee
115
+ AS
116
+ SELECT
117
+ emp_no,
118
+ first_name , last_name ,
119
+ birth_date , gender,
120
+ hire_date,
121
+ emp_dept_name(emp_no) as department
122
+ from
123
+ employee;
124
+
125
+ --
126
+ -- selects the department list with manager names
127
+ --
128
+
129
+ CREATE OR REPLACE VIEW v_full_department
130
+ AS
131
+ SELECT
132
+ dept_no, dept_name, current_manager(dept_no) as manager
133
+ FROM
134
+ department;
135
+
136
+ delimiter //
137
+
138
+ --
139
+ -- shows the department with the number of employee
140
+ -- per department
141
+ --
142
+ create procedure show_department()
143
+ modifies sql data
144
+ begin
145
+ DROP TABLE IF EXISTS department_max_date;
146
+ DROP TABLE IF EXISTS department_people;
147
+ CREATE TEMPORARY TABLE department_max_date
148
+ (
149
+ emp_no int not null primary key,
150
+ dept_from_date date not null,
151
+ dept_to_date date not null, # bug#320513
152
+ KEY (dept_from_date, dept_to_date)
153
+ );
154
+ INSERT INTO department_max_date
155
+ SELECT
156
+ emp_no, max(from_date), max(to_date)
157
+ FROM
158
+ dept_emp
159
+ GROUP BY
160
+ emp_no;
161
+
162
+ CREATE TEMPORARY TABLE department_people
163
+ (
164
+ emp_no int not null,
165
+ dept_no char(4) not null,
166
+ primary key (emp_no, dept_no)
167
+ );
168
+
169
+ insert into department_people
170
+ select dmd.emp_no, dept_no
171
+ from
172
+ department_max_date dmd
173
+ inner join dept_emp de
174
+ on dmd.dept_from_date=de.from_date
175
+ and dmd.dept_to_date=de.to_date
176
+ and dmd.emp_no=de.emp_no;
177
+ SELECT
178
+ dept_no,dept_name,manager, count(*)
179
+ from v_full_department
180
+ inner join department_people using (dept_no)
181
+ group by dept_no;
182
+ # with rollup;
183
+ DROP TABLE department_max_date;
184
+ DROP TABLE department_people;
185
+ end //
186
+
187
+ drop function if exists employee_usage //
188
+ drop procedure if exists employee_help //
189
+
190
+ CREATE FUNCTION employee_usage ()
191
+ RETURNS TEXT
192
+ DETERMINISTIC
193
+ BEGIN
194
+ RETURN
195
+ '
196
+ == USAGE ==
197
+ ====================
198
+
199
+ PROCEDURE show_department()
200
+
201
+ shows the department with the manager and
202
+ number of employee per department
203
+
204
+ FUNCTION current_manager (dept_id)
205
+
206
+ Shows who is the manager of a given departmennt
207
+
208
+ FUNCTION emp_name (emp_id)
209
+
210
+ Shows name and surname of a given employee
211
+
212
+ FUNCTION emp_dept_id (emp_id)
213
+
214
+ Shows the current department of given employee
215
+ ';
216
+ END //
217
+
218
+ create procedure employee_help()
219
+ deterministic
220
+ begin
221
+ select employee_usage() as info;
222
+ end//
223
+
224
+ delimiter ;
225
+
employee-sample-database/mysql/dataset_small/show_elapsed.sql ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ select timediff(
2
+ (select update_time from information_schema.tables where table_schema='employee' and table_name='salary'),
3
+ (select create_time from information_schema.tables where table_schema='employee' and table_name='employee')
4
+ ) as data_load_time_diff;
5
+
employee-sample-database/mysql/dataset_small/test_employee_md5.sql ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ -- Sample employee database
2
+ -- See changelog table for details
3
+ -- Copyright (C) 2007,2008, MySQL AB
4
+ --
5
+ -- Original data created by Fusheng Wang and Carlo Zaniolo
6
+ -- http://www.cs.aau.dk/TimeCenter/software.htm
7
+ -- http://www.cs.aau.dk/TimeCenter/Data/employeeTemporalDataSet.zip
8
+ --
9
+ -- Current schema by Giuseppe Maxia
10
+ -- Data conversion from XML to relational by Patrick Crews
11
+ --
12
+ -- This work is licensed under the
13
+ -- Creative Commons Attribution-Share Alike 3.0 Unported License.
14
+ -- To view a copy of this license, visit
15
+ -- http://creativecommons.org/licenses/by-sa/3.0/ or send a letter to
16
+ -- Creative Commons, 171 Second Street, Suite 300, San Francisco,
17
+ -- California, 94105, USA.
18
+ --
19
+ -- DISCLAIMER
20
+ -- To the best of our knowledge, this data is fabricated, and
21
+ -- it does not correspond to real people.
22
+ -- Any similarity to existing people is purely coincidental.
23
+ --
24
+
25
+ USE employee;
26
+
27
+ SELECT 'TESTING INSTALLATION' as 'INFO';
28
+
29
+ DROP TABLE IF EXISTS expected_value, found_value;
30
+ CREATE TABLE expected_value (
31
+ table_name varchar(30) not null primary key,
32
+ recs int not null,
33
+ crc_md5 varchar(100) not null
34
+ );
35
+
36
+
37
+ CREATE TABLE found_value LIKE expected_value;
38
+
39
+ INSERT INTO `expected_value` VALUES
40
+ ('employee', 1000, '595460127fb609c2b110b1796083e242'),
41
+ ('department', 9, 'd1af5e170d2d1591d776d5638d71fc5f'),
42
+ ('dept_manager', 16, '8ff425d5ad6dc56975998d1893b8dca9'),
43
+ ('dept_emp', 1103, 'e302aa5b56a69b49e40eb0d60674addc'),
44
+ ('title', 1470, 'ba77dd331ce00f76c1643a7d73cdcee6'),
45
+ ('salary', 9488, '61f22cfece4d34f5bb94c9f05a3da3ef');
46
+ SELECT table_name, recs AS expected_record, crc_md5 AS expected_crc FROM expected_value;
47
+
48
+ DROP TABLE IF EXISTS tchecksum;
49
+ CREATE TABLE tchecksum (chk char(100));
50
+
51
+ SET @crc= '';
52
+
53
+ INSERT INTO tchecksum
54
+ SELECT @crc := MD5(CONCAT_WS('#',@crc,
55
+ emp_no,birth_date,first_name,last_name,gender,hire_date))
56
+ FROM employee ORDER BY emp_no;
57
+ INSERT INTO found_value VALUES ('employee', (SELECT COUNT(*) FROM employee), @crc);
58
+
59
+ SET @crc = '';
60
+ INSERT INTO tchecksum
61
+ SELECT @crc := MD5(CONCAT_WS('#',@crc, dept_no,dept_name))
62
+ FROM department ORDER BY dept_no;
63
+ INSERT INTO found_value values ('department', (SELECT COUNT(*) FROM department), @crc);
64
+
65
+ SET @crc = '';
66
+ INSERT INTO tchecksum
67
+ SELECT @crc := MD5(CONCAT_WS('#',@crc, dept_no,emp_no, from_date,to_date))
68
+ FROM dept_manager ORDER BY dept_no,emp_no;
69
+ INSERT INTO found_value values ('dept_manager', (SELECT COUNT(*) FROM dept_manager), @crc);
70
+
71
+ SET @crc = '';
72
+ INSERT INTO tchecksum
73
+ SELECT @crc := MD5(CONCAT_WS('#',@crc, dept_no,emp_no, from_date,to_date))
74
+ FROM dept_emp ORDER BY dept_no,emp_no;
75
+ INSERT INTO found_value values ('dept_emp', (SELECT COUNT(*) FROM dept_emp), @crc);
76
+
77
+ SET @crc = '';
78
+ INSERT INTO tchecksum
79
+ SELECT @crc := MD5(CONCAT_WS('#',@crc, emp_no, title, from_date,to_date))
80
+ FROM title order by emp_no,title,from_date;
81
+ INSERT INTO found_value values ('title', (SELECT COUNT(*) FROM title), @crc);
82
+
83
+ SET @crc = '';
84
+ INSERT INTO tchecksum
85
+ SELECT @crc := MD5(CONCAT_WS('#',@crc, emp_no, amount, from_date,to_date))
86
+ FROM salary order by emp_no,from_date,to_date;
87
+ INSERT INTO found_value values ('salary', (SELECT COUNT(*) FROM salary), @crc);
88
+
89
+ DROP TABLE tchecksum;
90
+
91
+ SELECT table_name, recs as 'found_records ', crc_md5 as found_crc from found_value;
92
+
93
+ SELECT
94
+ e.table_name,
95
+ IF(e.recs=f.recs,'OK', 'not ok') AS records_match,
96
+ IF(e.crc_md5=f.crc_md5,'ok','not ok') AS crc_match
97
+ from
98
+ expected_value e INNER JOIN found_value f USING (table_name);
99
+
100
+
101
+ set @crc_fail=(select count(*) from expected_value e inner join found_value f on (e.table_name=f.table_name) where f.crc_md5 != e.crc_md5);
102
+ set @count_fail=(select count(*) from expected_value e inner join found_value f on (e.table_name=f.table_name) where f.recs != e.recs);
103
+
104
+ select timediff(
105
+ now(),
106
+ (select create_time from information_schema.tables where table_schema='employee' and table_name='expected_value')
107
+ ) as computation_time;
108
+
109
+ DROP TABLE expected_value,found_value;
110
+
111
+ select 'CRC' as summary, if(@crc_fail = 0, "OK", "FAIL" ) as 'result'
112
+ union all
113
+ select 'count', if(@count_fail = 0, "OK", "FAIL" );
114
+
115
+
employee-sample-database/mysql/install_dataset_small.sh ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ main() {
4
+ path=$1
5
+ user=$2
6
+
7
+ cd $path/dataset_small
8
+ mysql -u $user <employee.sql
9
+ }
10
+
11
+ main "" "root"
employee-sample-database/mysql/schema.png ADDED

Git LFS Details

  • SHA256: e3889082a8bbc534a3965a57f92de3a5fa3b7db6b4a60fea0722f6c2e9976b14
  • Pointer size: 131 Bytes
  • Size of remote file: 141 kB
employee-sample-database/postgres/README.md ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Employee Sample Database for PostgreSQL
2
+
3
+ This is derived from the [MySQL counterpart](https://github.com/bytebase/employee-sample-database/tree/main/mysql).
4
+
5
+ ## Installation:
6
+
7
+ 1. Download the repository
8
+ 2. Change directory to the repository
9
+ 3. Change directory to either `dataset_full`, `dataset_large` or `dataset_small`
10
+
11
+ Run:
12
+
13
+ ```bash
14
+ cd dataset_small
15
+ ```
16
+
17
+ Then run:
18
+
19
+ ```bash
20
+ psql -c "CREATE DATABASE employee"
21
+ psql employee < employee.sql
22
+ ```
employee-sample-database/postgres/dataset_small/01_employee.sql ADDED
@@ -0,0 +1,221 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ -- Sample employee database for PostgreSQL derived from MySQL version
2
+ -- ----------------------Original license BEGIN----------------------
3
+ -- Sample employee database
4
+ -- See changelog table for details
5
+ -- Copyright (C) 2007,2008, MySQL AB
6
+ --
7
+ -- Original data created by Fusheng Wang and Carlo Zaniolo
8
+ -- http://www.cs.aau.dk/TimeCenter/software.htm
9
+ -- http://www.cs.aau.dk/TimeCenter/Data/employeeTemporalDataSet.zip
10
+ --
11
+ -- Current schema by Giuseppe Maxia
12
+ -- Data conversion from XML to relational by Patrick Crews
13
+ --
14
+ -- This work is licensed under the
15
+ -- Creative Commons Attribution-Share Alike 3.0 Unported License.
16
+ -- To view a copy of this license, visit
17
+ -- http://creativecommons.org/licenses/by-sa/3.0/ or send a letter to
18
+ -- Creative Commons, 171 Second Street, Suite 300, San Francisco,
19
+ -- California, 94105, USA.
20
+ --
21
+ -- DISCLAIMER
22
+ -- To the best of our knowledge, this data is fabricated, and
23
+ -- it does not correspond to real people.
24
+ -- Any similarity to existing people is purely coincidental.
25
+ --
26
+
27
+ \echo 'CREATING DATABASE STRUCTURE'
28
+
29
+ DROP TABLE IF EXISTS dept_emp,
30
+ dept_manager,
31
+ title,
32
+ salary,
33
+ employee,
34
+ department,
35
+ audit CASCADE;
36
+
37
+ CREATE TABLE employee (
38
+ emp_no SERIAL NOT NULL,
39
+ birth_date DATE NOT NULL,
40
+ first_name TEXT NOT NULL,
41
+ last_name TEXT NOT NULL,
42
+ gender TEXT NOT NULL CHECK (gender IN('M', 'F')) NOT NULL,
43
+ hire_date DATE NOT NULL,
44
+ PRIMARY KEY (emp_no)
45
+ );
46
+
47
+ CREATE INDEX idx_employee_hire_date ON employee (hire_date);
48
+
49
+ CREATE TABLE department (
50
+ dept_no TEXT NOT NULL,
51
+ dept_name TEXT NOT NULL,
52
+ PRIMARY KEY (dept_no),
53
+ UNIQUE (dept_name)
54
+ );
55
+
56
+ CREATE TABLE dept_manager (
57
+ emp_no INT NOT NULL,
58
+ dept_no TEXT NOT NULL,
59
+ from_date DATE NOT NULL,
60
+ to_date DATE NOT NULL,
61
+ FOREIGN KEY (emp_no) REFERENCES employee (emp_no) ON DELETE CASCADE,
62
+ FOREIGN KEY (dept_no) REFERENCES department (dept_no) ON DELETE CASCADE,
63
+ PRIMARY KEY (emp_no, dept_no)
64
+ );
65
+
66
+ CREATE TABLE dept_emp (
67
+ emp_no INT NOT NULL,
68
+ dept_no TEXT NOT NULL,
69
+ from_date DATE NOT NULL,
70
+ to_date DATE NOT NULL,
71
+ FOREIGN KEY (emp_no) REFERENCES employee (emp_no) ON DELETE CASCADE,
72
+ FOREIGN KEY (dept_no) REFERENCES department (dept_no) ON DELETE CASCADE,
73
+ PRIMARY KEY (emp_no, dept_no)
74
+ );
75
+
76
+ CREATE TABLE title (
77
+ emp_no INT NOT NULL,
78
+ title TEXT NOT NULL,
79
+ from_date DATE NOT NULL,
80
+ to_date DATE,
81
+ FOREIGN KEY (emp_no) REFERENCES employee (emp_no) ON DELETE CASCADE,
82
+ PRIMARY KEY (emp_no, title, from_date)
83
+ );
84
+
85
+ CREATE TABLE salary (
86
+ emp_no INT NOT NULL,
87
+ salary INT NOT NULL,
88
+ from_date DATE NOT NULL,
89
+ to_date DATE NOT NULL,
90
+ FOREIGN KEY (emp_no) REFERENCES employee (emp_no) ON DELETE CASCADE,
91
+ PRIMARY KEY (emp_no, from_date)
92
+ );
93
+
94
+ CREATE INDEX idx_salary_salary ON salary (salary);
95
+
96
+ CREATE TABLE audit (
97
+ id SERIAL PRIMARY KEY,
98
+ operation TEXT NOT NULL,
99
+ query TEXT,
100
+ user_name TEXT NOT NULL,
101
+ changed_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
102
+ );
103
+
104
+ CREATE INDEX idx_audit_operation ON audit (operation);
105
+ CREATE INDEX idx_audit_username ON audit (user_name);
106
+ CREATE INDEX idx_audit_changed_at ON audit (changed_at);
107
+
108
+ -- Enable Row Level Security on audit table
109
+ ALTER TABLE audit ENABLE ROW LEVEL SECURITY;
110
+
111
+ -- Policy: Users can only see their own audit records
112
+ CREATE POLICY audit_user_isolation ON audit
113
+ FOR ALL
114
+ TO PUBLIC
115
+ USING (user_name = current_user);
116
+
117
+ -- Policy: Allow audit system to insert records (bypass RLS for service accounts)
118
+ CREATE POLICY audit_insert_system ON audit
119
+ FOR INSERT
120
+ TO PUBLIC
121
+ WITH CHECK (true);
122
+
123
+ CREATE OR REPLACE PROCEDURE simple_salary_update(
124
+ p_emp_no INT,
125
+ p_salary INT
126
+ )
127
+ LANGUAGE plpgsql
128
+ AS $_$
129
+ BEGIN
130
+ -- Simple update of salary amount
131
+ UPDATE salary
132
+ SET salary = p_salary
133
+ WHERE emp_no = p_emp_no
134
+ AND to_date = '9999-01-01';
135
+
136
+ RAISE NOTICE 'Updated salary for employee % to $%', p_emp_no, p_salary;
137
+ END;
138
+ $_$;
139
+
140
+ CREATE OR REPLACE FUNCTION log_dml_operations() RETURNS TRIGGER AS $$
141
+ DECLARE
142
+ table_category TEXT;
143
+ log_level TEXT;
144
+ BEGIN
145
+ -- Get arguments passed from trigger (if any)
146
+ -- TG_ARGV[0] is the first argument, TG_ARGV[1] is the second
147
+ table_category := COALESCE(TG_ARGV[0], 'default');
148
+ log_level := COALESCE(TG_ARGV[1], 'standard');
149
+
150
+ IF (TG_OP = 'INSERT') THEN
151
+ INSERT INTO audit (operation, query, user_name)
152
+ VALUES (
153
+ 'INSERT [' || table_category || ':' || log_level || ']',
154
+ current_query(),
155
+ current_user
156
+ );
157
+ RETURN NEW;
158
+ ELSIF (TG_OP = 'UPDATE') THEN
159
+ INSERT INTO audit (operation, query, user_name)
160
+ VALUES (
161
+ 'UPDATE [' || table_category || ':' || log_level || ']',
162
+ current_query(),
163
+ current_user
164
+ );
165
+ RETURN NEW;
166
+ ELSIF (TG_OP = 'DELETE') THEN
167
+ INSERT INTO audit (operation, query, user_name)
168
+ VALUES (
169
+ 'DELETE [' || table_category || ':' || log_level || ']',
170
+ current_query(),
171
+ current_user
172
+ );
173
+ RETURN OLD;
174
+ END IF;
175
+ RETURN NULL;
176
+ END;
177
+ $$ LANGUAGE plpgsql;
178
+
179
+ -- only log update and delete, otherwise, it will cause too much change.
180
+ CREATE TRIGGER salary_log_trigger
181
+ AFTER UPDATE OR DELETE ON salary
182
+ FOR EACH ROW
183
+ EXECUTE FUNCTION log_dml_operations('payroll', 'high');
184
+
185
+ CREATE OR REPLACE VIEW dept_emp_latest_date AS
186
+ SELECT
187
+ emp_no,
188
+ MAX(
189
+ from_date) AS from_date,
190
+ MAX(
191
+ to_date) AS to_date
192
+ FROM
193
+ dept_emp
194
+ GROUP BY
195
+ emp_no;
196
+
197
+ -- shows only the current department for each employee
198
+ CREATE OR REPLACE VIEW current_dept_emp AS
199
+ SELECT
200
+ l.emp_no,
201
+ dept_no,
202
+ l.from_date,
203
+ l.to_date
204
+ FROM
205
+ dept_emp d
206
+ INNER JOIN dept_emp_latest_date l ON d.emp_no = l.emp_no
207
+ AND d.from_date = l.from_date
208
+ AND l.to_date = d.to_date;
209
+
210
+ \echo 'LOADING department'
211
+ \i /docker-entrypoint-initdb.d/load_department.sql
212
+ \echo 'LOADING employee'
213
+ \i /docker-entrypoint-initdb.d/load_employee.sql
214
+ \echo 'LOADING dept_emp'
215
+ \i /docker-entrypoint-initdb.d/load_dept_emp.sql
216
+ \echo 'LOADING dept_manager'
217
+ \i /docker-entrypoint-initdb.d/load_dept_manager.sql
218
+ \echo 'LOADING title'
219
+ \i /docker-entrypoint-initdb.d/load_title.sql
220
+ \echo 'LOADING salary'
221
+ \i /docker-entrypoint-initdb.d/load_salary1.sql
employee-sample-database/postgres/dataset_small/load_department.sql ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ INSERT INTO department VALUES
2
+ ('d001','Marketing'),
3
+ ('d002','Finance'),
4
+ ('d003','Human Resources'),
5
+ ('d004','Production'),
6
+ ('d005','Development'),
7
+ ('d006','Quality Management'),
8
+ ('d007','Sales'),
9
+ ('d008','Research'),
10
+ ('d009','Customer Service');
employee-sample-database/postgres/dataset_small/load_dept_emp.sql ADDED
@@ -0,0 +1,1103 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ INSERT INTO dept_emp VALUES (10001,'d005','1986-06-26','9999-01-01'),
2
+ (10002,'d007','1996-08-03','9999-01-01'),
3
+ (10003,'d004','1995-12-03','9999-01-01'),
4
+ (10004,'d004','1986-12-01','9999-01-01'),
5
+ (10005,'d003','1989-09-12','9999-01-01'),
6
+ (10006,'d005','1990-08-05','9999-01-01'),
7
+ (10007,'d008','1989-02-10','9999-01-01'),
8
+ (10008,'d005','1998-03-11','2000-07-31'),
9
+ (10009,'d006','1985-02-18','9999-01-01'),
10
+ (10010,'d004','1996-11-24','2000-06-26'),
11
+ (10010,'d006','2000-06-26','9999-01-01'),
12
+ (10011,'d009','1990-01-22','1996-11-09'),
13
+ (10012,'d005','1992-12-18','9999-01-01'),
14
+ (10013,'d003','1985-10-20','9999-01-01'),
15
+ (10014,'d005','1993-12-29','9999-01-01'),
16
+ (10015,'d008','1992-09-19','1993-08-22'),
17
+ (10016,'d007','1998-02-11','9999-01-01'),
18
+ (10017,'d001','1993-08-03','9999-01-01'),
19
+ (10018,'d004','1992-07-29','9999-01-01'),
20
+ (10018,'d005','1987-04-03','1992-07-29'),
21
+ (10019,'d008','1999-04-30','9999-01-01'),
22
+ (10020,'d004','1997-12-30','9999-01-01'),
23
+ (10021,'d005','1988-02-10','2002-07-15'),
24
+ (10022,'d005','1999-09-03','9999-01-01'),
25
+ (10023,'d005','1999-09-27','9999-01-01'),
26
+ (10024,'d004','1998-06-14','9999-01-01'),
27
+ (10025,'d005','1987-08-17','1997-10-15'),
28
+ (10026,'d004','1995-03-20','9999-01-01'),
29
+ (10027,'d005','1995-04-02','9999-01-01'),
30
+ (10028,'d005','1991-10-22','1998-04-06'),
31
+ (10029,'d004','1991-09-18','1999-07-08'),
32
+ (10029,'d006','1999-07-08','9999-01-01'),
33
+ (10030,'d004','1994-02-17','9999-01-01'),
34
+ (10031,'d005','1991-09-01','9999-01-01'),
35
+ (10032,'d004','1990-06-20','9999-01-01'),
36
+ (10033,'d006','1987-03-18','1993-03-24'),
37
+ (10034,'d007','1995-04-12','1999-10-31'),
38
+ (10035,'d004','1988-09-05','9999-01-01'),
39
+ (10036,'d003','1992-04-28','9999-01-01'),
40
+ (10037,'d005','1990-12-05','9999-01-01'),
41
+ (10038,'d009','1989-09-20','9999-01-01'),
42
+ (10039,'d003','1988-01-19','9999-01-01'),
43
+ (10040,'d005','1993-02-14','2002-01-22'),
44
+ (10040,'d008','2002-01-22','9999-01-01'),
45
+ (10041,'d007','1989-11-12','9999-01-01'),
46
+ (10042,'d002','1993-03-21','2000-08-10'),
47
+ (10043,'d005','1990-10-20','9999-01-01'),
48
+ (10044,'d004','1994-05-21','9999-01-01'),
49
+ (10045,'d004','1996-11-16','9999-01-01'),
50
+ (10046,'d008','1992-06-20','9999-01-01'),
51
+ (10047,'d004','1989-03-31','9999-01-01'),
52
+ (10048,'d005','1985-02-24','1987-01-27'),
53
+ (10049,'d009','1992-05-04','9999-01-01'),
54
+ (10050,'d002','1990-12-25','1992-11-05'),
55
+ (10050,'d007','1992-11-05','9999-01-01'),
56
+ (10051,'d004','1992-10-15','9999-01-01'),
57
+ (10052,'d008','1997-01-31','9999-01-01'),
58
+ (10053,'d007','1994-11-13','9999-01-01'),
59
+ (10054,'d003','1995-07-29','9999-01-01'),
60
+ (10055,'d001','1992-04-27','1995-07-22'),
61
+ (10056,'d005','1990-02-01','9999-01-01'),
62
+ (10057,'d005','1992-01-15','9999-01-01'),
63
+ (10058,'d001','1988-04-25','9999-01-01'),
64
+ (10059,'d002','1991-06-26','9999-01-01'),
65
+ (10060,'d007','1989-05-28','1992-11-11'),
66
+ (10060,'d009','1992-11-11','9999-01-01'),
67
+ (10061,'d007','1989-12-02','9999-01-01'),
68
+ (10062,'d005','1991-08-30','9999-01-01'),
69
+ (10063,'d004','1989-04-08','9999-01-01'),
70
+ (10064,'d008','1985-11-20','1992-03-02'),
71
+ (10065,'d005','1998-05-24','9999-01-01'),
72
+ (10066,'d005','1986-02-26','9999-01-01'),
73
+ (10067,'d006','1987-03-04','9999-01-01'),
74
+ (10068,'d007','1987-08-07','9999-01-01'),
75
+ (10069,'d004','1992-06-14','9999-01-01'),
76
+ (10070,'d005','1985-10-14','1995-10-18'),
77
+ (10070,'d008','1995-10-18','9999-01-01'),
78
+ (10071,'d003','1995-08-05','9999-01-01'),
79
+ (10072,'d005','1989-05-21','9999-01-01'),
80
+ (10073,'d006','1998-02-02','1998-02-22'),
81
+ (10074,'d005','1990-08-13','9999-01-01'),
82
+ (10075,'d005','1988-05-17','2001-01-15'),
83
+ (10076,'d005','1996-07-15','9999-01-01'),
84
+ (10077,'d003','1994-12-23','9999-01-01'),
85
+ (10078,'d005','1994-09-29','9999-01-01'),
86
+ (10079,'d005','1995-12-13','9999-01-01'),
87
+ (10080,'d002','1994-09-28','1997-07-09'),
88
+ (10080,'d003','1997-07-09','9999-01-01'),
89
+ (10081,'d004','1986-10-30','9999-01-01'),
90
+ (10082,'d008','1990-01-03','1990-01-15'),
91
+ (10083,'d004','1987-03-31','9999-01-01'),
92
+ (10084,'d004','1995-12-15','9999-01-01'),
93
+ (10085,'d004','1994-04-09','9999-01-01'),
94
+ (10086,'d003','1992-02-19','9999-01-01'),
95
+ (10087,'d007','1997-05-08','2001-01-09'),
96
+ (10088,'d007','1988-09-02','1992-03-21'),
97
+ (10088,'d009','1992-03-21','9999-01-01'),
98
+ (10089,'d007','1989-01-10','9999-01-01'),
99
+ (10090,'d005','1986-03-14','1999-05-07'),
100
+ (10091,'d005','1992-11-18','9999-01-01'),
101
+ (10092,'d005','1996-04-22','9999-01-01'),
102
+ (10093,'d007','1997-06-08','9999-01-01'),
103
+ (10094,'d008','1987-04-18','1997-11-08'),
104
+ (10095,'d007','1994-03-10','9999-01-01'),
105
+ (10096,'d004','1999-01-23','9999-01-01'),
106
+ (10097,'d008','1990-09-15','9999-01-01'),
107
+ (10098,'d004','1985-05-13','1989-06-29'),
108
+ (10098,'d009','1989-06-29','1992-12-11'),
109
+ (10099,'d007','1988-10-18','9999-01-01'),
110
+ (10100,'d003','1987-09-21','9999-01-01'),
111
+ (10101,'d007','1998-10-14','2000-09-23'),
112
+ (10102,'d004','1995-01-02','9999-01-01'),
113
+ (10103,'d005','1998-01-12','9999-01-01'),
114
+ (10104,'d008','1987-04-16','9999-01-01'),
115
+ (10105,'d003','1999-05-17','2001-06-11'),
116
+ (10106,'d004','1991-10-27','9999-01-01'),
117
+ (10107,'d007','1999-03-30','9999-01-01'),
118
+ (10108,'d001','1999-12-06','2001-10-20'),
119
+ (10108,'d003','1999-03-20','1999-12-06'),
120
+ (10109,'d004','1993-06-16','9999-01-01'),
121
+ (10110,'d003','1986-08-22','9999-01-01'),
122
+ (10111,'d006','1988-12-19','9999-01-01'),
123
+ (10112,'d009','1998-05-01','9999-01-01'),
124
+ (10113,'d004','1998-09-14','9999-01-01'),
125
+ (10114,'d008','1992-07-17','9999-01-01'),
126
+ (10115,'d009','1988-03-03','1992-05-24'),
127
+ (10116,'d005','1994-02-27','1995-12-03'),
128
+ (10116,'d008','1995-12-03','1998-11-01'),
129
+ (10117,'d004','1992-03-19','9999-01-01'),
130
+ (10118,'d005','1992-02-02','9999-01-01'),
131
+ (10119,'d004','1993-12-09','1997-10-30'),
132
+ (10120,'d004','1996-07-06','9999-01-01'),
133
+ (10121,'d005','1989-05-03','9999-01-01'),
134
+ (10122,'d005','1998-08-06','9999-01-01'),
135
+ (10123,'d004','1993-01-15','9999-01-01'),
136
+ (10124,'d004','1991-09-05','1999-06-06'),
137
+ (10124,'d006','1999-06-06','9999-01-01'),
138
+ (10125,'d007','1990-10-26','1996-03-25'),
139
+ (10126,'d009','1985-09-08','9999-01-01'),
140
+ (10127,'d005','1991-05-17','9999-01-01'),
141
+ (10128,'d009','1988-06-06','9999-01-01'),
142
+ (10129,'d005','1996-01-16','9999-01-01'),
143
+ (10130,'d004','1988-06-21','9999-01-01'),
144
+ (10131,'d004','1999-09-17','1999-12-06'),
145
+ (10132,'d002','1997-06-18','9999-01-01'),
146
+ (10133,'d004','1985-12-15','9999-01-01'),
147
+ (10134,'d004','1993-12-02','9999-01-01'),
148
+ (10134,'d005','1987-12-12','1993-12-02'),
149
+ (10135,'d004','1990-01-04','9999-01-01'),
150
+ (10136,'d007','1988-06-13','1999-09-20'),
151
+ (10137,'d009','1985-02-18','9999-01-01'),
152
+ (10138,'d006','1992-03-03','9999-01-01'),
153
+ (10139,'d005','1998-03-15','9999-01-01'),
154
+ (10140,'d001','1991-03-14','9999-01-01'),
155
+ (10141,'d008','1998-07-23','9999-01-01'),
156
+ (10142,'d005','1993-10-28','9999-01-01'),
157
+ (10143,'d005','1988-09-30','9999-01-01'),
158
+ (10144,'d002','1985-10-14','1988-09-02'),
159
+ (10144,'d003','1988-09-02','1993-08-10'),
160
+ (10145,'d005','1999-11-03','9999-01-01'),
161
+ (10146,'d002','1988-06-28','1990-09-07'),
162
+ (10147,'d002','1987-12-18','9999-01-01'),
163
+ (10148,'d007','1996-07-15','9999-01-01'),
164
+ (10149,'d007','1994-01-28','1996-08-27'),
165
+ (10150,'d005','1986-11-16','9999-01-01'),
166
+ (10151,'d007','1992-12-12','9999-01-01'),
167
+ (10152,'d006','1986-01-27','1987-08-03'),
168
+ (10153,'d005','2000-01-08','9999-01-01'),
169
+ (10154,'d009','1996-10-23','9999-01-01'),
170
+ (10155,'d004','1990-07-12','9999-01-01'),
171
+ (10155,'d008','1990-01-05','1990-07-12'),
172
+ (10156,'d006','1993-05-14','9999-01-01'),
173
+ (10157,'d005','1997-12-10','9999-01-01'),
174
+ (10158,'d004','1987-06-04','9999-01-01'),
175
+ (10159,'d006','1996-06-12','9999-01-01'),
176
+ (10160,'d007','1993-12-06','9999-01-01'),
177
+ (10161,'d004','1991-06-09','1994-01-05'),
178
+ (10162,'d004','1998-05-27','9999-01-01'),
179
+ (10163,'d003','1992-02-02','9999-01-01'),
180
+ (10164,'d004','1990-10-19','2000-05-31'),
181
+ (10164,'d009','2000-05-31','9999-01-01'),
182
+ (10165,'d002','1988-05-17','9999-01-01'),
183
+ (10166,'d005','1996-09-02','9999-01-01'),
184
+ (10167,'d004','1992-04-04','9999-01-01'),
185
+ (10168,'d008','1986-12-06','9999-01-01'),
186
+ (10169,'d005','1998-06-28','9999-01-01'),
187
+ (10170,'d004','1986-01-02','1989-02-06'),
188
+ (10171,'d004','1996-08-05','9999-01-01'),
189
+ (10172,'d005','1998-02-04','1998-10-01'),
190
+ (10172,'d008','1998-10-01','9999-01-01'),
191
+ (10173,'d002','1992-03-21','9999-01-01'),
192
+ (10174,'d004','1987-06-01','9999-01-01'),
193
+ (10175,'d001','1988-09-24','1995-05-24'),
194
+ (10176,'d009','1994-12-22','9999-01-01'),
195
+ (10177,'d002','1993-02-06','1994-03-17'),
196
+ (10178,'d007','1994-03-21','9999-01-01'),
197
+ (10179,'d005','2000-01-25','9999-01-01'),
198
+ (10180,'d002','1994-07-01','9999-01-01'),
199
+ (10181,'d005','1988-06-22','9999-01-01'),
200
+ (10182,'d005','1990-09-02','1999-01-05'),
201
+ (10182,'d008','1999-01-05','9999-01-01'),
202
+ (10183,'d009','1996-08-11','9999-01-01'),
203
+ (10184,'d009','1997-12-26','9999-01-01'),
204
+ (10185,'d007','1986-03-01','9999-01-01'),
205
+ (10186,'d002','1996-12-25','1997-08-16'),
206
+ (10187,'d002','1991-06-01','9999-01-01'),
207
+ (10188,'d004','1987-08-27','9999-01-01'),
208
+ (10189,'d005','1992-09-13','1993-06-29'),
209
+ (10190,'d004','1986-06-23','9999-01-01'),
210
+ (10191,'d005','1986-04-10','9999-01-01'),
211
+ (10192,'d004','1999-08-09','9999-01-01'),
212
+ (10192,'d006','1988-06-13','1999-08-09'),
213
+ (10193,'d005','1996-09-21','9999-01-01'),
214
+ (10194,'d002','1997-02-14','9999-01-01'),
215
+ (10195,'d004','1985-02-15','2001-04-14'),
216
+ (10196,'d002','1999-01-31','9999-01-01'),
217
+ (10197,'d005','1994-06-28','9999-01-01'),
218
+ (10198,'d005','1985-08-31','9999-01-01'),
219
+ (10199,'d007','1998-02-07','9999-01-01'),
220
+ (10200,'d004','1994-02-17','2000-10-03'),
221
+ (10200,'d006','2000-10-03','9999-01-01'),
222
+ (10201,'d005','1992-11-10','9999-01-01'),
223
+ (10202,'d005','1991-10-06','9999-01-01'),
224
+ (10203,'d008','1989-04-06','9999-01-01'),
225
+ (10204,'d005','1998-12-18','1999-03-08'),
226
+ (10205,'d004','1993-08-23','9999-01-01'),
227
+ (10206,'d005','1988-04-19','9999-01-01'),
228
+ (10207,'d005','1992-10-11','9999-01-01'),
229
+ (10208,'d001','1995-02-05','1999-05-15'),
230
+ (10209,'d002','1991-11-23','1999-08-07'),
231
+ (10209,'d007','1999-08-07','9999-01-01'),
232
+ (10210,'d009','1996-02-24','9999-01-01'),
233
+ (10211,'d005','1991-11-22','9999-01-01'),
234
+ (10212,'d005','1996-01-28','9999-01-01'),
235
+ (10213,'d009','1994-10-06','9999-01-01'),
236
+ (10214,'d007','1988-02-29','9999-01-01'),
237
+ (10215,'d007','1991-11-23','9999-01-01'),
238
+ (10216,'d008','1987-10-30','9999-01-01'),
239
+ (10217,'d004','1986-05-12','1993-08-05'),
240
+ (10218,'d004','1997-01-31','9999-01-01'),
241
+ (10219,'d005','1994-10-23','9999-01-01'),
242
+ (10219,'d009','1993-03-31','1994-10-23'),
243
+ (10220,'d002','1997-09-16','9999-01-01'),
244
+ (10221,'d004','1988-06-08','2000-10-04'),
245
+ (10222,'d004','1986-06-08','9999-01-01'),
246
+ (10223,'d005','1998-04-01','9999-01-01'),
247
+ (10224,'d004','1988-01-09','9999-01-01'),
248
+ (10225,'d009','1995-12-14','9999-01-01'),
249
+ (10226,'d007','1996-01-29','9999-01-01'),
250
+ (10227,'d005','1994-11-01','9999-01-01'),
251
+ (10228,'d001','1993-01-28','9999-01-01'),
252
+ (10228,'d007','1992-12-22','1993-01-28'),
253
+ (10229,'d006','1996-02-20','2000-06-30'),
254
+ (10230,'d008','1996-06-16','9999-01-01'),
255
+ (10231,'d009','1998-09-09','9999-01-01'),
256
+ (10232,'d007','1992-06-04','9999-01-01'),
257
+ (10233,'d003','1994-04-29','9999-01-01'),
258
+ (10234,'d007','1990-11-19','1999-08-06'),
259
+ (10235,'d004','1995-04-06','9999-01-01'),
260
+ (10236,'d007','1996-08-30','9999-01-01'),
261
+ (10237,'d007','1989-08-11','2000-02-21'),
262
+ (10238,'d005','1995-03-31','1996-05-25'),
263
+ (10238,'d008','1996-05-25','9999-01-01'),
264
+ (10239,'d001','1996-05-04','9999-01-01'),
265
+ (10240,'d006','1998-10-06','9999-01-01'),
266
+ (10241,'d002','1988-06-12','9999-01-01'),
267
+ (10242,'d004','1988-01-18','9999-01-01'),
268
+ (10243,'d007','1986-06-07','9999-01-01'),
269
+ (10244,'d005','1999-09-16','9999-01-01'),
270
+ (10245,'d008','1994-04-21','1995-02-20'),
271
+ (10246,'d004','1991-02-01','9999-01-01'),
272
+ (10247,'d004','1992-08-14','9999-01-01'),
273
+ (10248,'d007','1991-08-13','9999-01-01'),
274
+ (10249,'d005','1991-12-08','1998-04-13'),
275
+ (10249,'d008','1998-04-13','9999-01-01'),
276
+ (10250,'d006','1992-08-30','9999-01-01'),
277
+ (10251,'d008','1992-06-25','9999-01-01'),
278
+ (10252,'d004','1990-11-08','9999-01-01'),
279
+ (10253,'d007','1985-02-21','1994-03-20'),
280
+ (10254,'d007','1990-06-14','9999-01-01'),
281
+ (10255,'d004','1993-05-12','1999-11-14'),
282
+ (10256,'d007','1985-10-12','9999-01-01'),
283
+ (10257,'d004','1997-07-16','9999-01-01'),
284
+ (10258,'d005','1985-05-17','9999-01-01'),
285
+ (10259,'d001','1987-07-25','1994-08-15'),
286
+ (10259,'d009','1994-08-15','1999-01-06'),
287
+ (10260,'d004','1993-02-01','9999-01-01'),
288
+ (10261,'d005','1996-09-11','1999-02-23'),
289
+ (10262,'d007','1996-01-22','9999-01-01'),
290
+ (10263,'d002','1996-12-21','9999-01-01'),
291
+ (10264,'d005','1997-07-16','9999-01-01'),
292
+ (10265,'d006','1997-09-12','9999-01-01'),
293
+ (10266,'d004','1990-05-25','9999-01-01'),
294
+ (10267,'d004','1997-04-26','9999-01-01'),
295
+ (10268,'d004','1988-04-15','1990-08-17'),
296
+ (10268,'d005','1986-12-17','1988-04-15'),
297
+ (10269,'d004','1988-07-24','9999-01-01'),
298
+ (10270,'d007','1991-09-26','9999-01-01'),
299
+ (10271,'d005','1986-05-23','9999-01-01'),
300
+ (10272,'d002','1997-10-23','9999-01-01'),
301
+ (10273,'d007','1985-11-06','9999-01-01'),
302
+ (10274,'d005','1997-02-02','9999-01-01'),
303
+ (10275,'d005','1987-09-08','9999-01-01'),
304
+ (10276,'d005','1986-10-19','2000-02-04'),
305
+ (10277,'d007','1985-06-16','9999-01-01'),
306
+ (10278,'d005','1993-07-02','1997-02-14'),
307
+ (10279,'d004','1995-04-26','1999-07-11'),
308
+ (10279,'d009','1999-07-11','9999-01-01'),
309
+ (10280,'d003','1995-01-27','9999-01-01'),
310
+ (10281,'d006','1994-12-03','9999-01-01'),
311
+ (10282,'d004','1996-05-02','9999-01-01'),
312
+ (10283,'d005','1988-05-25','9999-01-01'),
313
+ (10284,'d004','1999-07-06','9999-01-01'),
314
+ (10285,'d008','1995-05-25','9999-01-01'),
315
+ (10286,'d009','1994-12-24','1999-01-24'),
316
+ (10287,'d005','1997-09-05','9999-01-01'),
317
+ (10287,'d008','1992-12-28','1997-09-05'),
318
+ (10288,'d004','1994-08-29','9999-01-01'),
319
+ (10289,'d005','1993-03-12','2002-01-31'),
320
+ (10290,'d005','1991-09-18','9999-01-01'),
321
+ (10291,'d007','1987-03-30','9999-01-01'),
322
+ (10292,'d007','1989-06-05','9999-01-01'),
323
+ (10293,'d004','1992-12-12','9999-01-01'),
324
+ (10294,'d005','1999-01-30','1999-05-04'),
325
+ (10295,'d002','1995-06-19','9999-01-01'),
326
+ (10296,'d007','1989-09-16','9999-01-01'),
327
+ (10297,'d004','1986-05-28','9999-01-01'),
328
+ (10298,'d004','2002-05-05','9999-01-01'),
329
+ (10298,'d008','1999-04-27','2002-05-05'),
330
+ (10299,'d007','1990-01-10','9999-01-01'),
331
+ (10300,'d004','1991-05-17','9999-01-01'),
332
+ (10301,'d002','1988-05-23','9999-01-01'),
333
+ (10302,'d007','1986-07-22','1999-11-09'),
334
+ (10303,'d004','1990-02-05','2000-11-15'),
335
+ (10304,'d007','1992-11-16','2002-05-08'),
336
+ (10305,'d005','1988-10-31','1992-06-02'),
337
+ (10306,'d007','1993-09-06','9999-01-01'),
338
+ (10307,'d004','1999-10-16','2000-01-21'),
339
+ (10307,'d006','2000-01-21','9999-01-01'),
340
+ (10308,'d007','1992-12-29','9999-01-01'),
341
+ (10309,'d005','1997-05-02','9999-01-01'),
342
+ (10310,'d004','1990-10-24','2001-07-26'),
343
+ (10311,'d005','1998-11-04','9999-01-01'),
344
+ (10312,'d004','1986-08-28','9999-01-01'),
345
+ (10313,'d008','1994-10-10','9999-01-01'),
346
+ (10314,'d007','1986-01-16','9999-01-01'),
347
+ (10315,'d005','1987-08-28','9999-01-01'),
348
+ (10316,'d006','1990-12-18','1991-01-02'),
349
+ (10317,'d004','2000-07-05','9999-01-01'),
350
+ (10317,'d008','1999-01-24','2000-07-05'),
351
+ (10318,'d005','1987-03-23','9999-01-01'),
352
+ (10319,'d007','1994-06-18','9999-01-01'),
353
+ (10320,'d007','1988-11-03','2001-12-23'),
354
+ (10321,'d007','1995-07-24','1999-08-14'),
355
+ (10322,'d005','1990-01-29','9999-01-01'),
356
+ (10323,'d004','1991-06-06','9999-01-01'),
357
+ (10324,'d005','1999-07-19','9999-01-01'),
358
+ (10325,'d003','1990-09-20','9999-01-01'),
359
+ (10326,'d008','1998-09-02','9999-01-01'),
360
+ (10327,'d005','1987-09-18','1988-05-10'),
361
+ (10327,'d008','1988-05-10','1993-05-22'),
362
+ (10328,'d005','1998-07-17','9999-01-01'),
363
+ (10329,'d004','1986-01-20','9999-01-01'),
364
+ (10330,'d007','1993-10-08','9999-01-01'),
365
+ (10331,'d007','1986-10-29','9999-01-01'),
366
+ (10332,'d004','1988-10-20','1997-03-07'),
367
+ (10333,'d005','1993-01-16','9999-01-01'),
368
+ (10334,'d009','1998-02-15','9999-01-01'),
369
+ (10335,'d007','1992-04-06','1999-11-07'),
370
+ (10335,'d009','1999-11-07','9999-01-01'),
371
+ (10336,'d008','1996-09-27','9999-01-01'),
372
+ (10337,'d004','1998-04-25','9999-01-01'),
373
+ (10338,'d009','1999-12-29','9999-01-01'),
374
+ (10339,'d004','1989-11-30','9999-01-01'),
375
+ (10340,'d001','1988-03-30','9999-01-01'),
376
+ (10341,'d004','1987-04-29','1998-11-11'),
377
+ (10342,'d005','1987-07-25','9999-01-01'),
378
+ (10343,'d006','1997-10-03','9999-01-01'),
379
+ (10344,'d004','1999-04-19','2001-11-11'),
380
+ (10344,'d006','2001-11-11','9999-01-01'),
381
+ (10345,'d005','1993-11-08','9999-01-01'),
382
+ (10346,'d007','1992-01-17','1996-04-20'),
383
+ (10347,'d008','1998-02-20','9999-01-01'),
384
+ (10348,'d004','1995-10-22','9999-01-01'),
385
+ (10349,'d009','1991-09-28','9999-01-01'),
386
+ (10350,'d004','1991-05-11','1998-01-16'),
387
+ (10351,'d002','1995-05-01','9999-01-01'),
388
+ (10352,'d005','1998-12-16','9999-01-01'),
389
+ (10353,'d001','1989-08-24','9999-01-01'),
390
+ (10354,'d002','1999-03-03','2000-03-03'),
391
+ (10354,'d003','2000-03-03','2002-01-01'),
392
+ (10355,'d007','1996-01-26','9999-01-01'),
393
+ (10356,'d008','1995-06-26','9999-01-01'),
394
+ (10357,'d006','1994-04-04','9999-01-01'),
395
+ (10358,'d005','1991-02-19','9999-01-01'),
396
+ (10359,'d005','1998-07-20','9999-01-01'),
397
+ (10360,'d003','1996-09-04','9999-01-01'),
398
+ (10361,'d007','1986-10-23','9999-01-01'),
399
+ (10362,'d003','1990-11-02','1997-07-16'),
400
+ (10363,'d004','1985-09-11','1987-05-18'),
401
+ (10363,'d006','1987-05-18','1993-02-12'),
402
+ (10364,'d004','1985-11-14','9999-01-01'),
403
+ (10365,'d008','1987-10-22','1992-04-04'),
404
+ (10366,'d005','1997-08-15','9999-01-01'),
405
+ (10367,'d001','1991-06-24','9999-01-01'),
406
+ (10368,'d004','1996-05-16','9999-01-01'),
407
+ (10369,'d007','1994-09-05','9999-01-01'),
408
+ (10370,'d007','1992-04-18','9999-01-01'),
409
+ (10371,'d004','1989-11-28','9999-01-01'),
410
+ (10372,'d004','1985-07-30','9999-01-01'),
411
+ (10373,'d005','1997-04-26','9999-01-01'),
412
+ (10374,'d007','1993-12-08','1995-04-25'),
413
+ (10374,'d009','1995-04-25','1996-03-29'),
414
+ (10375,'d007','1994-05-29','9999-01-01'),
415
+ (10376,'d004','1990-12-08','9999-01-01'),
416
+ (10377,'d004','1996-08-24','9999-01-01'),
417
+ (10378,'d007','1992-08-31','9999-01-01'),
418
+ (10379,'d005','1996-07-15','9999-01-01'),
419
+ (10380,'d007','1985-03-19','9999-01-01'),
420
+ (10381,'d004','1991-12-04','9999-01-01'),
421
+ (10382,'d004','1998-07-01','1999-05-07'),
422
+ (10382,'d009','1999-05-07','2000-10-27'),
423
+ (10383,'d004','1991-06-19','9999-01-01'),
424
+ (10384,'d001','1986-01-16','9999-01-01'),
425
+ (10385,'d004','1992-12-20','1998-01-23'),
426
+ (10386,'d005','1985-08-02','9999-01-01'),
427
+ (10387,'d009','1994-01-07','9999-01-01'),
428
+ (10388,'d007','1999-05-28','9999-01-01'),
429
+ (10389,'d005','1999-05-13','9999-01-01'),
430
+ (10390,'d006','1989-05-17','9999-01-01'),
431
+ (10391,'d005','1993-01-28','9999-01-01'),
432
+ (10392,'d004','1992-03-01','1997-08-09'),
433
+ (10392,'d006','1997-08-09','9999-01-01'),
434
+ (10393,'d004','1989-06-23','9999-01-01'),
435
+ (10394,'d005','1991-03-14','1991-08-25'),
436
+ (10395,'d005','1998-08-10','2001-08-13'),
437
+ (10396,'d005','1986-01-11','9999-01-01'),
438
+ (10397,'d004','1993-05-21','9999-01-01'),
439
+ (10398,'d007','1990-10-12','9999-01-01'),
440
+ (10399,'d007','2000-01-26','9999-01-01'),
441
+ (10400,'d007','1993-10-17','9999-01-01'),
442
+ (10401,'d006','1999-10-25','2001-04-25'),
443
+ (10402,'d006','1987-01-02','9999-01-01'),
444
+ (10403,'d002','1991-09-13','1995-03-07'),
445
+ (10403,'d007','1995-03-07','2001-06-15'),
446
+ (10404,'d005','1988-08-28','9999-01-01'),
447
+ (10405,'d006','1998-09-26','2000-12-05'),
448
+ (10406,'d006','1996-01-26','9999-01-01'),
449
+ (10407,'d007','1999-10-30','9999-01-01'),
450
+ (10408,'d007','1998-10-07','9999-01-01'),
451
+ (10409,'d005','1997-09-26','9999-01-01'),
452
+ (10410,'d007','1993-10-16','1996-07-21'),
453
+ (10411,'d007','1989-09-02','9999-01-01'),
454
+ (10412,'d004','1991-11-21','2000-05-19'),
455
+ (10412,'d009','2000-05-19','9999-01-01'),
456
+ (10413,'d003','1991-12-27','9999-01-01'),
457
+ (10414,'d005','1990-05-30','1994-12-02'),
458
+ (10415,'d005','1993-10-25','9999-01-01'),
459
+ (10416,'d002','1989-03-24','9999-01-01'),
460
+ (10417,'d007','1999-06-27','9999-01-01'),
461
+ (10418,'d001','1996-10-04','9999-01-01'),
462
+ (10419,'d008','1992-04-25','2002-07-06'),
463
+ (10420,'d008','1988-01-17','2000-07-09'),
464
+ (10421,'d009','1990-04-07','9999-01-01'),
465
+ (10422,'d004','1995-01-03','1997-09-30'),
466
+ (10422,'d006','1997-09-30','9999-01-01'),
467
+ (10423,'d008','1999-05-27','9999-01-01'),
468
+ (10424,'d005','1989-08-07','9999-01-01'),
469
+ (10425,'d004','1995-05-07','2002-05-06'),
470
+ (10426,'d005','1985-07-06','9999-01-01'),
471
+ (10427,'d007','1994-10-03','9999-01-01'),
472
+ (10428,'d003','1992-06-04','9999-01-01'),
473
+ (10429,'d005','1988-09-23','9999-01-01'),
474
+ (10430,'d004','1998-07-05','1999-07-17'),
475
+ (10430,'d009','1999-07-17','9999-01-01'),
476
+ (10431,'d007','1987-10-08','9999-01-01'),
477
+ (10432,'d009','1990-08-13','9999-01-01'),
478
+ (10433,'d006','1992-11-26','9999-01-01'),
479
+ (10434,'d004','1995-06-27','2002-06-22'),
480
+ (10435,'d005','1996-06-08','9999-01-01'),
481
+ (10436,'d003','1988-01-30','9999-01-01'),
482
+ (10437,'d006','1996-04-12','9999-01-01'),
483
+ (10438,'d004','1990-01-19','9999-01-01'),
484
+ (10439,'d005','1993-05-01','9999-01-01'),
485
+ (10440,'d005','1997-04-04','2000-01-30'),
486
+ (10440,'d008','2000-01-30','9999-01-01'),
487
+ (10441,'d004','1988-07-12','9999-01-01'),
488
+ (10442,'d007','1992-02-12','2001-03-13'),
489
+ (10443,'d005','1989-08-01','2002-07-06'),
490
+ (10444,'d007','1994-10-23','9999-01-01'),
491
+ (10445,'d005','1987-11-04','9999-01-01'),
492
+ (10446,'d005','1996-12-25','9999-01-01'),
493
+ (10447,'d006','1988-12-29','2000-11-15'),
494
+ (10448,'d007','1992-03-12','9999-01-01'),
495
+ (10449,'d001','1996-03-12','9999-01-01'),
496
+ (10449,'d007','1987-03-28','1996-03-12'),
497
+ (10450,'d005','1997-08-24','9999-01-01'),
498
+ (10451,'d004','1988-03-12','9999-01-01'),
499
+ (10452,'d005','1995-11-12','2001-10-11'),
500
+ (10453,'d009','1985-04-02','9999-01-01'),
501
+ (10454,'d007','1989-04-16','9999-01-01'),
502
+ (10455,'d007','1995-02-19','9999-01-01'),
503
+ (10456,'d002','2000-01-06','9999-01-01'),
504
+ (10457,'d006','1999-10-23','9999-01-01'),
505
+ (10458,'d007','1994-07-05','9999-01-01'),
506
+ (10459,'d002','1998-06-14','9999-01-01'),
507
+ (10459,'d003','1997-06-28','1998-06-14'),
508
+ (10460,'d005','1999-06-30','2001-04-15'),
509
+ (10461,'d007','1987-08-03','9999-01-01'),
510
+ (10462,'d004','1996-03-25','9999-01-01'),
511
+ (10463,'d007','1994-02-17','9999-01-01'),
512
+ (10464,'d003','1991-05-21','9999-01-01'),
513
+ (10465,'d009','1994-12-11','9999-01-01'),
514
+ (10466,'d009','1997-08-22','2000-08-15'),
515
+ (10467,'d003','1992-05-22','1999-11-01'),
516
+ (10468,'d007','1991-05-28','9999-01-01'),
517
+ (10469,'d005','1985-06-05','1992-12-26'),
518
+ (10469,'d008','1992-12-26','9999-01-01'),
519
+ (10470,'d004','1989-09-19','9999-01-01'),
520
+ (10471,'d006','1990-11-18','9999-01-01'),
521
+ (10472,'d007','1999-12-01','2002-01-02'),
522
+ (10473,'d004','1997-09-23','9999-01-01'),
523
+ (10474,'d004','1987-02-21','9999-01-01'),
524
+ (10475,'d004','1992-05-13','1994-12-30'),
525
+ (10476,'d008','1987-09-20','9999-01-01'),
526
+ (10477,'d005','1997-05-26','9999-01-01'),
527
+ (10478,'d005','1993-02-10','9999-01-01'),
528
+ (10478,'d009','1992-06-09','1993-02-10'),
529
+ (10479,'d004','1993-07-24','9999-01-01'),
530
+ (10480,'d002','1988-05-18','1989-06-03'),
531
+ (10481,'d004','1989-10-03','9999-01-01'),
532
+ (10482,'d005','1996-02-26','9999-01-01'),
533
+ (10483,'d006','1993-11-10','9999-01-01'),
534
+ (10484,'d003','1996-12-20','9999-01-01'),
535
+ (10485,'d005','1996-01-21','9999-01-01'),
536
+ (10486,'d006','1987-10-08','9999-01-01'),
537
+ (10487,'d004','1992-08-14','9999-01-01'),
538
+ (10488,'d005','1994-07-09','1996-11-18'),
539
+ (10488,'d008','1996-11-18','9999-01-01'),
540
+ (10489,'d005','1989-09-10','1989-10-06'),
541
+ (10490,'d007','1992-11-22','9999-01-01'),
542
+ (10491,'d001','1990-01-17','9999-01-01'),
543
+ (10492,'d005','1988-04-29','9999-01-01'),
544
+ (10493,'d007','1998-10-29','9999-01-01'),
545
+ (10494,'d004','1991-12-18','9999-01-01'),
546
+ (10495,'d004','1989-09-24','9999-01-01'),
547
+ (10496,'d002','1995-08-29','1999-01-26'),
548
+ (10497,'d004','1992-01-22','9999-01-01'),
549
+ (10498,'d004','1994-03-09','9999-01-01'),
550
+ (10499,'d001','1996-07-31','1998-03-16'),
551
+ (10499,'d007','1998-03-16','9999-01-01'),
552
+ (10500,'d005','1996-12-16','9999-01-01'),
553
+ (10501,'d005','1988-09-08','9999-01-01'),
554
+ (10502,'d006','1993-03-04','9999-01-01'),
555
+ (10503,'d004','1997-03-13','9999-01-01'),
556
+ (10504,'d007','1999-10-19','9999-01-01'),
557
+ (10505,'d007','1985-07-23','1998-03-26'),
558
+ (10506,'d005','1996-12-01','9999-01-01'),
559
+ (10507,'d003','1990-09-30','9999-01-01'),
560
+ (10508,'d004','1991-05-01','9999-01-01'),
561
+ (10509,'d007','1992-10-06','9999-01-01'),
562
+ (10510,'d007','1990-04-20','1992-09-21'),
563
+ (10510,'d009','1992-09-21','9999-01-01'),
564
+ (10511,'d004','1992-01-27','9999-01-01'),
565
+ (10512,'d003','1989-11-28','9999-01-01'),
566
+ (10513,'d002','1991-04-02','9999-01-01'),
567
+ (10514,'d008','1992-04-29','1995-04-02'),
568
+ (10515,'d007','1990-01-06','1998-07-21'),
569
+ (10516,'d005','1985-10-19','9999-01-01'),
570
+ (10517,'d007','1990-12-25','9999-01-01'),
571
+ (10518,'d005','1993-09-03','9999-01-01'),
572
+ (10519,'d005','1994-02-09','2001-10-13'),
573
+ (10519,'d008','1992-12-05','1994-02-09'),
574
+ (10520,'d004','1996-09-05','9999-01-01'),
575
+ (10521,'d007','1989-05-11','9999-01-01'),
576
+ (10522,'d003','1986-12-12','9999-01-01'),
577
+ (10523,'d004','1989-12-23','9999-01-01'),
578
+ (10524,'d004','1985-10-09','9999-01-01'),
579
+ (10525,'d007','1990-07-08','1995-12-20'),
580
+ (10526,'d004','1988-02-27','9999-01-01'),
581
+ (10527,'d005','1996-01-25','9999-01-01'),
582
+ (10528,'d005','1993-10-28','9999-01-01'),
583
+ (10529,'d004','1999-06-12','9999-01-01'),
584
+ (10529,'d005','1997-07-04','1999-06-12'),
585
+ (10530,'d005','1987-09-23','9999-01-01'),
586
+ (10531,'d003','1995-03-16','9999-01-01'),
587
+ (10532,'d007','1986-05-18','9999-01-01'),
588
+ (10533,'d007','1990-08-17','9999-01-01'),
589
+ (10534,'d008','1998-01-26','2001-03-03'),
590
+ (10535,'d009','1991-08-22','9999-01-01'),
591
+ (10536,'d007','1988-10-07','9999-01-01'),
592
+ (10537,'d007','1996-09-25','9999-01-01'),
593
+ (10538,'d004','1991-09-22','1998-12-13'),
594
+ (10538,'d005','1987-07-23','1991-09-22'),
595
+ (10539,'d007','1990-06-05','9999-01-01'),
596
+ (10540,'d004','1994-05-03','9999-01-01'),
597
+ (10541,'d007','1986-02-28','1986-10-01'),
598
+ (10542,'d005','1992-02-07','9999-01-01'),
599
+ (10543,'d002','1998-11-24','9999-01-01'),
600
+ (10544,'d008','1995-04-29','9999-01-01'),
601
+ (10545,'d004','1990-06-30','9999-01-01'),
602
+ (10546,'d008','1991-04-14','9999-01-01'),
603
+ (10547,'d005','1988-02-14','1989-06-19'),
604
+ (10548,'d001','1991-10-04','9999-01-01'),
605
+ (10548,'d007','1986-07-04','1991-10-04'),
606
+ (10549,'d005','1996-10-11','9999-01-01'),
607
+ (10550,'d006','1985-02-03','9999-01-01'),
608
+ (10551,'d006','1988-08-06','9999-01-01'),
609
+ (10552,'d004','1998-08-31','9999-01-01'),
610
+ (10553,'d005','1990-07-22','9999-01-01'),
611
+ (10554,'d005','1990-11-28','9999-01-01'),
612
+ (10555,'d007','1992-05-22','1993-01-19'),
613
+ (10556,'d002','1992-04-15','9999-01-01'),
614
+ (10557,'d005','1992-09-18','1994-08-25'),
615
+ (10557,'d008','1994-08-25','9999-01-01'),
616
+ (10558,'d004','1992-04-22','9999-01-01'),
617
+ (10559,'d007','1999-04-05','9999-01-01'),
618
+ (10560,'d005','1996-09-03','9999-01-01'),
619
+ (10561,'d007','1997-06-30','9999-01-01'),
620
+ (10562,'d005','1997-07-24','9999-01-01'),
621
+ (10563,'d005','1992-09-29','2002-01-01'),
622
+ (10564,'d004','1995-11-23','9999-01-01'),
623
+ (10565,'d004','1996-08-05','9999-01-01'),
624
+ (10566,'d005','1990-08-23','1997-10-26'),
625
+ (10567,'d001','1997-02-17','9999-01-01'),
626
+ (10567,'d007','1992-10-18','1997-02-17'),
627
+ (10568,'d007','1995-07-08','9999-01-01'),
628
+ (10569,'d008','1987-03-13','9999-01-01'),
629
+ (10570,'d007','1986-06-16','2000-03-25'),
630
+ (10571,'d005','1985-02-24','9999-01-01'),
631
+ (10572,'d004','1988-02-16','9999-01-01'),
632
+ (10573,'d007','1999-08-20','9999-01-01'),
633
+ (10574,'d003','1999-11-15','9999-01-01'),
634
+ (10575,'d004','1988-10-04','2000-11-22'),
635
+ (10576,'d002','1991-01-03','9999-01-01'),
636
+ (10577,'d004','2001-08-01','9999-01-01'),
637
+ (10577,'d008','1993-07-02','2001-08-01'),
638
+ (10578,'d005','1989-11-24','9999-01-01'),
639
+ (10579,'d005','1991-06-02','9999-01-01'),
640
+ (10580,'d009','1991-03-02','9999-01-01'),
641
+ (10581,'d004','1994-04-13','9999-01-01'),
642
+ (10582,'d005','1995-11-06','9999-01-01'),
643
+ (10583,'d004','1985-02-14','1998-05-29'),
644
+ (10584,'d005','1986-02-17','9999-01-01'),
645
+ (10585,'d005','1991-01-09','1994-08-24'),
646
+ (10585,'d008','1994-08-24','9999-01-01'),
647
+ (10586,'d004','1992-02-04','9999-01-01'),
648
+ (10587,'d005','1991-11-20','9999-01-01'),
649
+ (10588,'d004','1988-07-25','9999-01-01'),
650
+ (10589,'d002','1994-01-26','9999-01-01'),
651
+ (10590,'d008','1986-04-09','9999-01-01'),
652
+ (10591,'d001','1987-06-18','1988-09-20'),
653
+ (10592,'d007','1993-09-27','9999-01-01'),
654
+ (10593,'d004','2000-03-29','9999-01-01'),
655
+ (10593,'d005','1990-09-12','2000-03-29'),
656
+ (10594,'d005','1988-04-02','9999-01-01'),
657
+ (10595,'d004','1989-11-24','9999-01-01'),
658
+ (10596,'d007','1996-05-23','9999-01-01'),
659
+ (10597,'d007','1990-04-01','9999-01-01'),
660
+ (10598,'d004','1998-06-22','2000-09-27'),
661
+ (10599,'d005','1991-11-17','9999-01-01'),
662
+ (10600,'d007','1992-04-27','9999-01-01'),
663
+ (10601,'d009','1999-07-24','2002-05-09'),
664
+ (10602,'d001','1989-04-23','1993-11-06'),
665
+ (10603,'d007','1995-07-20','9999-01-01'),
666
+ (10604,'d004','2002-07-29','9999-01-01'),
667
+ (10604,'d005','1990-04-07','2002-07-29'),
668
+ (10605,'d006','1993-07-01','9999-01-01'),
669
+ (10606,'d005','1987-05-02','9999-01-01'),
670
+ (10607,'d005','1996-01-13','9999-01-01'),
671
+ (10608,'d004','1986-05-25','1991-06-02'),
672
+ (10609,'d005','1994-12-03','9999-01-01'),
673
+ (10610,'d005','1997-03-30','9999-01-01'),
674
+ (10611,'d005','1989-09-16','9999-01-01'),
675
+ (10612,'d004','1991-09-02','9999-01-01'),
676
+ (10613,'d003','1997-10-13','9999-01-01'),
677
+ (10614,'d004','1990-03-03','1997-02-27'),
678
+ (10614,'d009','1997-02-27','9999-01-01'),
679
+ (10615,'d002','1996-03-10','9999-01-01'),
680
+ (10616,'d007','1996-11-07','9999-01-01'),
681
+ (10617,'d009','1991-10-30','2001-10-03'),
682
+ (10618,'d004','1994-10-07','9999-01-01'),
683
+ (10619,'d007','1993-04-09','9999-01-01'),
684
+ (10620,'d005','1990-11-10','9999-01-01'),
685
+ (10621,'d005','1992-02-10','9999-01-01'),
686
+ (10622,'d004','1989-05-15','9999-01-01'),
687
+ (10623,'d005','1992-01-15','1996-02-11'),
688
+ (10623,'d008','1996-02-11','9999-01-01'),
689
+ (10624,'d004','1990-05-07','9999-01-01'),
690
+ (10625,'d005','1986-07-15','1995-01-13'),
691
+ (10626,'d003','1996-12-03','9999-01-01'),
692
+ (10627,'d003','1995-03-13','9999-01-01'),
693
+ (10628,'d005','1987-03-14','9999-01-01'),
694
+ (10629,'d007','1999-10-20','2001-12-07'),
695
+ (10630,'d004','1997-01-13','9999-01-01'),
696
+ (10631,'d005','1994-10-18','9999-01-01'),
697
+ (10632,'d005','1985-07-25','1987-11-20'),
698
+ (10633,'d007','1997-05-16','9999-01-01'),
699
+ (10634,'d005','1990-11-11','1994-04-02'),
700
+ (10634,'d008','1994-04-02','9999-01-01'),
701
+ (10635,'d004','1991-09-22','1999-12-20'),
702
+ (10636,'d003','1996-09-25','9999-01-01'),
703
+ (10637,'d007','1993-07-11','2000-01-19'),
704
+ (10638,'d007','1994-11-10','9999-01-01'),
705
+ (10639,'d005','1992-10-25','9999-01-01'),
706
+ (10640,'d007','1992-12-04','9999-01-01'),
707
+ (10641,'d005','1993-03-21','9999-01-01'),
708
+ (10642,'d005','1998-10-05','9999-01-01'),
709
+ (10643,'d005','1987-11-11','9999-01-01'),
710
+ (10644,'d002','1985-05-29','1995-07-19'),
711
+ (10644,'d007','1995-07-19','1995-08-25'),
712
+ (10645,'d004','1988-03-01','9999-01-01'),
713
+ (10646,'d009','1996-01-31','9999-01-01'),
714
+ (10647,'d004','1997-09-03','9999-01-01'),
715
+ (10648,'d005','1988-02-16','9999-01-01'),
716
+ (10649,'d009','1998-06-23','9999-01-01'),
717
+ (10650,'d005','1992-10-04','9999-01-01'),
718
+ (10651,'d008','1996-01-08','9999-01-01'),
719
+ (10652,'d008','1990-02-12','1992-01-13'),
720
+ (10653,'d005','1987-04-30','9999-01-01'),
721
+ (10654,'d004','1990-03-25','9999-01-01'),
722
+ (10655,'d002','1997-07-04','2000-11-22'),
723
+ (10655,'d007','2000-11-22','9999-01-01'),
724
+ (10656,'d004','1988-06-21','9999-01-01'),
725
+ (10657,'d002','1992-03-26','9999-01-01'),
726
+ (10658,'d001','1994-04-29','9999-01-01'),
727
+ (10659,'d005','1995-06-01','9999-01-01'),
728
+ (10660,'d005','1988-08-12','1991-07-12'),
729
+ (10661,'d001','1988-01-12','9999-01-01'),
730
+ (10662,'d004','1999-12-17','9999-01-01'),
731
+ (10663,'d004','1999-02-12','9999-01-01'),
732
+ (10663,'d005','1993-01-23','1999-02-12'),
733
+ (10664,'d004','1989-12-24','9999-01-01'),
734
+ (10665,'d005','1988-01-23','2000-07-13'),
735
+ (10666,'d002','1989-05-20','9999-01-01'),
736
+ (10667,'d009','1999-07-28','9999-01-01'),
737
+ (10668,'d002','1997-11-28','1999-09-03'),
738
+ (10669,'d009','1996-11-17','9999-01-01'),
739
+ (10670,'d007','1988-03-23','9999-01-01'),
740
+ (10671,'d003','1995-09-14','9999-01-01'),
741
+ (10672,'d004','1991-09-29','1996-04-19'),
742
+ (10673,'d005','1994-07-29','1997-11-18'),
743
+ (10673,'d008','1997-11-18','1998-01-14'),
744
+ (10674,'d005','1999-03-17','9999-01-01'),
745
+ (10675,'d002','1993-02-02','9999-01-01'),
746
+ (10676,'d005','1999-09-04','9999-01-01'),
747
+ (10677,'d005','1999-10-13','9999-01-01'),
748
+ (10678,'d005','1987-08-02','9999-01-01'),
749
+ (10679,'d003','1990-05-13','9999-01-01'),
750
+ (10680,'d005','1992-11-21','1998-12-08'),
751
+ (10681,'d001','2002-01-08','9999-01-01'),
752
+ (10681,'d007','1995-10-02','2002-01-08'),
753
+ (10682,'d009','1990-11-09','9999-01-01'),
754
+ (10683,'d004','1997-06-23','9999-01-01'),
755
+ (10684,'d004','1999-10-28','9999-01-01'),
756
+ (10685,'d002','1995-12-27','1996-10-20'),
757
+ (10686,'d005','1987-05-17','9999-01-01'),
758
+ (10687,'d008','1990-03-13','9999-01-01'),
759
+ (10688,'d002','1986-04-13','9999-01-01'),
760
+ (10689,'d003','1988-08-05','9999-01-01'),
761
+ (10690,'d004','1995-10-04','9999-01-01'),
762
+ (10690,'d005','1989-08-22','1995-10-04'),
763
+ (10691,'d005','1989-09-17','9999-01-01'),
764
+ (10692,'d007','1993-03-22','9999-01-01'),
765
+ (10693,'d009','1986-01-08','9999-01-01'),
766
+ (10694,'d001','1988-01-26','2001-07-11'),
767
+ (10695,'d004','1998-05-19','9999-01-01'),
768
+ (10696,'d005','1991-09-09','9999-01-01'),
769
+ (10697,'d009','1999-08-29','9999-01-01'),
770
+ (10698,'d005','1994-12-08','9999-01-01'),
771
+ (10699,'d006','1985-11-17','9999-01-01'),
772
+ (10700,'d005','1998-04-14','2002-06-27'),
773
+ (10701,'d007','1986-10-27','1989-10-07'),
774
+ (10701,'d009','1989-10-07','9999-01-01'),
775
+ (10702,'d005','1991-01-14','9999-01-01'),
776
+ (10703,'d004','1996-05-12','9999-01-01'),
777
+ (10704,'d008','1995-02-17','9999-01-01'),
778
+ (10705,'d007','1990-07-18','9999-01-01'),
779
+ (10706,'d004','1994-05-03','2001-04-08'),
780
+ (10707,'d005','1990-12-24','9999-01-01'),
781
+ (10708,'d008','1999-11-09','9999-01-01'),
782
+ (10709,'d005','1986-02-02','1988-02-21'),
783
+ (10709,'d008','1988-02-21','9999-01-01'),
784
+ (10710,'d007','1995-07-09','9999-01-01'),
785
+ (10711,'d005','1991-06-21','9999-01-01'),
786
+ (10712,'d005','1994-08-18','9999-01-01'),
787
+ (10713,'d008','1986-04-26','2001-02-21'),
788
+ (10714,'d005','1999-11-24','9999-01-01'),
789
+ (10715,'d004','1999-10-28','9999-01-01'),
790
+ (10716,'d005','1987-08-12','9999-01-01'),
791
+ (10717,'d003','1991-09-13','9999-01-01'),
792
+ (10718,'d005','1988-07-21','9999-01-01'),
793
+ (10719,'d005','1995-09-05','1999-07-31'),
794
+ (10720,'d004','2001-08-05','9999-01-01'),
795
+ (10720,'d008','1996-06-26','2001-08-05'),
796
+ (10721,'d009','1999-07-15','9999-01-01'),
797
+ (10722,'d001','1989-01-17','2000-04-14'),
798
+ (10723,'d004','1997-07-14','9999-01-01'),
799
+ (10724,'d004','1995-12-07','9999-01-01'),
800
+ (10725,'d007','1990-09-08','9999-01-01'),
801
+ (10726,'d005','1992-02-25','9999-01-01'),
802
+ (10727,'d002','1991-01-08','2000-06-06'),
803
+ (10728,'d006','1989-12-09','9999-01-01'),
804
+ (10729,'d004','1986-04-20','9999-01-01'),
805
+ (10730,'d004','1996-05-27','1998-06-07'),
806
+ (10730,'d005','1996-05-14','1996-05-27'),
807
+ (10731,'d002','1987-02-20','2000-10-09'),
808
+ (10732,'d004','1994-12-21','9999-01-01'),
809
+ (10733,'d009','1996-02-20','9999-01-01'),
810
+ (10734,'d004','1995-12-19','9999-01-01'),
811
+ (10735,'d009','1985-10-29','9999-01-01'),
812
+ (10736,'d006','1991-09-26','9999-01-01'),
813
+ (10737,'d004','1999-06-22','9999-01-01'),
814
+ (10738,'d005','1991-04-30','1992-01-06'),
815
+ (10738,'d008','1992-01-06','9999-01-01'),
816
+ (10739,'d005','1985-03-30','9999-01-01'),
817
+ (10740,'d005','1996-04-30','2002-03-17'),
818
+ (10741,'d001','1989-01-06','9999-01-01'),
819
+ (10742,'d005','1997-04-03','9999-01-01'),
820
+ (10743,'d002','1999-11-05','9999-01-01'),
821
+ (10744,'d007','1985-12-29','1992-06-03'),
822
+ (10745,'d004','1988-01-23','9999-01-01'),
823
+ (10746,'d005','1990-08-31','9999-01-01'),
824
+ (10747,'d004','1990-10-08','1999-09-20'),
825
+ (10748,'d002','1990-08-14','1992-04-04'),
826
+ (10748,'d003','1992-04-04','9999-01-01'),
827
+ (10749,'d004','1985-09-26','9999-01-01'),
828
+ (10750,'d005','1998-11-06','9999-01-01'),
829
+ (10751,'d005','1999-12-14','2000-12-05'),
830
+ (10752,'d006','1993-05-28','9999-01-01'),
831
+ (10753,'d004','1985-05-17','1999-08-25'),
832
+ (10754,'d007','1988-01-11','9999-01-01'),
833
+ (10755,'d005','1995-04-01','2001-11-13'),
834
+ (10756,'d004','2000-12-16','9999-01-01'),
835
+ (10756,'d005','1997-10-07','2000-12-16'),
836
+ (10757,'d005','1986-01-06','1991-10-18'),
837
+ (10758,'d004','1999-07-01','9999-01-01'),
838
+ (10759,'d004','1991-12-04','9999-01-01'),
839
+ (10760,'d002','1997-08-22','9999-01-01'),
840
+ (10761,'d002','1992-05-30','1999-01-04'),
841
+ (10762,'d008','1992-01-21','9999-01-01'),
842
+ (10763,'d004','1987-02-23','9999-01-01'),
843
+ (10764,'d005','1989-11-27','9999-01-01'),
844
+ (10765,'d001','1994-05-08','1994-05-11'),
845
+ (10765,'d007','1994-05-07','1994-05-08'),
846
+ (10766,'d003','1999-09-18','9999-01-01'),
847
+ (10767,'d007','1997-07-15','9999-01-01'),
848
+ (10768,'d004','1985-07-04','9999-01-01'),
849
+ (10769,'d005','1991-08-30','9999-01-01'),
850
+ (10770,'d007','1987-12-25','1989-02-27'),
851
+ (10771,'d009','1996-04-01','9999-01-01'),
852
+ (10772,'d005','1990-02-22','9999-01-01'),
853
+ (10773,'d009','1997-02-09','1997-11-29'),
854
+ (10774,'d004','1990-01-26','9999-01-01'),
855
+ (10775,'d004','1994-12-30','1999-03-17'),
856
+ (10775,'d009','1999-03-17','9999-01-01'),
857
+ (10776,'d005','1986-03-16','9999-01-01'),
858
+ (10777,'d004','1990-03-17','2001-03-27'),
859
+ (10778,'d001','1986-07-04','9999-01-01'),
860
+ (10779,'d009','1988-01-11','9999-01-01'),
861
+ (10780,'d004','1994-08-01','1996-08-18'),
862
+ (10781,'d009','1991-02-04','9999-01-01'),
863
+ (10782,'d008','1997-07-06','2002-03-30'),
864
+ (10783,'d003','1994-05-15','9999-01-01'),
865
+ (10784,'d005','1998-10-14','9999-01-01'),
866
+ (10785,'d006','1994-11-11','9999-01-01'),
867
+ (10786,'d004','1997-06-06','2001-12-10'),
868
+ (10786,'d006','2001-12-10','9999-01-01'),
869
+ (10787,'d001','1991-07-19','2002-07-27'),
870
+ (10788,'d007','1998-05-29','9999-01-01'),
871
+ (10789,'d009','1998-01-26','9999-01-01'),
872
+ (10790,'d004','1999-03-02','9999-01-01'),
873
+ (10791,'d005','1988-07-30','9999-01-01'),
874
+ (10792,'d005','1985-08-10','1993-12-20'),
875
+ (10793,'d005','1990-09-18','9999-01-01'),
876
+ (10794,'d008','1994-05-24','9999-01-01'),
877
+ (10795,'d007','1993-05-03','9999-01-01'),
878
+ (10796,'d006','1990-11-08','9999-01-01'),
879
+ (10797,'d004','1997-06-02','9999-01-01'),
880
+ (10797,'d005','1988-08-21','1997-06-02'),
881
+ (10798,'d004','1996-09-21','9999-01-01'),
882
+ (10799,'d005','1989-03-01','9999-01-01'),
883
+ (10800,'d004','1993-05-20','9999-01-01'),
884
+ (10801,'d004','1998-04-07','2001-01-15'),
885
+ (10802,'d004','1985-08-24','9999-01-01'),
886
+ (10803,'d006','1988-04-20','2002-04-02'),
887
+ (10804,'d007','1997-06-09','9999-01-01'),
888
+ (10805,'d008','1987-05-26','9999-01-01'),
889
+ (10806,'d002','1993-04-25','1994-04-08'),
890
+ (10806,'d003','1994-04-08','9999-01-01'),
891
+ (10807,'d007','1999-10-19','9999-01-01'),
892
+ (10808,'d005','1987-03-07','9999-01-01'),
893
+ (10809,'d005','1988-02-25','9999-01-01'),
894
+ (10810,'d007','1994-09-07','9999-01-01'),
895
+ (10811,'d004','1997-07-08','9999-01-01'),
896
+ (10812,'d004','1996-09-20','1997-10-06'),
897
+ (10813,'d007','1990-04-27','9999-01-01'),
898
+ (10814,'d007','1993-07-17','9999-01-01'),
899
+ (10815,'d003','1994-04-19','9999-01-01'),
900
+ (10816,'d009','1991-05-22','9999-01-01'),
901
+ (10817,'d007','1990-12-26','2000-01-24'),
902
+ (10817,'d009','2000-01-24','9999-01-01'),
903
+ (10818,'d003','1998-04-09','9999-01-01'),
904
+ (10819,'d004','1986-08-02','1999-12-28'),
905
+ (10820,'d001','1992-06-26','9999-01-01'),
906
+ (10821,'d005','1988-10-06','1990-04-17'),
907
+ (10822,'d005','1986-01-11','9999-01-01'),
908
+ (10823,'d003','1999-08-19','9999-01-01'),
909
+ (10824,'d001','1995-08-01','9999-01-01'),
910
+ (10825,'d004','2000-06-03','9999-01-01'),
911
+ (10825,'d005','1993-12-04','2000-06-03'),
912
+ (10826,'d005','1993-01-22','9999-01-01'),
913
+ (10827,'d002','1996-11-07','9999-01-01'),
914
+ (10828,'d007','1986-02-14','1990-03-30'),
915
+ (10829,'d003','1993-07-21','1993-11-29'),
916
+ (10830,'d001','1991-08-24','9999-01-01'),
917
+ (10831,'d005','1998-02-22','9999-01-01'),
918
+ (10832,'d007','1986-10-11','9999-01-01'),
919
+ (10833,'d006','1998-12-23','9999-01-01'),
920
+ (10834,'d004','1990-11-24','9999-01-01'),
921
+ (10835,'d004','1995-08-22','9999-01-01'),
922
+ (10836,'d007','1987-08-10','1991-07-01'),
923
+ (10836,'d009','1991-07-01','9999-01-01'),
924
+ (10837,'d007','1986-01-14','2002-02-22'),
925
+ (10838,'d006','1994-04-26','9999-01-01'),
926
+ (10839,'d004','1996-12-30','9999-01-01'),
927
+ (10840,'d004','1993-06-04','9999-01-01'),
928
+ (10841,'d009','1992-01-22','9999-01-01'),
929
+ (10842,'d005','1986-07-14','1998-06-27'),
930
+ (10843,'d005','1990-04-26','9999-01-01'),
931
+ (10844,'d005','1997-04-25','9999-01-01'),
932
+ (10845,'d005','1997-01-25','9999-01-01'),
933
+ (10846,'d005','1995-01-17','1997-04-03'),
934
+ (10846,'d008','1997-04-03','9999-01-01'),
935
+ (10847,'d008','1986-07-25','9999-01-01'),
936
+ (10848,'d004','1985-04-20','9999-01-01'),
937
+ (10849,'d005','1995-06-25','9999-01-01'),
938
+ (10850,'d002','1990-04-22','1995-05-11'),
939
+ (10851,'d008','1994-11-21','9999-01-01'),
940
+ (10852,'d004','1999-08-21','9999-01-01'),
941
+ (10853,'d006','1993-05-03','9999-01-01'),
942
+ (10854,'d005','1998-07-13','9999-01-01'),
943
+ (10855,'d002','1993-03-29','1997-03-02'),
944
+ (10855,'d007','1997-03-02','9999-01-01'),
945
+ (10856,'d009','1986-12-31','1990-06-18'),
946
+ (10857,'d007','1990-04-04','9999-01-01'),
947
+ (10858,'d005','1997-01-01','9999-01-01'),
948
+ (10859,'d001','1996-05-21','9999-01-01'),
949
+ (10860,'d006','1998-01-22','9999-01-01'),
950
+ (10861,'d005','1989-06-10','1992-04-12'),
951
+ (10862,'d007','1985-07-23','9999-01-01'),
952
+ (10863,'d004','1985-12-25','9999-01-01'),
953
+ (10864,'d007','1986-09-25','9999-01-01'),
954
+ (10865,'d007','1993-05-29','1993-07-03'),
955
+ (10865,'d009','1993-07-03','1993-09-19'),
956
+ (10866,'d002','1990-12-27','9999-01-01'),
957
+ (10867,'d004','1997-03-23','2002-03-22'),
958
+ (10868,'d004','1990-03-20','9999-01-01'),
959
+ (10869,'d009','1997-09-04','1998-10-15'),
960
+ (10870,'d004','1988-01-13','9999-01-01'),
961
+ (10871,'d009','1999-06-16','9999-01-01'),
962
+ (10872,'d002','1990-09-06','9999-01-01'),
963
+ (10873,'d002','1994-03-23','9999-01-01'),
964
+ (10874,'d004','1986-04-22','1997-12-28'),
965
+ (10874,'d006','1997-12-28','9999-01-01'),
966
+ (10875,'d006','1988-05-19','9999-01-01'),
967
+ (10876,'d007','1995-01-29','1999-09-14'),
968
+ (10877,'d001','1986-06-06','9999-01-01'),
969
+ (10878,'d007','1997-04-25','9999-01-01'),
970
+ (10879,'d005','1985-08-15','9999-01-01'),
971
+ (10880,'d004','1992-01-11','9999-01-01'),
972
+ (10881,'d004','1997-02-18','1998-10-25'),
973
+ (10882,'d005','1999-04-29','9999-01-01'),
974
+ (10883,'d004','1996-12-28','9999-01-01'),
975
+ (10884,'d005','1993-04-15','9999-01-01'),
976
+ (10885,'d001','1997-09-29','9999-01-01'),
977
+ (10885,'d007','1991-08-19','1997-09-29'),
978
+ (10886,'d005','1995-03-26','9999-01-01'),
979
+ (10887,'d005','1989-03-17','9999-01-01'),
980
+ (10888,'d005','1987-06-28','1989-09-11'),
981
+ (10889,'d007','1987-08-11','9999-01-01'),
982
+ (10890,'d007','1990-03-10','9999-01-01'),
983
+ (10891,'d005','1995-10-06','9999-01-01'),
984
+ (10892,'d003','1990-04-11','9999-01-01'),
985
+ (10893,'d001','1989-08-23','9999-01-01'),
986
+ (10894,'d004','1995-12-05','9999-01-01'),
987
+ (10895,'d007','1986-04-26','1986-12-25'),
988
+ (10895,'d009','1986-12-25','1987-04-13'),
989
+ (10896,'d004','1997-11-27','9999-01-01'),
990
+ (10897,'d007','1986-04-09','9999-01-01'),
991
+ (10898,'d004','1993-01-08','9999-01-01'),
992
+ (10899,'d001','1990-04-05','9999-01-01'),
993
+ (10900,'d005','1995-09-07','9999-01-01'),
994
+ (10901,'d002','1998-08-05','9999-01-01'),
995
+ (10902,'d005','1990-06-11','1990-09-25'),
996
+ (10903,'d009','1989-02-14','9999-01-01'),
997
+ (10904,'d005','1993-04-16','9999-01-01'),
998
+ (10905,'d004','1985-02-28','1986-03-07'),
999
+ (10906,'d002','1998-10-18','2001-04-25'),
1000
+ (10906,'d007','2001-04-25','9999-01-01'),
1001
+ (10907,'d003','1988-12-25','9999-01-01'),
1002
+ (10908,'d003','1986-04-05','9999-01-01'),
1003
+ (10909,'d005','1993-12-26','9999-01-01'),
1004
+ (10910,'d009','1989-09-02','9999-01-01'),
1005
+ (10911,'d004','1988-06-25','9999-01-01'),
1006
+ (10912,'d002','1986-04-23','1999-09-26'),
1007
+ (10913,'d002','1998-10-25','9999-01-01'),
1008
+ (10914,'d007','1998-03-24','1998-09-01'),
1009
+ (10915,'d004','1999-10-28','9999-01-01'),
1010
+ (10916,'d004','1998-10-02','9999-01-01'),
1011
+ (10916,'d005','1998-03-12','1998-10-02'),
1012
+ (10917,'d005','1993-01-30','9999-01-01'),
1013
+ (10918,'d002','1990-01-29','1990-10-10'),
1014
+ (10919,'d001','1999-10-30','9999-01-01'),
1015
+ (10920,'d003','1992-02-24','9999-01-01'),
1016
+ (10921,'d004','1986-07-27','9999-01-01'),
1017
+ (10922,'d007','1996-02-02','1999-01-16'),
1018
+ (10923,'d007','1990-04-09','9999-01-01'),
1019
+ (10924,'d007','1988-08-14','9999-01-01'),
1020
+ (10925,'d004','1991-06-11','9999-01-01'),
1021
+ (10926,'d004','1990-04-30','1992-11-04'),
1022
+ (10926,'d009','1992-11-04','9999-01-01'),
1023
+ (10927,'d001','1986-09-12','9999-01-01'),
1024
+ (10928,'d001','1991-04-07','9999-01-01'),
1025
+ (10929,'d001','1991-04-15','9999-01-01'),
1026
+ (10930,'d004','1991-11-22','9999-01-01'),
1027
+ (10931,'d004','1992-06-14','1999-09-19'),
1028
+ (10932,'d005','1994-09-09','9999-01-01'),
1029
+ (10933,'d004','1993-08-02','9999-01-01'),
1030
+ (10934,'d002','1995-09-17','9999-01-01'),
1031
+ (10935,'d002','1994-10-17','9999-01-01'),
1032
+ (10936,'d003','1990-05-09','9999-01-01'),
1033
+ (10937,'d004','1991-05-03','9999-01-01'),
1034
+ (10937,'d005','1988-06-16','1991-05-03'),
1035
+ (10938,'d001','1985-09-24','9999-01-01'),
1036
+ (10939,'d006','1997-12-11','9999-01-01'),
1037
+ (10940,'d005','1997-06-30','1999-12-02'),
1038
+ (10941,'d001','1993-08-22','9999-01-01'),
1039
+ (10942,'d005','1996-01-21','9999-01-01'),
1040
+ (10943,'d005','1993-05-22','9999-01-01'),
1041
+ (10944,'d004','1995-09-07','9999-01-01'),
1042
+ (10945,'d004','1993-04-04','9999-01-01'),
1043
+ (10946,'d009','1996-10-26','9999-01-01'),
1044
+ (10947,'d009','1995-11-16','9999-01-01'),
1045
+ (10948,'d005','1996-09-30','1997-04-29'),
1046
+ (10948,'d008','1997-04-29','1997-06-23'),
1047
+ (10949,'d002','1990-06-29','9999-01-01'),
1048
+ (10950,'d004','1996-06-08','1998-01-13'),
1049
+ (10951,'d002','1989-07-06','9999-01-01'),
1050
+ (10952,'d005','1986-07-22','1988-04-26'),
1051
+ (10953,'d007','1987-02-12','9999-01-01'),
1052
+ (10954,'d009','1995-12-14','9999-01-01'),
1053
+ (10955,'d007','1986-09-27','9999-01-01'),
1054
+ (10956,'d004','1997-02-10','9999-01-01'),
1055
+ (10956,'d005','1995-12-02','1997-02-10'),
1056
+ (10957,'d007','1990-10-01','9999-01-01'),
1057
+ (10958,'d005','1988-11-27','9999-01-01'),
1058
+ (10959,'d007','1994-03-01','1996-04-12'),
1059
+ (10960,'d007','1995-07-07','9999-01-01'),
1060
+ (10961,'d005','1993-11-04','9999-01-01'),
1061
+ (10962,'d007','1986-12-16','9999-01-01'),
1062
+ (10963,'d005','1988-01-14','1995-04-10'),
1063
+ (10964,'d002','1991-05-05','9999-01-01'),
1064
+ (10965,'d007','1986-07-29','9999-01-01'),
1065
+ (10966,'d004','1999-11-12','9999-01-01'),
1066
+ (10966,'d008','1997-02-05','1999-11-12'),
1067
+ (10967,'d005','1993-08-01','9999-01-01'),
1068
+ (10968,'d007','1985-08-11','9999-01-01'),
1069
+ (10969,'d005','1994-05-12','9999-01-01'),
1070
+ (10970,'d004','1995-11-14','9999-01-01'),
1071
+ (10971,'d005','1991-07-30','1998-10-24'),
1072
+ (10972,'d005','1987-06-06','9999-01-01'),
1073
+ (10973,'d005','1989-03-05','9999-01-01'),
1074
+ (10974,'d005','1999-05-17','9999-01-01'),
1075
+ (10975,'d004','1992-03-30','1997-01-14'),
1076
+ (10975,'d009','1997-01-14','9999-01-01'),
1077
+ (10976,'d004','1998-10-31','9999-01-01'),
1078
+ (10977,'d007','1987-08-10','1987-10-01'),
1079
+ (10978,'d004','1985-05-18','9999-01-01'),
1080
+ (10979,'d004','1986-01-27','9999-01-01'),
1081
+ (10980,'d005','1989-01-04','9999-01-01'),
1082
+ (10981,'d007','1992-07-07','9999-01-01'),
1083
+ (10982,'d008','1989-11-11','9999-01-01'),
1084
+ (10983,'d004','1988-02-22','9999-01-01'),
1085
+ (10984,'d004','1988-07-09','1993-05-14'),
1086
+ (10985,'d005','1999-02-11','1999-02-27'),
1087
+ (10985,'d008','1999-02-27','1999-03-10'),
1088
+ (10986,'d005','1985-10-11','9999-01-01'),
1089
+ (10987,'d005','1997-05-21','9999-01-01'),
1090
+ (10988,'d005','1985-06-19','9999-01-01'),
1091
+ (10989,'d002','1985-07-20','9999-01-01'),
1092
+ (10990,'d005','1990-08-06','9999-01-01'),
1093
+ (10991,'d005','1999-07-13','9999-01-01'),
1094
+ (10992,'d005','1997-04-27','9999-01-01'),
1095
+ (10993,'d006','1992-05-29','9999-01-01'),
1096
+ (10994,'d004','1987-11-13','1989-05-24'),
1097
+ (10994,'d005','1987-06-29','1987-11-13'),
1098
+ (10995,'d001','1997-07-19','9999-01-01'),
1099
+ (10996,'d007','1990-02-07','9999-01-01'),
1100
+ (10997,'d004','2000-01-04','9999-01-01'),
1101
+ (10998,'d007','1996-08-07','9999-01-01'),
1102
+ (10999,'d005','1996-03-05','1997-04-19'),
1103
+ (11000,'d005','1996-01-28','9999-01-01');
employee-sample-database/postgres/dataset_small/load_dept_manager.sql ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ INSERT INTO dept_manager VALUES
2
+ (10002,'d001','1985-01-01','1991-10-01'),
3
+
4
+ (10039,'d001','1991-10-01','9999-01-01'),
5
+
6
+ (10085,'d002','1985-01-01','1989-12-17'),
7
+
8
+ (10114,'d002','1989-12-17','9999-01-01'),
9
+
10
+ (10183,'d003','1985-01-01','1992-03-21'),
11
+
12
+ (10228,'d003','1992-03-21','9999-01-01'),
13
+
14
+ (10303,'d004','1985-01-01','1988-09-09'),
15
+
16
+ (10344,'d004','1988-09-09','1992-08-02'),
17
+
18
+ (10386,'d004','1992-08-02','1996-08-30'),
19
+
20
+ (10420,'d004','1996-08-30','9999-01-01'),
21
+
22
+ (10511,'d005','1985-01-01','1992-04-25'),
23
+
24
+ (10567,'d005','1992-04-25','9999-01-01'),
25
+
26
+ (10725,'d006','1985-01-01','1989-05-06'),
27
+
28
+ (10765,'d006','1989-05-06','1991-09-12'),
29
+
30
+ (10800,'d006','1991-09-12','1994-06-28'),
31
+
32
+ (10854,'d006','1994-06-28','9999-01-01');
employee-sample-database/postgres/dataset_small/load_employee.sql ADDED
@@ -0,0 +1,1000 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ INSERT INTO employee VALUES (10001,'1953-09-02','Georgi','Facello','M','1986-06-26'),
2
+ (10002,'1964-06-02','Bezalel','Simmel','F','1985-11-21'),
3
+ (10003,'1959-12-03','Parto','Bamford','M','1986-08-28'),
4
+ (10004,'1954-05-01','Chirstian','Koblick','M','1986-12-01'),
5
+ (10005,'1955-01-21','Kyoichi','Maliniak','M','1989-09-12'),
6
+ (10006,'1953-04-20','Anneke','Preusig','F','1989-06-02'),
7
+ (10007,'1957-05-23','Tzvetan','Zielinski','F','1989-02-10'),
8
+ (10008,'1958-02-19','Saniya','Kalloufi','M','1994-09-15'),
9
+ (10009,'1952-04-19','Sumant','Peac','F','1985-02-18'),
10
+ (10010,'1963-06-01','Duangkaew','Piveteau','F','1989-08-24'),
11
+ (10011,'1953-11-07','Mary','Sluis','F','1990-01-22'),
12
+ (10012,'1960-10-04','Patricio','Bridgland','M','1992-12-18'),
13
+ (10013,'1963-06-07','Eberhardt','Terkki','M','1985-10-20'),
14
+ (10014,'1956-02-12','Berni','Genin','M','1987-03-11'),
15
+ (10015,'1959-08-19','Guoxiang','Nooteboom','M','1987-07-02'),
16
+ (10016,'1961-05-02','Kazuhito','Cappelletti','M','1995-01-27'),
17
+ (10017,'1958-07-06','Cristinel','Bouloucos','F','1993-08-03'),
18
+ (10018,'1954-06-19','Kazuhide','Peha','F','1987-04-03'),
19
+ (10019,'1953-01-23','Lillian','Haddadi','M','1999-04-30'),
20
+ (10020,'1952-12-24','Mayuko','Warwick','M','1991-01-26'),
21
+ (10021,'1960-02-20','Ramzi','Erde','M','1988-02-10'),
22
+ (10022,'1952-07-08','Shahaf','Famili','M','1995-08-22'),
23
+ (10023,'1953-09-29','Bojan','Montemayor','F','1989-12-17'),
24
+ (10024,'1958-09-05','Suzette','Pettey','F','1997-05-19'),
25
+ (10025,'1958-10-31','Prasadram','Heyers','M','1987-08-17'),
26
+ (10026,'1953-04-03','Yongqiao','Berztiss','M','1995-03-20'),
27
+ (10027,'1962-07-10','Divier','Reistad','F','1989-07-07'),
28
+ (10028,'1963-11-26','Domenick','Tempesti','M','1991-10-22'),
29
+ (10029,'1956-12-13','Otmar','Herbst','M','1985-11-20'),
30
+ (10030,'1958-07-14','Elvis','Demeyer','M','1994-02-17'),
31
+ (10031,'1959-01-27','Karsten','Joslin','M','1991-09-01'),
32
+ (10032,'1960-08-09','Jeong','Reistad','F','1990-06-20'),
33
+ (10033,'1956-11-14','Arif','Merlo','M','1987-03-18'),
34
+ (10034,'1962-12-29','Bader','Swan','M','1988-09-21'),
35
+ (10035,'1953-02-08','Alain','Chappelet','M','1988-09-05'),
36
+ (10036,'1959-08-10','Adamantios','Portugali','M','1992-01-03'),
37
+ (10037,'1963-07-22','Pradeep','Makrucki','M','1990-12-05'),
38
+ (10038,'1960-07-20','Huan','Lortz','M','1989-09-20'),
39
+ (10039,'1959-10-01','Alejandro','Brender','M','1988-01-19'),
40
+ (10040,'1959-09-13','Weiyi','Meriste','F','1993-02-14'),
41
+ (10041,'1959-08-27','Uri','Lenart','F','1989-11-12'),
42
+ (10042,'1956-02-26','Magy','Stamatiou','F','1993-03-21'),
43
+ (10043,'1960-09-19','Yishay','Tzvieli','M','1990-10-20'),
44
+ (10044,'1961-09-21','Mingsen','Casley','F','1994-05-21'),
45
+ (10045,'1957-08-14','Moss','Shanbhogue','M','1989-09-02'),
46
+ (10046,'1960-07-23','Lucien','Rosenbaum','M','1992-06-20'),
47
+ (10047,'1952-06-29','Zvonko','Nyanchama','M','1989-03-31'),
48
+ (10048,'1963-07-11','Florian','Syrotiuk','M','1985-02-24'),
49
+ (10049,'1961-04-24','Basil','Tramer','F','1992-05-04'),
50
+ (10050,'1958-05-21','Yinghua','Dredge','M','1990-12-25'),
51
+ (10051,'1953-07-28','Hidefumi','Caine','M','1992-10-15'),
52
+ (10052,'1961-02-26','Heping','Nitsch','M','1988-05-21'),
53
+ (10053,'1954-09-13','Sanjiv','Zschoche','F','1986-02-04'),
54
+ (10054,'1957-04-04','Mayumi','Schueller','M','1995-03-13'),
55
+ (10055,'1956-06-06','Georgy','Dredge','M','1992-04-27'),
56
+ (10056,'1961-09-01','Brendon','Bernini','F','1990-02-01'),
57
+ (10057,'1954-05-30','Ebbe','Callaway','F','1992-01-15'),
58
+ (10058,'1954-10-01','Berhard','McFarlin','M','1987-04-13'),
59
+ (10059,'1953-09-19','Alejandro','McAlpine','F','1991-06-26'),
60
+ (10060,'1961-10-15','Breannda','Billingsley','M','1987-11-02'),
61
+ (10061,'1962-10-19','Tse','Herber','M','1985-09-17'),
62
+ (10062,'1961-11-02','Anoosh','Peyn','M','1991-08-30'),
63
+ (10063,'1952-08-06','Gino','Leonhardt','F','1989-04-08'),
64
+ (10064,'1959-04-07','Udi','Jansch','M','1985-11-20'),
65
+ (10065,'1963-04-14','Satosi','Awdeh','M','1988-05-18'),
66
+ (10066,'1952-11-13','Kwee','Schusler','M','1986-02-26'),
67
+ (10067,'1953-01-07','Claudi','Stavenow','M','1987-03-04'),
68
+ (10068,'1962-11-26','Charlene','Brattka','M','1987-08-07'),
69
+ (10069,'1960-09-06','Margareta','Bierman','F','1989-11-05'),
70
+ (10070,'1955-08-20','Reuven','Garigliano','M','1985-10-14'),
71
+ (10071,'1958-01-21','Hisao','Lipner','M','1987-10-01'),
72
+ (10072,'1952-05-15','Hironoby','Sidou','F','1988-07-21'),
73
+ (10073,'1954-02-23','Shir','McClurg','M','1991-12-01'),
74
+ (10074,'1955-08-28','Mokhtar','Bernatsky','F','1990-08-13'),
75
+ (10075,'1960-03-09','Gao','Dolinsky','F','1987-03-19'),
76
+ (10076,'1952-06-13','Erez','Ritzmann','F','1985-07-09'),
77
+ (10077,'1964-04-18','Mona','Azuma','M','1990-03-02'),
78
+ (10078,'1959-12-25','Danel','Mondadori','F','1987-05-26'),
79
+ (10079,'1961-10-05','Kshitij','Gils','F','1986-03-27'),
80
+ (10080,'1957-12-03','Premal','Baek','M','1985-11-19'),
81
+ (10081,'1960-12-17','Zhongwei','Rosen','M','1986-10-30'),
82
+ (10082,'1963-09-09','Parviz','Lortz','M','1990-01-03'),
83
+ (10083,'1959-07-23','Vishv','Zockler','M','1987-03-31'),
84
+ (10084,'1960-05-25','Tuval','Kalloufi','M','1995-12-15'),
85
+ (10085,'1962-11-07','Kenroku','Malabarba','M','1994-04-09'),
86
+ (10086,'1962-11-19','Somnath','Foote','M','1990-02-16'),
87
+ (10087,'1959-07-23','Xinglin','Eugenio','F','1986-09-08'),
88
+ (10088,'1954-02-25','Jungsoon','Syrzycki','F','1988-09-02'),
89
+ (10089,'1963-03-21','Sudharsan','Flasterstein','F','1986-08-12'),
90
+ (10090,'1961-05-30','Kendra','Hofting','M','1986-03-14'),
91
+ (10091,'1955-10-04','Amabile','Gomatam','M','1992-11-18'),
92
+ (10092,'1964-10-18','Valdiodio','Niizuma','F','1989-09-22'),
93
+ (10093,'1964-06-11','Sailaja','Desikan','M','1996-11-05'),
94
+ (10094,'1957-05-25','Arumugam','Ossenbruggen','F','1987-04-18'),
95
+ (10095,'1965-01-03','Hilari','Morton','M','1986-07-15'),
96
+ (10096,'1954-09-16','Jayson','Mandell','M','1990-01-14'),
97
+ (10097,'1952-02-27','Remzi','Waschkowski','M','1990-09-15'),
98
+ (10098,'1961-09-23','Sreekrishna','Servieres','F','1985-05-13'),
99
+ (10099,'1956-05-25','Valter','Sullins','F','1988-10-18'),
100
+ (10100,'1953-04-21','Hironobu','Haraldson','F','1987-09-21'),
101
+ (10101,'1952-04-15','Perla','Heyers','F','1992-12-28'),
102
+ (10102,'1959-11-04','Paraskevi','Luby','F','1994-01-26'),
103
+ (10103,'1953-11-26','Akemi','Birch','M','1986-12-02'),
104
+ (10104,'1961-11-19','Xinyu','Warwick','M','1987-04-16'),
105
+ (10105,'1962-02-05','Hironoby','Piveteau','M','1999-03-23'),
106
+ (10106,'1952-08-29','Eben','Aingworth','M','1990-12-19'),
107
+ (10107,'1956-06-13','Dung','Baca','F','1994-03-22'),
108
+ (10108,'1952-04-07','Lunjin','Giveon','M','1986-10-02'),
109
+ (10109,'1958-11-25','Mariusz','Prampolini','F','1993-06-16'),
110
+ (10110,'1957-03-07','Xuejia','Ullian','F','1986-08-22'),
111
+ (10111,'1963-08-29','Hugo','Rosis','F','1988-06-19'),
112
+ (10112,'1963-08-13','Yuichiro','Swick','F','1985-10-08'),
113
+ (10113,'1963-11-13','Jaewon','Syrzycki','M','1989-12-24'),
114
+ (10114,'1957-02-16','Munir','Demeyer','F','1992-07-17'),
115
+ (10115,'1964-12-25','Chikara','Rissland','M','1986-01-23'),
116
+ (10116,'1955-08-26','Dayanand','Czap','F','1985-05-28'),
117
+ (10117,'1961-10-24','Kiyotoshi','Blokdijk','F','1990-05-28'),
118
+ (10118,'1957-03-29','Zhonghui','Zyda','F','1990-09-13'),
119
+ (10119,'1960-12-01','Domenick','Peltason','M','1986-03-14'),
120
+ (10120,'1960-03-26','Armond','Fairtlough','F','1996-07-06'),
121
+ (10121,'1962-07-14','Guoxiang','Ramsay','M','1989-05-03'),
122
+ (10122,'1965-01-19','Ohad','Esposito','M','1992-12-23'),
123
+ (10123,'1962-05-12','Hinrich','Randi','M','1993-01-15'),
124
+ (10124,'1962-05-23','Geraldo','Marwedel','M','1991-09-05'),
125
+ (10125,'1957-09-13','Syozo','Hiltgen','F','1990-10-26'),
126
+ (10126,'1954-08-07','Kayoko','Valtorta','M','1985-09-08'),
127
+ (10127,'1952-02-24','Subir','Baja','F','1989-01-14'),
128
+ (10128,'1958-02-15','Babette','Lamba','F','1988-06-06'),
129
+ (10129,'1955-12-02','Armond','Peir','M','1985-12-10'),
130
+ (10130,'1955-04-27','Nishit','Casperson','M','1988-06-21'),
131
+ (10131,'1952-02-19','Magdalena','Eldridge','M','1994-11-17'),
132
+ (10132,'1956-12-15','Ayakannu','Skrikant','M','1994-10-30'),
133
+ (10133,'1963-12-12','Giri','Isaak','M','1985-12-15'),
134
+ (10134,'1953-04-15','Diederik','Siprelle','M','1987-12-12'),
135
+ (10135,'1956-12-23','Nathan','Monkewich','M','1988-02-19'),
136
+ (10136,'1961-09-14','Zissis','Pintelas','M','1986-02-11'),
137
+ (10137,'1959-07-30','Maren','Hutton','M','1985-02-18'),
138
+ (10138,'1955-04-24','Perry','Shimshoni','M','1986-09-18'),
139
+ (10139,'1963-03-03','Ewing','Foong','F','1998-03-15'),
140
+ (10140,'1957-03-11','Yucel','Auria','F','1991-03-14'),
141
+ (10141,'1960-01-17','Shahaf','Ishibashi','F','1993-05-06'),
142
+ (10142,'1956-08-29','Tzvetan','Hettesheimer','M','1993-10-28'),
143
+ (10143,'1961-07-16','Sakthirel','Bakhtari','M','1988-09-30'),
144
+ (10144,'1959-06-17','Marla','Brendel','M','1985-10-14'),
145
+ (10145,'1956-03-30','Akemi','Esposito','F','1987-08-01'),
146
+ (10146,'1959-01-12','Chenyi','Syang','M','1988-06-28'),
147
+ (10147,'1964-10-13','Kazuhito','Encarnacion','M','1986-08-21'),
148
+ (10148,'1957-10-04','Douadi','Azumi','M','1995-10-10'),
149
+ (10149,'1953-05-20','Xiadong','Perry','F','1986-11-05'),
150
+ (10150,'1955-01-29','Zhenbing','Perng','F','1986-11-16'),
151
+ (10151,'1959-03-06','Itzchak','Lichtner','M','1990-04-10'),
152
+ (10152,'1954-12-01','Jaques','Munro','F','1986-01-27'),
153
+ (10153,'1955-12-15','Heekeun','Majewski','M','1987-04-08'),
154
+ (10154,'1957-01-17','Abdulah','Thibadeau','F','1990-12-12'),
155
+ (10155,'1959-12-07','Adas','Nastansky','M','1990-01-05'),
156
+ (10156,'1964-09-19','Sumali','Fargier','M','1985-03-10'),
157
+ (10157,'1954-04-23','Nigel','Aloisi','M','1985-11-02'),
158
+ (10158,'1958-04-01','Khedija','Mitsuhashi','M','1986-01-29'),
159
+ (10159,'1955-03-03','Serif','Buescher','M','1991-05-29'),
160
+ (10160,'1953-10-18','Debatosh','Khasidashvili','M','1989-01-30'),
161
+ (10161,'1953-04-06','Hairong','Mellouli','F','1988-04-03'),
162
+ (10162,'1957-10-05','Florina','Eugenio','M','1991-05-01'),
163
+ (10163,'1952-09-17','Karsten','Szmurlo','M','1989-07-19'),
164
+ (10164,'1956-01-19','Jagoda','Braunmuhl','M','1985-11-12'),
165
+ (10165,'1960-06-16','Miyeon','Macedo','M','1988-05-17'),
166
+ (10166,'1953-05-10','Samphel','Siegrist','F','1993-01-01'),
167
+ (10167,'1958-05-23','Duangkaew','Rassart','M','1992-04-04'),
168
+ (10168,'1964-09-11','Dharmaraja','Stassinopoulos','M','1986-12-06'),
169
+ (10169,'1961-05-03','Sampalli','Snedden','F','1992-07-24'),
170
+ (10170,'1960-10-03','Kasturi','Jenevein','F','1986-01-02'),
171
+ (10171,'1957-09-11','Herbert','Trachtenberg','M','1989-07-22'),
172
+ (10172,'1957-03-25','Shigeu','Matzen','F','1995-10-13'),
173
+ (10173,'1962-10-28','Shrikanth','Mahmud','M','1992-03-21'),
174
+ (10174,'1959-05-15','Badri','Furudate','M','1987-06-01'),
175
+ (10175,'1960-01-11','Aleksandar','Ananiadou','F','1988-01-11'),
176
+ (10176,'1957-01-24','Brendon','Lenart','F','1994-12-22'),
177
+ (10177,'1954-11-08','Pragnesh','Iisaka','M','1993-02-06'),
178
+ (10178,'1963-03-13','Valery','Litvinov','M','1986-10-07'),
179
+ (10179,'1961-11-25','Deniz','Duclos','F','1990-10-04'),
180
+ (10180,'1956-01-29','Shaw','Wendorf','M','1986-02-25'),
181
+ (10181,'1963-01-22','Sibyl','Nooteboom','M','1988-06-22'),
182
+ (10182,'1961-02-04','Moriyoshi','Merey','F','1990-09-02'),
183
+ (10183,'1954-10-17','Mechthild','Bonifati','M','1996-08-11'),
184
+ (10184,'1957-05-22','Mihalis','Lowrie','M','1987-10-29'),
185
+ (10185,'1959-12-05','Duro','Sidhu','F','1986-03-01'),
186
+ (10186,'1953-07-16','Shigehito','Kropatsch','M','1986-03-28'),
187
+ (10187,'1961-05-26','Tommaso','Narwekar','F','1991-06-01'),
188
+ (10188,'1956-07-13','Christ','Muchinsky','F','1987-08-27'),
189
+ (10189,'1955-11-12','Khalid','Erva','M','1989-10-05'),
190
+ (10190,'1964-12-11','Arve','Fairtlough','F','1986-06-23'),
191
+ (10191,'1959-04-08','Zdislav','Nastansky','M','1986-04-10'),
192
+ (10192,'1960-09-16','Mohua','Falck','M','1988-06-13'),
193
+ (10193,'1960-06-29','Masaru','Cheshire','M','1991-07-28'),
194
+ (10194,'1954-01-29','Josyula','Hofmeyr','F','1989-05-15'),
195
+ (10195,'1963-11-13','Annemarie','Redmiles','M','1985-02-15'),
196
+ (10196,'1954-01-27','Marc','Hellwagner','M','1994-11-16'),
197
+ (10197,'1963-08-06','Kasidit','Krzyzanowski','F','1993-11-22'),
198
+ (10198,'1953-05-28','Pranav','Furedi','M','1985-08-31'),
199
+ (10199,'1959-04-07','Kazuhisa','Ranta','M','1997-04-29'),
200
+ (10200,'1961-12-31','Vidya','Awdeh','M','1985-10-16'),
201
+ (10201,'1956-12-15','Idoia','Kavraki','F','1986-11-22'),
202
+ (10202,'1956-01-05','Greger','Lichtner','M','1991-10-06'),
203
+ (10203,'1955-07-27','Steen','Escriba','M','1989-04-06'),
204
+ (10204,'1956-12-09','Nevio','Ritcey','F','1986-12-04'),
205
+ (10205,'1953-05-20','Mabhin','Leijenhorst','F','1993-08-23'),
206
+ (10206,'1960-09-19','Alassane','Iwayama','F','1988-04-19'),
207
+ (10207,'1955-05-28','Girolamo','Anandan','F','1992-10-11'),
208
+ (10208,'1960-01-02','Xiping','Klerer','M','1991-12-23'),
209
+ (10209,'1956-12-12','Yolla','Ellozy','F','1991-11-23'),
210
+ (10210,'1958-01-24','Yuping','Alpin','M','1994-05-10'),
211
+ (10211,'1964-08-05','Vishu','Strehl','F','1989-11-18'),
212
+ (10212,'1959-05-09','Divier','Esteva','M','1990-07-11'),
213
+ (10213,'1964-05-24','Jackson','Kakkad','M','1992-11-06'),
214
+ (10214,'1962-04-14','Tadahiko','Ciolek','M','1988-02-29'),
215
+ (10215,'1954-04-02','Xiaobin','Duclos','M','1987-10-19'),
216
+ (10216,'1958-07-16','Amstein','Ghemri','M','1987-10-30'),
217
+ (10217,'1954-07-07','Yongmin','Roison','F','1986-05-12'),
218
+ (10218,'1958-12-07','Zhenhua','Magalhaes','M','1997-01-15'),
219
+ (10219,'1952-05-02','Genta','Kolvik','M','1993-03-31'),
220
+ (10220,'1958-05-25','Kish','Fasbender','F','1992-06-25'),
221
+ (10221,'1957-01-03','Yucai','Granlund','M','1988-06-08'),
222
+ (10222,'1962-09-21','Tze','Nourani','M','1986-06-08'),
223
+ (10223,'1963-09-17','Carrsten','Schmiedel','F','1985-11-18'),
224
+ (10224,'1954-05-17','Leon','Trogemann','M','1988-01-09'),
225
+ (10225,'1957-02-13','Kellie','Chinen','F','1986-06-19'),
226
+ (10226,'1964-12-28','Xinglin','Plessier','M','1989-10-27'),
227
+ (10227,'1957-07-04','Anneli','Kaiser','M','1994-04-24'),
228
+ (10228,'1953-04-21','Karoline','Cesareni','F','1991-08-26'),
229
+ (10229,'1952-02-10','Ulises','Takanami','M','1987-11-22'),
230
+ (10230,'1955-09-11','Clyde','Vernadat','M','1996-06-16'),
231
+ (10231,'1963-07-21','Shaowen','Desikan','F','1996-04-13'),
232
+ (10232,'1956-03-11','Marko','Auria','F','1992-06-04'),
233
+ (10233,'1954-04-01','Lein','Vendrig','F','1985-07-05'),
234
+ (10234,'1961-01-18','Arunachalam','Bakhtari','M','1990-11-19'),
235
+ (10235,'1958-03-27','Susanta','Roccetti','F','1995-04-06'),
236
+ (10236,'1960-03-26','Susumu','Bade','F','1996-08-30'),
237
+ (10237,'1952-09-22','Yannis','Mandell','F','1989-08-11'),
238
+ (10238,'1964-11-02','Mototsugu','Gire','F','1986-11-19'),
239
+ (10239,'1955-03-31','Nikolaos','Llado','F','1995-05-08'),
240
+ (10240,'1952-04-01','Remko','Maccarone','M','1998-10-06'),
241
+ (10241,'1958-07-01','Ortrud','Murillo','M','1988-06-12'),
242
+ (10242,'1964-02-22','Lunjin','Ozeri','M','1988-01-18'),
243
+ (10243,'1960-12-22','Wonhee','Pouyioutas','M','1985-11-24'),
244
+ (10244,'1961-10-24','Foong','Flasterstein','M','1985-12-23'),
245
+ (10245,'1962-08-23','Ramalingam','Gente','F','1985-04-26'),
246
+ (10246,'1962-06-23','Basem','Teitelbaum','M','1987-07-12'),
247
+ (10247,'1964-06-30','Heon','Riefers','F','1992-08-14'),
248
+ (10248,'1955-09-24','Frederique','Tempesti','F','1991-08-13'),
249
+ (10249,'1954-06-10','Marie','Boreale','M','1991-12-08'),
250
+ (10250,'1958-08-12','Serap','Etalle','M','1992-08-30'),
251
+ (10251,'1957-04-25','Alair','Rosenbaum','M','1992-06-25'),
252
+ (10252,'1961-01-30','Shirish','Wegerle','F','1990-11-08'),
253
+ (10253,'1964-11-12','Zsolt','Salinas','F','1985-02-21'),
254
+ (10254,'1959-12-07','Shen','Brattka','M','1990-06-14'),
255
+ (10255,'1964-02-08','Roddy','Garnick','M','1993-05-12'),
256
+ (10256,'1960-12-02','Irene','Radhakrishnan','M','1985-10-12'),
257
+ (10257,'1957-09-12','Aiman','Riexinger','M','1986-08-05'),
258
+ (10258,'1955-12-12','Basil','Ishibashi','F','1985-05-17'),
259
+ (10259,'1964-11-24','Susanna','Vesel','M','1986-06-25'),
260
+ (10260,'1961-07-14','Alper','Suomi','F','1991-04-13'),
261
+ (10261,'1959-12-25','Mang','Erie','M','1993-10-20'),
262
+ (10262,'1955-08-04','Mahendra','Maraist','F','1992-07-27'),
263
+ (10263,'1961-02-08','Takahiro','Waterhouse','M','1994-02-05'),
264
+ (10264,'1958-09-08','Nalini','Kawashimo','F','1997-07-16'),
265
+ (10265,'1960-12-01','Ramalingam','Muniz','M','1989-07-13'),
266
+ (10266,'1958-02-24','Sukumar','Rassart','M','1990-05-25'),
267
+ (10267,'1956-01-16','Shaunak','Cullers','M','1996-12-11'),
268
+ (10268,'1958-06-03','Nishit','Siochi','M','1986-12-17'),
269
+ (10269,'1959-10-07','Taizo','Oxman','F','1988-07-24'),
270
+ (10270,'1963-01-30','Bedir','Hartvigsen','F','1990-04-26'),
271
+ (10271,'1962-04-24','Sham','Eastman','M','1986-05-23'),
272
+ (10272,'1954-11-30','Yishai','Cannane','M','1988-05-23'),
273
+ (10273,'1962-08-29','Baocai','Lieblein','M','1985-11-06'),
274
+ (10274,'1957-08-23','Dmitri','Pearson','F','1991-04-21'),
275
+ (10275,'1961-10-22','Marek','Luck','F','1987-09-08'),
276
+ (10276,'1964-07-27','Xuejun','Hempstead','M','1985-07-21'),
277
+ (10277,'1964-08-15','Isaac','Schwartzbauer','M','1985-06-16'),
278
+ (10278,'1955-03-09','Lubomir','Nitsch','M','1991-05-17'),
279
+ (10279,'1964-08-20','Barton','Jumpertz','F','1994-12-20'),
280
+ (10280,'1964-10-29','Stabislas','Delgrange','M','1988-03-18'),
281
+ (10281,'1953-05-13','Moty','Kusakari','M','1994-12-03'),
282
+ (10282,'1953-11-27','Hercules','Benzmuller','M','1986-06-04'),
283
+ (10283,'1953-07-08','Kauko','Birjandi','M','1988-05-25'),
284
+ (10284,'1954-04-08','Masali','Murrill','F','1997-07-02'),
285
+ (10285,'1956-09-21','Zhonghui','Preusig','F','1995-02-27'),
286
+ (10286,'1952-05-14','Saddek','Gopalakrishnan','F','1988-03-21'),
287
+ (10287,'1963-11-28','Marie','Pietracaprina','M','1992-12-28'),
288
+ (10288,'1959-06-02','Selwyn','Perri','M','1994-08-29'),
289
+ (10289,'1956-11-30','Shay','Poulakidas','M','1990-06-06'),
290
+ (10290,'1957-05-29','Yongmao','Pleszkun','M','1991-09-18'),
291
+ (10291,'1965-01-23','Dipayan','Seghrouchni','M','1986-09-29'),
292
+ (10292,'1963-01-27','Yucel','Ghelli','F','1989-06-05'),
293
+ (10293,'1956-11-24','Mihalis','Avouris','F','1992-12-12'),
294
+ (10294,'1955-01-05','Rutger','Miara','M','1996-04-08'),
295
+ (10295,'1953-01-13','Kristine','Velardi','M','1990-08-27'),
296
+ (10296,'1964-05-13','Petter','Lorho','M','1989-09-16'),
297
+ (10297,'1956-06-17','Narain','Oaver','F','1986-05-28'),
298
+ (10298,'1954-07-06','Dietrich','DuCasse','F','1999-03-30'),
299
+ (10299,'1960-06-21','Ipke','Stentiford','F','1990-01-10'),
300
+ (10300,'1960-07-12','Tadahiko','Ulupinar','F','1991-05-17'),
301
+ (10301,'1962-08-26','Lucien','Staudhammer','M','1988-05-23'),
302
+ (10302,'1954-10-11','Faiza','Baer','F','1986-07-22'),
303
+ (10303,'1961-09-11','Marlo','Zschoche','M','1990-02-05'),
304
+ (10304,'1956-03-07','Bernt','Erie','M','1992-11-16'),
305
+ (10305,'1952-06-30','Hirochika','Piancastelli','M','1988-10-31'),
306
+ (10306,'1953-06-02','Heng','Kilgour','M','1993-09-06'),
307
+ (10307,'1955-07-20','Nikolaos','Leaver','M','1991-04-10'),
308
+ (10308,'1961-03-14','Dzung','Holburn','F','1992-12-29'),
309
+ (10309,'1964-11-06','Prodip','Schusler','F','1985-06-20'),
310
+ (10310,'1964-08-29','Aksel','Alencar','M','1990-10-24'),
311
+ (10311,'1958-11-24','Hsiangchu','Molenkamp','F','1991-04-01'),
312
+ (10312,'1957-06-18','Rasiah','Deyuan','F','1986-08-28'),
313
+ (10313,'1962-05-30','Subbu','Riexinger','M','1994-10-10'),
314
+ (10314,'1961-05-04','Christfried','Apsitis','M','1986-01-16'),
315
+ (10315,'1956-08-03','Maris','Angelopoulos','M','1987-08-28'),
316
+ (10316,'1958-06-20','Christoper','Schwaller','M','1987-09-04'),
317
+ (10317,'1957-12-25','Arie','Birge','M','1986-12-10'),
318
+ (10318,'1958-08-27','Mototsugu','Beilner','F','1985-06-29'),
319
+ (10319,'1963-03-09','Mechthild','Miyakawa','M','1985-08-15'),
320
+ (10320,'1956-06-22','Uinam','Stasinski','F','1988-11-03'),
321
+ (10321,'1955-12-12','Guenter','Ravishankar','M','1991-09-24'),
322
+ (10322,'1954-05-28','Isamu','Dahlbom','F','1990-01-29'),
323
+ (10323,'1958-06-20','Kankanahalli','Hinsberger','M','1991-06-06'),
324
+ (10324,'1957-12-29','Bernardo','Rouquie','F','1988-03-19'),
325
+ (10325,'1953-01-12','Arunachalam','Badr','M','1990-09-20'),
326
+ (10326,'1953-02-13','Masali','Czap','F','1985-05-13'),
327
+ (10327,'1954-04-01','Roded','Facello','M','1987-09-18'),
328
+ (10328,'1955-06-28','Serenella','Kawashima','M','1994-01-16'),
329
+ (10329,'1958-04-28','Remko','Shigei','F','1986-01-20'),
330
+ (10330,'1957-02-02','Kasturi','Bellmore','M','1985-06-12'),
331
+ (10331,'1961-08-12','Arto','Binkley','M','1985-04-06'),
332
+ (10332,'1961-11-05','Masanao','Bain','F','1988-06-08'),
333
+ (10333,'1953-04-27','Snehasis','Dymetman','M','1993-01-16'),
334
+ (10334,'1958-04-02','Falguni','Erie','M','1996-12-28'),
335
+ (10335,'1963-03-13','Toshimori','Bahi','F','1992-04-06'),
336
+ (10336,'1961-07-16','Goa','Rothe','F','1992-01-07'),
337
+ (10337,'1957-12-10','Jeong','Sadowsky','M','1995-08-06'),
338
+ (10338,'1961-02-12','Heon','Ranai','M','1988-09-01'),
339
+ (10339,'1957-08-27','Teunis','Liedekerke','M','1989-11-30'),
340
+ (10340,'1952-08-20','Djelloul','Laventhal','M','1987-06-05'),
341
+ (10341,'1960-11-22','Wilmer','Greenaway','F','1987-04-29'),
342
+ (10342,'1960-03-17','Stella','Hiroyama','F','1987-07-25'),
343
+ (10343,'1954-11-01','Dinah','Syrzycki','M','1993-10-14'),
344
+ (10344,'1957-07-24','Uwe','Garnier','F','1994-06-25'),
345
+ (10345,'1960-12-13','Arra','Ratnakar','M','1993-11-08'),
346
+ (10346,'1963-01-29','Aamod','Radwan','M','1987-01-27'),
347
+ (10347,'1953-10-03','Pradeep','Kaminger','M','1985-12-12'),
348
+ (10348,'1956-03-11','Mahendra','Picco','F','1995-10-22'),
349
+ (10349,'1954-04-29','Oksana','Brodie','F','1991-09-28'),
350
+ (10350,'1954-11-14','Kristen','Kavvadias','F','1990-08-19'),
351
+ (10351,'1963-08-23','Tadahiko','Strehl','F','1985-03-07'),
352
+ (10352,'1960-01-28','Erzsebet','Ohori','M','1996-01-21'),
353
+ (10353,'1953-01-15','Phule','Hammerschmidt','M','1989-08-24'),
354
+ (10354,'1961-04-21','Moto','Kusakari','M','1996-03-26'),
355
+ (10355,'1952-12-10','Satyanarayana','Cochrane','M','1987-11-15'),
356
+ (10356,'1952-08-12','Vasilis','Standera','M','1988-08-06'),
357
+ (10357,'1964-01-10','Hausi','Sidhu','M','1994-04-04'),
358
+ (10358,'1953-04-08','Qunsheng','Tagansky','M','1991-02-19'),
359
+ (10359,'1960-04-18','Heekeun','Sambasivam','F','1991-05-09'),
360
+ (10360,'1960-11-04','Irene','Munck','M','1996-09-04'),
361
+ (10361,'1961-04-22','Seshu','Sidou','F','1986-10-23'),
362
+ (10362,'1963-09-16','Shalesh','dAstous','M','1988-08-24'),
363
+ (10363,'1953-11-28','Toshiki','Muniz','F','1985-09-11'),
364
+ (10364,'1954-09-21','Nakhoon','Dengi','M','1985-11-14'),
365
+ (10365,'1958-04-28','Rosine','Granlund','F','1987-06-02'),
366
+ (10366,'1960-01-25','Morrie','Piazza','M','1994-04-11'),
367
+ (10367,'1955-12-24','Hyuckchul','Gini','M','1991-06-24'),
368
+ (10368,'1956-03-25','Hatim','Koshiba','M','1991-04-05'),
369
+ (10369,'1957-01-08','Qunsheng','Toyoshima','M','1986-05-17'),
370
+ (10370,'1957-08-03','Clyde','Fandrianto','M','1992-04-04'),
371
+ (10371,'1959-02-10','Ioana','Kirkerud','M','1989-11-28'),
372
+ (10372,'1952-04-08','Anneli','Frijda','F','1985-07-30'),
373
+ (10373,'1959-01-08','Hongzue','Heijenga','M','1997-04-26'),
374
+ (10374,'1955-10-08','Willard','Rosin','F','1993-12-08'),
375
+ (10375,'1957-10-09','Dante','Kalafatis','F','1994-05-29'),
376
+ (10376,'1959-02-12','Fai','Bale','M','1989-01-14'),
377
+ (10377,'1954-08-19','Marl','Grospietsch','M','1990-05-07'),
378
+ (10378,'1964-09-05','Takahira','Lichtner','M','1990-12-30'),
379
+ (10379,'1957-03-02','Mikhail','Rosis','M','1996-07-15'),
380
+ (10380,'1956-05-25','Alejandro','Kamble','F','1985-03-19'),
381
+ (10381,'1963-03-04','Jiong','Parfitt','M','1991-12-04'),
382
+ (10382,'1955-06-12','Shirish','Dredge','M','1990-07-04'),
383
+ (10383,'1963-11-13','Leucio','Aumann','M','1991-06-19'),
384
+ (10384,'1956-08-22','Feiyu','Luft','M','1986-01-16'),
385
+ (10385,'1963-05-14','Khatoun','Imataki','M','1992-12-20'),
386
+ (10386,'1956-11-09','Eishiro','Miyakawa','F','1985-08-02'),
387
+ (10387,'1952-11-03','Parto','Wrigley','F','1987-02-19'),
388
+ (10388,'1953-03-29','Hironoby','Kaiser','M','1996-03-24'),
389
+ (10389,'1953-03-24','Make','Peir','M','1995-10-31'),
390
+ (10390,'1960-03-07','Wanqing','Bratten','M','1989-05-17'),
391
+ (10391,'1956-06-13','Hongzue','Akaboshi','M','1989-12-24'),
392
+ (10392,'1962-02-17','Jiann','Hainaut','M','1992-03-01'),
393
+ (10393,'1958-03-24','Yagil','DasSarma','M','1989-06-23'),
394
+ (10394,'1957-05-22','Shawna','Meriste','M','1991-03-14'),
395
+ (10395,'1952-02-17','Takahiro','Deverell','M','1987-02-04'),
396
+ (10396,'1955-08-21','Sibyl','Rahier','M','1986-01-11'),
397
+ (10397,'1955-11-11','Irena','Reutenauer','M','1993-05-21'),
398
+ (10398,'1958-07-16','Shooichi','Escriba','F','1990-10-12'),
399
+ (10399,'1957-06-13','Guenter','Marchegay','F','1985-05-07'),
400
+ (10400,'1961-12-16','Ortrud','Nitto','M','1993-10-17'),
401
+ (10401,'1962-04-25','Eckart','Barriga','M','1991-04-05'),
402
+ (10402,'1953-07-23','Volkmar','Ebeling','M','1987-01-02'),
403
+ (10403,'1956-04-01','Atreyi','Mungall','F','1991-09-13'),
404
+ (10404,'1955-04-27','Prodip','Rosti','F','1988-08-28'),
405
+ (10405,'1957-01-20','Hilary','Budinsky','F','1985-11-04'),
406
+ (10406,'1956-09-21','Sigeru','Wynblatt','F','1987-03-11'),
407
+ (10407,'1955-07-05','Ulf','Siepmann','M','1990-03-08'),
408
+ (10408,'1964-03-17','Martijn','Kaiser','M','1998-10-07'),
409
+ (10409,'1958-08-28','Mario','Straney','M','1997-07-09'),
410
+ (10410,'1965-01-19','Takahito','Gecsei','F','1993-10-16'),
411
+ (10411,'1956-07-10','Lidong','Klerer','F','1989-09-02'),
412
+ (10412,'1958-02-26','Masoud','Fabrizio','F','1986-05-06'),
413
+ (10413,'1952-05-05','Danel','Impagliazzo','F','1990-03-26'),
414
+ (10414,'1954-04-09','Yinlin','Alpin','M','1990-05-30'),
415
+ (10415,'1957-11-12','Mark','Coorg','M','1993-10-25'),
416
+ (10416,'1956-05-26','Uli','Keustermans','M','1989-03-24'),
417
+ (10417,'1964-02-02','Bingning','Bakhtari','M','1992-03-12'),
418
+ (10418,'1952-06-29','Candida','Porotnikoff','F','1989-04-20'),
419
+ (10419,'1964-06-22','Maria','Bauknecht','F','1992-04-25'),
420
+ (10420,'1963-03-03','Kaijung','Riesenhuber','M','1988-01-17'),
421
+ (10421,'1959-03-22','Divine','Marzano','M','1989-09-12'),
422
+ (10422,'1954-06-02','Greger','Rubsam','F','1990-12-07'),
423
+ (10423,'1956-01-10','Dante','Cronin','F','1998-09-06'),
424
+ (10424,'1959-08-17','Babette','Straney','M','1989-08-07'),
425
+ (10425,'1963-10-24','Sashi','Osgood','M','1991-10-29'),
426
+ (10426,'1955-12-28','Arunas','Luce','F','1985-07-06'),
427
+ (10427,'1958-08-13','Khosrow','Sudbeck','F','1991-11-01'),
428
+ (10428,'1957-06-25','Cathie','Brlek','M','1992-06-04'),
429
+ (10429,'1952-02-13','Martien','Improta','F','1986-03-09'),
430
+ (10430,'1958-06-30','Ferdinand','Chenney','M','1990-11-16'),
431
+ (10431,'1961-05-25','Patricio','Bugrara','M','1987-10-08'),
432
+ (10432,'1953-11-06','Hisao','Tiemann','F','1985-04-30'),
433
+ (10433,'1954-09-02','Reuven','Dengi','M','1989-02-14'),
434
+ (10434,'1959-07-17','Dzung','Peltason','F','1995-06-27'),
435
+ (10435,'1957-10-12','Marsha','Tagansky','M','1986-12-19'),
436
+ (10436,'1963-06-17','Yahiko','Lammel','M','1988-01-30'),
437
+ (10437,'1956-07-07','Narain','Reeker','F','1996-04-12'),
438
+ (10438,'1961-12-25','Evgueni','Srimani','F','1990-01-19'),
439
+ (10439,'1958-04-09','Jolita','Jarecki','M','1990-01-11'),
440
+ (10440,'1959-04-10','Akeel','Narahara','F','1994-03-31'),
441
+ (10441,'1958-04-27','Adel','Perfilyeva','M','1988-07-12'),
442
+ (10442,'1955-09-09','Volkmar','Unno','M','1988-03-13'),
443
+ (10443,'1952-12-03','Shichao','Litvinov','F','1989-08-01'),
444
+ (10444,'1956-07-29','Kazuhira','Rosis','M','1993-03-31'),
445
+ (10445,'1957-01-10','Junichi','Kavanagh','F','1987-11-04'),
446
+ (10446,'1960-02-08','Ebru','Chepyzhov','F','1994-11-17'),
447
+ (10447,'1962-10-24','Ronghao','Yavatkar','F','1988-12-29'),
448
+ (10448,'1963-12-10','Phule','Oxenboll','F','1992-03-12'),
449
+ (10449,'1959-09-28','Aleksandar','Sudkamp','M','1987-03-28'),
450
+ (10450,'1959-11-05','Khun','Harbusch','M','1990-01-17'),
451
+ (10451,'1952-10-06','Bodh','Ranta','F','1988-03-12'),
452
+ (10452,'1956-11-24','Werner','Hasham','M','1988-09-05'),
453
+ (10453,'1953-07-19','Tsvetan','Matzel','F','1985-04-02'),
454
+ (10454,'1961-01-22','Wonhee','Badr','M','1987-04-10'),
455
+ (10455,'1963-12-17','Sverrir','Streng','F','1989-02-14'),
456
+ (10456,'1963-01-24','Stepehn','Hardjono','F','1995-12-25'),
457
+ (10457,'1963-11-10','Oddvar','Schlenzig','M','1991-11-23'),
458
+ (10458,'1961-01-06','Gina','Engelmann','F','1988-07-23'),
459
+ (10459,'1959-09-30','Ennio','Trogemann','M','1997-06-28'),
460
+ (10460,'1963-02-19','Shushma','VanScheik','M','1994-07-01'),
461
+ (10461,'1956-10-26','Gal','Karcich','M','1987-08-03'),
462
+ (10462,'1956-04-08','Sumali','Schlenzig','M','1996-03-25'),
463
+ (10463,'1954-05-20','Ung','Zaiane','M','1987-12-25'),
464
+ (10464,'1962-09-04','Mang','Maginnis','F','1989-10-09'),
465
+ (10465,'1963-03-13','Claudi','Shackel','M','1987-09-01'),
466
+ (10466,'1954-12-25','Jiakeng','Himler','M','1985-09-29'),
467
+ (10467,'1956-01-30','Dipayan','Suomi','F','1988-07-14'),
468
+ (10468,'1960-08-28','Yoshimitsu','Shobatake','M','1991-05-28'),
469
+ (10469,'1964-12-22','Munehiko','Ananiadou','M','1985-06-05'),
470
+ (10470,'1956-04-12','Peternela','Iwayama','M','1988-06-01'),
471
+ (10471,'1963-11-30','Jouko','Yamaashi','M','1990-11-18'),
472
+ (10472,'1959-08-20','Salvador','Lodder','M','1996-07-29'),
473
+ (10473,'1963-10-13','Przemyslawa','Oskamp','M','1987-10-30'),
474
+ (10474,'1962-02-24','Kenton','Garnham','F','1985-09-28'),
475
+ (10475,'1956-12-19','Mario','Rodite','M','1987-01-19'),
476
+ (10476,'1965-01-01','Kokou','Iisaka','M','1987-09-20'),
477
+ (10477,'1952-12-07','Guoxiang','Trogemann','F','1989-03-04'),
478
+ (10478,'1957-03-08','Maik','Ushiama','M','1992-06-09'),
479
+ (10479,'1959-01-27','Duro','Coney','F','1987-02-28'),
480
+ (10480,'1965-01-25','Make','Baba','F','1988-05-18'),
481
+ (10481,'1959-10-18','Yongmao','Pintelas','F','1988-10-06'),
482
+ (10482,'1961-07-17','Goa','Pleszkun','F','1991-07-20'),
483
+ (10483,'1957-03-13','Zhiwei','Anick','M','1992-11-08'),
484
+ (10484,'1961-08-30','Nirmal','Varley','F','1995-10-31'),
485
+ (10485,'1961-09-20','Teruyuki','Sundgren','M','1985-10-27'),
486
+ (10486,'1952-08-24','Amstein','Kossowski','F','1987-10-08'),
487
+ (10487,'1956-08-23','Perla','Middleton','F','1992-08-14'),
488
+ (10488,'1959-10-17','Mihalis','Heering','M','1994-06-09'),
489
+ (10489,'1958-08-24','Elvia','Homond','M','1989-09-10'),
490
+ (10490,'1961-09-28','Huiqun','Vuskovic','F','1992-10-07'),
491
+ (10491,'1964-09-09','Garnik','Narahari','M','1990-01-17'),
492
+ (10492,'1957-04-03','Lobel','Kumaresan','M','1988-04-24'),
493
+ (10493,'1962-01-12','Maris','Haraldson','M','1992-05-16'),
494
+ (10494,'1953-12-21','Yakkov','Servieres','F','1986-01-18'),
495
+ (10495,'1961-05-24','Anyuan','Zhiwei','F','1985-09-29'),
496
+ (10496,'1959-04-18','Gretta','Baig','M','1987-02-26'),
497
+ (10497,'1953-06-09','Pramod','Rabehasaina','M','1992-01-22'),
498
+ (10498,'1964-09-15','Valter','Cappelletti','F','1988-02-01'),
499
+ (10499,'1953-10-04','Maik','Luft','F','1989-11-23'),
500
+ (10500,'1957-04-29','Vojin','Narwekar','M','1996-12-16'),
501
+ (10501,'1962-09-09','Susuma','Larfeldt','M','1987-04-20'),
502
+ (10502,'1957-10-07','Yonghoan','Marshall','M','1993-03-04'),
503
+ (10503,'1952-05-17','Dannz','Pell','M','1991-04-30'),
504
+ (10504,'1953-04-07','Xiong','Varker','M','1988-12-03'),
505
+ (10505,'1964-02-04','Isamu','Auria','M','1985-07-23'),
506
+ (10506,'1958-10-06','Kazuhisa','Kroll','F','1996-12-01'),
507
+ (10507,'1964-02-18','Kasidit','Belinskaya','M','1985-04-26'),
508
+ (10508,'1962-06-02','Kotesh','Liedekerke','M','1991-05-01'),
509
+ (10509,'1953-10-03','Abdelwaheb','Riesenhuber','F','1990-02-23'),
510
+ (10510,'1960-02-13','Keung','Slobodova','F','1990-04-20'),
511
+ (10511,'1963-06-18','Khoa','Marrevee','M','1992-01-27'),
512
+ (10512,'1955-11-16','Udi','Gihr','M','1986-01-12'),
513
+ (10513,'1959-07-07','Yuichiro','Schicker','F','1991-04-02'),
514
+ (10514,'1963-04-03','Tomofumi','McClure','M','1992-04-29'),
515
+ (10515,'1963-12-15','Raimond','Kirkerud','M','1989-10-28'),
516
+ (10516,'1960-02-20','Xiadong','Luga','M','1985-10-19'),
517
+ (10517,'1953-06-18','Tiina','Speek','M','1990-12-25'),
518
+ (10518,'1963-05-23','Marin','Lanphier','M','1993-09-03'),
519
+ (10519,'1955-12-28','Yonghoan','Alencar','F','1986-03-22'),
520
+ (10520,'1964-03-06','Jenwei','Ecklund','M','1994-03-27'),
521
+ (10521,'1957-07-31','Kwangsub','Setia','M','1989-05-11'),
522
+ (10522,'1955-07-24','Marke','Cesareni','F','1986-12-12'),
523
+ (10523,'1956-05-16','Malu','Skafidas','M','1988-12-28'),
524
+ (10524,'1959-05-02','Shigehiro','Cincotta','F','1985-10-09'),
525
+ (10525,'1963-03-29','Yuchang','Lunt','M','1990-07-08'),
526
+ (10526,'1963-12-31','Kwangho','Theuretzbacher','F','1988-02-27'),
527
+ (10527,'1964-09-15','Tetsushi','Barvinok','F','1996-01-25'),
528
+ (10528,'1963-05-16','Koichi','Lakshmanan','F','1991-12-29'),
529
+ (10529,'1952-11-21','Ymte','Yetto','M','1992-01-05'),
530
+ (10530,'1956-07-19','Boriana','Coors','F','1987-09-23'),
531
+ (10531,'1954-06-11','Oguz','Gimbel','F','1991-02-20'),
532
+ (10532,'1959-08-31','Mary','Wossner','F','1986-05-18'),
533
+ (10533,'1963-06-25','Mohamadou','Smailagic','F','1986-10-31'),
534
+ (10534,'1964-10-23','Dinah','Bahl','M','1989-01-15'),
535
+ (10535,'1961-05-19','Shalesh','Stroustrup','F','1985-02-21'),
536
+ (10536,'1964-10-29','Yechiam','Sambasivam','F','1988-03-25'),
537
+ (10537,'1962-06-29','Stella','Benzmuller','M','1996-09-25'),
538
+ (10538,'1955-08-18','Przemyslawa','Falby','M','1987-07-23'),
539
+ (10539,'1959-05-13','Yucel','Reinhard','M','1990-06-05'),
540
+ (10540,'1961-02-24','Martins','Barriga','M','1994-05-03'),
541
+ (10541,'1955-11-05','Godehard','Eiter','M','1986-02-28'),
542
+ (10542,'1955-01-05','Yannis','Couchot','F','1989-03-28'),
543
+ (10543,'1962-10-06','Lein','Lichtman','M','1998-10-16'),
544
+ (10544,'1962-02-01','Ishfaq','Krzyzanowski','F','1995-04-29'),
545
+ (10545,'1963-01-12','Hauke','dAstous','M','1990-06-30'),
546
+ (10546,'1957-12-20','Nechama','Schapiro','M','1987-09-06'),
547
+ (10547,'1963-05-12','Snehasis','Brobst','M','1988-02-14'),
548
+ (10548,'1952-06-12','Ramalingam','Gunderson','M','1986-05-04'),
549
+ (10549,'1957-03-20','Beshir','Kisuki','M','1995-10-26'),
550
+ (10550,'1959-08-03','Manton','Leuchs','M','1985-02-03'),
551
+ (10551,'1963-10-07','Jeong','Rijsenbrij','M','1988-08-06'),
552
+ (10552,'1953-03-25','Kazuhito','Shiratori','M','1998-08-18'),
553
+ (10553,'1964-02-08','Rajmohan','Wallrath','F','1985-10-27'),
554
+ (10554,'1958-08-01','Dines','Gerlach','M','1990-11-28'),
555
+ (10555,'1962-09-25','Vitaly','Picci','M','1989-11-06'),
556
+ (10556,'1962-12-31','JoAnna','Taubman','F','1992-04-15'),
557
+ (10557,'1957-08-23','Sashi','Karlin','M','1986-03-31'),
558
+ (10558,'1964-10-08','Hisao','Famili','M','1990-04-06'),
559
+ (10559,'1956-01-18','Arumugam','Comellas','F','1988-01-06'),
560
+ (10560,'1960-05-01','Yinlin','Esteva','F','1988-09-28'),
561
+ (10561,'1958-09-07','Serge','Joslin','F','1990-12-15'),
562
+ (10562,'1963-04-17','Shuky','Pearson','M','1996-07-06'),
563
+ (10563,'1956-10-27','Mohit','Spelt','M','1992-09-29'),
564
+ (10564,'1955-04-14','Jianhao','Thisen','M','1986-05-08'),
565
+ (10565,'1961-11-05','Yishay','Harnett','M','1992-01-09'),
566
+ (10566,'1958-01-30','Jianhui','Zuberek','F','1988-03-19'),
567
+ (10567,'1957-05-21','Dietrich','Journel','M','1992-10-18'),
568
+ (10568,'1953-12-02','Gao','Poulakidas','F','1989-02-14'),
569
+ (10569,'1962-12-03','Sreenivas','Bashian','M','1987-03-13'),
570
+ (10570,'1958-10-30','Alassane','Morrin','M','1985-05-05'),
571
+ (10571,'1963-12-10','Fun','Varman','M','1985-02-24'),
572
+ (10572,'1960-10-10','Cordelia','Axelband','M','1988-02-16'),
573
+ (10573,'1964-02-23','Tetsushi','Speel','F','1993-07-07'),
574
+ (10574,'1960-11-11','Salvador','Olano','F','1990-02-16'),
575
+ (10575,'1954-06-29','Theirry','Yeung','M','1988-10-04'),
576
+ (10576,'1957-08-23','Xiaoqiu','Krychniak','M','1988-05-17'),
577
+ (10577,'1957-09-20','Ennio','Schmiedel','M','1990-08-18'),
578
+ (10578,'1958-07-18','Shigeaki','Shanbhogue','F','1989-11-24'),
579
+ (10579,'1958-07-17','Aiman','Stentiford','M','1985-09-01'),
580
+ (10580,'1956-05-28','Christoper','Rehfuss','M','1987-09-11'),
581
+ (10581,'1956-11-20','Odinaldo','Prochazka','F','1988-02-09'),
582
+ (10582,'1960-05-08','Shmuel','Juneja','M','1986-06-22'),
583
+ (10583,'1964-03-03','Prasadram','Stille','F','1985-02-14'),
584
+ (10584,'1961-07-12','Mana','Papastamatiou','M','1986-02-17'),
585
+ (10585,'1963-11-10','Sajjad','Willoner','F','1986-01-05'),
586
+ (10586,'1954-06-23','Kirk','Vuskovic','M','1992-02-04'),
587
+ (10587,'1962-03-04','Behnaam','Srimani','F','1989-09-20'),
588
+ (10588,'1956-07-30','Shigeo','Dulay','F','1987-01-28'),
589
+ (10589,'1958-09-25','Subbu','Sanella','M','1994-01-26'),
590
+ (10590,'1963-10-01','Yongqiao','Kalloufi','M','1986-04-09'),
591
+ (10591,'1952-12-22','Hidde','Hettesheimer','F','1987-06-18'),
592
+ (10592,'1964-08-01','Almudena','Alvarado','M','1990-06-05'),
593
+ (10593,'1952-07-24','Falguni','Kenevan','M','1990-09-12'),
594
+ (10594,'1960-10-22','Kiyokazu','Whitcomb','M','1988-04-02'),
595
+ (10595,'1964-12-10','Giri','Undy','M','1989-11-24'),
596
+ (10596,'1954-01-24','Sanjit','Coors','M','1995-04-01'),
597
+ (10597,'1961-05-07','Lucien','Schaad','F','1990-04-01'),
598
+ (10598,'1957-11-10','Margo','Gronowski','M','1989-03-31'),
599
+ (10599,'1956-10-15','Seshu','Crelier','F','1989-03-17'),
600
+ (10600,'1963-08-17','Emran','Rettelbach','F','1985-12-22'),
601
+ (10601,'1959-10-23','Barton','Usdin','M','1994-08-29'),
602
+ (10602,'1959-11-27','Douadi','Wossner','M','1988-03-12'),
603
+ (10603,'1955-08-02','Wayne','Restivo','M','1995-07-20'),
604
+ (10604,'1957-04-24','Susanna','Brizzi','M','1990-04-07'),
605
+ (10605,'1956-05-21','Moti','Wixon','F','1985-04-29'),
606
+ (10606,'1964-03-04','Toshiki','Marakhovsky','M','1987-05-02'),
607
+ (10607,'1964-11-30','Rosalyn','Hambrick','F','1990-06-18'),
608
+ (10608,'1955-07-11','Adhemar','Talmor','F','1986-05-25'),
609
+ (10609,'1956-10-02','Janche','Zhang','M','1994-12-03'),
610
+ (10610,'1955-06-24','Irena','Roccetti','F','1996-04-11'),
611
+ (10611,'1964-05-11','Karsten','Blokdijk','M','1989-09-16'),
612
+ (10612,'1959-01-01','Gil','Peroz','M','1991-09-02'),
613
+ (10613,'1960-11-04','Inderjeet','Jansen','M','1990-09-01'),
614
+ (10614,'1953-07-11','Gila','Ozeri','F','1990-03-03'),
615
+ (10615,'1955-08-30','Keung','Delgrande','M','1996-03-10'),
616
+ (10616,'1958-05-05','Tommaso','Marwedel','F','1988-03-10'),
617
+ (10617,'1955-01-26','Hidekazu','Angel','F','1985-03-29'),
618
+ (10618,'1963-08-03','Ranga','Yeung','F','1988-11-27'),
619
+ (10619,'1961-04-27','Vivian','Kusakabe','M','1989-03-24'),
620
+ (10620,'1959-11-23','Marit','Veeraraghavan','M','1990-11-10'),
621
+ (10621,'1962-02-03','Hinrich','Siepmann','F','1991-06-23'),
622
+ (10622,'1959-09-15','Turgut','Narlikar','M','1989-01-28'),
623
+ (10623,'1953-07-11','Aleksander','Danlos','F','1987-03-07'),
624
+ (10624,'1955-12-19','Sham','Gyorkos','F','1990-05-07'),
625
+ (10625,'1958-02-08','Leszek','Petereit','F','1985-10-31'),
626
+ (10626,'1957-06-26','Danil','Deverell','M','1996-12-03'),
627
+ (10627,'1962-10-06','Shigeu','Itzfeldt','M','1991-11-07'),
628
+ (10628,'1954-04-18','Krisda','Krogh','M','1985-09-11'),
629
+ (10629,'1954-03-23','Lalit','Francisci','F','1986-01-30'),
630
+ (10630,'1954-08-10','Bezalel','Katzenelson','F','1993-06-26'),
631
+ (10631,'1955-05-17','Inderjeet','Chaudhuri','M','1988-02-16'),
632
+ (10632,'1960-04-05','Yoshimitsu','Velardi','F','1985-07-25'),
633
+ (10633,'1957-02-09','Sorina','Herber','M','1985-06-17'),
634
+ (10634,'1954-08-01','Nahid','Chepyzhov','M','1990-11-11'),
635
+ (10635,'1960-10-29','Toney','Angiulli','F','1991-09-22'),
636
+ (10636,'1955-08-25','Saeko','Porotnikoff','F','1994-11-16'),
637
+ (10637,'1954-07-11','Heejo','Frolund','M','1993-07-11'),
638
+ (10638,'1960-11-04','Jenwei','Borovoy','M','1991-05-19'),
639
+ (10639,'1953-04-18','Pramod','Erol','M','1992-10-25'),
640
+ (10640,'1958-11-09','Anneke','Meszaros','M','1992-12-04'),
641
+ (10641,'1953-12-24','Guozhong','Zucker','M','1993-03-21'),
642
+ (10642,'1955-12-19','Hirochika','Narlikar','M','1986-08-06'),
643
+ (10643,'1957-07-25','Slavian','Keirsey','M','1987-11-11'),
644
+ (10644,'1962-02-22','Pranas','Benaini','M','1985-05-29'),
645
+ (10645,'1957-03-01','Fumiyo','Esposito','M','1988-03-01'),
646
+ (10646,'1957-11-24','Uri','Chorvat','M','1988-08-07'),
647
+ (10647,'1960-01-12','Tesuro','Bahk','M','1995-09-28'),
648
+ (10648,'1962-01-19','Marlo','Ratnaker','F','1988-02-16'),
649
+ (10649,'1956-03-25','Vitali','Welham','M','1997-09-10'),
650
+ (10650,'1959-04-09','Hongzhu','Chepyzhov','M','1992-10-04'),
651
+ (10651,'1958-12-31','Zijian','Maginnis','M','1985-08-07'),
652
+ (10652,'1960-04-25','Danai','Chachaty','M','1990-02-12'),
653
+ (10653,'1953-06-16','Otmar','Feinberg','M','1987-04-30'),
654
+ (10654,'1960-03-17','Nahla','Castellani','F','1987-05-28'),
655
+ (10655,'1959-02-02','Remko','Dalton','F','1985-07-14'),
656
+ (10656,'1962-06-18','Sanjay','Litzkow','M','1988-06-21'),
657
+ (10657,'1958-03-09','Juichirou','Kitsuregawa','M','1989-12-31'),
658
+ (10658,'1956-11-21','Junsik','Rijckaert','F','1994-04-29'),
659
+ (10659,'1956-12-09','Dinah','Shackel','F','1991-09-20'),
660
+ (10660,'1964-01-03','Jouko','Kolinko','M','1988-08-12'),
661
+ (10661,'1956-04-07','Ottavia','Giarratana','F','1988-01-12'),
662
+ (10662,'1959-10-17','Arto','Serra','F','1986-09-28'),
663
+ (10663,'1965-01-09','Teunis','Noriega','M','1993-01-23'),
664
+ (10664,'1962-06-02','Xumin','Peck','M','1989-12-24'),
665
+ (10665,'1964-07-28','Qingxiang','Snyers','M','1988-01-23'),
666
+ (10666,'1964-10-03','Zhonghua','Reeker','M','1989-05-20'),
667
+ (10667,'1955-08-05','Makato','Cusworth','F','1990-06-25'),
668
+ (10668,'1959-03-20','Maren','Granlund','F','1989-09-25'),
669
+ (10669,'1956-05-30','Yurij','Iisaka','F','1995-06-09'),
670
+ (10670,'1962-04-23','Shunichi','McAffer','M','1988-03-23'),
671
+ (10671,'1953-06-12','Parviz','Rebaine','M','1987-01-08'),
672
+ (10672,'1954-03-23','Bluma','Zeilberger','M','1986-07-13'),
673
+ (10673,'1959-12-26','Hyuckchul','Casperson','M','1990-03-01'),
674
+ (10674,'1961-03-03','Abdelaziz','Bisiani','M','1988-09-16'),
675
+ (10675,'1960-03-26','Ymte','Waschkowski','F','1991-11-05'),
676
+ (10676,'1953-08-26','Valeri','Danley','F','1986-03-20'),
677
+ (10677,'1963-02-20','Alejandra','Perng','F','1996-10-07'),
678
+ (10678,'1958-08-21','Chriss','Gide','F','1987-08-02'),
679
+ (10679,'1956-09-25','Neven','Brender','M','1990-05-13'),
680
+ (10680,'1962-10-11','Kish','Honglei','M','1986-06-20'),
681
+ (10681,'1964-12-25','Florina','Garnier','M','1992-10-25'),
682
+ (10682,'1956-07-04','Bedir','Haumacher','M','1990-11-09'),
683
+ (10683,'1952-06-18','Guiseppe','Stranks','F','1993-09-07'),
684
+ (10684,'1956-01-23','Aimee','Tokunaga','F','1999-10-28'),
685
+ (10685,'1959-01-14','Zongyan','Cusworth','M','1990-04-24'),
686
+ (10686,'1963-05-25','Avishai','Azadmanesh','F','1987-05-17'),
687
+ (10687,'1961-07-25','Leon','Kaiser','F','1990-03-13'),
688
+ (10688,'1964-02-28','Xiaopeng','Lanphier','F','1985-03-25'),
689
+ (10689,'1958-09-13','Satoru','Otillio','M','1988-08-05'),
690
+ (10690,'1962-09-06','Matt','Jumpertz','F','1989-08-22'),
691
+ (10691,'1957-11-18','Denny','Setia','M','1989-09-17'),
692
+ (10692,'1960-08-11','Larisa','Bage','M','1993-03-22'),
693
+ (10693,'1953-12-14','Berhard','Daescu','F','1986-01-08'),
694
+ (10694,'1955-12-16','Rildo','Straney','M','1988-01-26'),
695
+ (10695,'1962-08-30','Zorica','Acton','M','1989-08-05'),
696
+ (10696,'1952-03-23','Unal','Fendler','M','1991-09-09'),
697
+ (10697,'1958-04-09','Bluma','Hiltgen','M','1998-03-04'),
698
+ (10698,'1959-09-13','Barton','Engberts','M','1994-12-08'),
699
+ (10699,'1964-02-02','Hatim','Deverell','M','1985-11-17'),
700
+ (10700,'1962-11-30','Angel','Mondadori','M','1987-04-02'),
701
+ (10701,'1961-09-30','Hyuncheol','Zolotykh','M','1986-10-27'),
702
+ (10702,'1952-11-25','Bader','Szemeredi','M','1985-07-23'),
703
+ (10703,'1958-06-13','Giri','Baumann','F','1996-05-12'),
704
+ (10704,'1960-04-08','Yolla','Kropatsch','M','1988-07-08'),
705
+ (10705,'1963-06-17','Hironobu','Wynblatt','M','1990-07-18'),
706
+ (10706,'1959-10-11','Gonzalo','Eldridge','M','1989-12-17'),
707
+ (10707,'1957-06-04','Moty','Trystram','M','1990-12-24'),
708
+ (10708,'1959-07-02','Aral','Erman','M','1996-05-18'),
709
+ (10709,'1961-01-06','Jiafu','Mateescu','F','1986-02-02'),
710
+ (10710,'1962-12-25','Sorina','Kermarrec','M','1992-01-10'),
711
+ (10711,'1963-06-20','Arvind','DuBourdieux','F','1991-06-21'),
712
+ (10712,'1952-04-12','Uma','Koprowski','F','1994-08-18'),
713
+ (10713,'1959-04-14','Jagoda','Naumovich','M','1986-04-26'),
714
+ (10714,'1960-09-28','Aran','Sadowsky','M','1997-03-11'),
715
+ (10715,'1959-11-21','Goa','Poehlman','M','1995-09-25'),
716
+ (10716,'1963-10-08','Aiman','Constantine','M','1985-08-20'),
717
+ (10717,'1956-01-27','Serap','Tasistro','M','1987-06-27'),
718
+ (10718,'1955-12-19','Adib','Rullman','M','1988-07-21'),
719
+ (10719,'1959-09-26','Guenter','Karunanithi','F','1995-09-05'),
720
+ (10720,'1956-06-17','Odinaldo','Kruskal','M','1985-08-01'),
721
+ (10721,'1964-07-12','Bernd','Redmiles','F','1995-03-17'),
722
+ (10722,'1960-10-03','Dung','Gornas','M','1989-01-17'),
723
+ (10723,'1964-01-14','Eckart','Harnett','F','1993-05-26'),
724
+ (10724,'1957-10-06','Aluzio','Narlikar','M','1991-11-04'),
725
+ (10725,'1958-10-22','Garnet','Isard','M','1990-09-08'),
726
+ (10726,'1954-01-11','Zita','Minakawa','F','1985-09-01'),
727
+ (10727,'1959-06-16','Saeed','Kitai','F','1991-01-08'),
728
+ (10728,'1958-11-17','Ugo','Maliniak','F','1989-12-09'),
729
+ (10729,'1961-05-24','Percy','Lorho','F','1986-04-20'),
730
+ (10730,'1962-07-22','Mohit','Janetzko','M','1988-11-24'),
731
+ (10731,'1952-11-17','Fumitaka','Peak','M','1987-02-20'),
732
+ (10732,'1962-04-22','Morris','Andreotta','F','1991-03-10'),
733
+ (10733,'1962-04-06','Sangeeta','Rodham','F','1996-02-20'),
734
+ (10734,'1954-07-06','Sachar','Erdi','M','1985-04-03'),
735
+ (10735,'1964-09-12','Morrie','Gewali','M','1985-10-29'),
736
+ (10736,'1962-07-09','Gurbir','Hellwagner','F','1991-09-26'),
737
+ (10737,'1960-10-10','Vincent','Schwartzbauer','M','1990-10-15'),
738
+ (10738,'1963-10-08','Rosita','Oppitz','M','1988-01-17'),
739
+ (10739,'1961-02-11','Gor','Iacovou','F','1985-03-12'),
740
+ (10740,'1956-04-19','Suzette','Sadowski','M','1995-08-15'),
741
+ (10741,'1954-01-02','Sven','Huttel','F','1989-01-06'),
742
+ (10742,'1955-03-13','Shim','Wiegley','M','1991-01-03'),
743
+ (10743,'1963-12-26','Kiyomitsu','Peltason','M','1985-06-10'),
744
+ (10744,'1957-02-17','Yaghout','Syang','M','1985-12-29'),
745
+ (10745,'1953-10-23','Poorav','Ranze','F','1987-05-26'),
746
+ (10746,'1958-12-29','Kolar','Usery','F','1990-08-31'),
747
+ (10747,'1955-02-02','Falguni','Khalid','M','1990-10-08'),
748
+ (10748,'1964-04-12','Yuchang','Francisci','F','1990-08-14'),
749
+ (10749,'1955-08-21','King','Brendel','M','1985-09-26'),
750
+ (10750,'1953-06-14','Roddy','Demeyer','F','1991-08-04'),
751
+ (10751,'1952-12-02','Jordanka','Ushiama','M','1987-04-15'),
752
+ (10752,'1964-07-18','Byong','Conde','M','1993-05-28'),
753
+ (10753,'1958-09-30','Pradeep','Harbusch','F','1985-05-17'),
754
+ (10754,'1956-09-08','Chenyi','Feinberg','M','1988-01-11'),
755
+ (10755,'1962-06-10','Odysseas','Ressouche','M','1988-06-16'),
756
+ (10756,'1958-06-24','Paddy','Brizzi','M','1995-11-21'),
757
+ (10757,'1961-01-11','Florina','Simkin','M','1986-01-06'),
758
+ (10758,'1962-11-26','Fumiyo','Boyle','F','1988-02-06'),
759
+ (10759,'1956-04-12','JiYoung','Chenney','M','1991-12-04'),
760
+ (10760,'1963-05-27','Phillip','Dratva','M','1994-06-15'),
761
+ (10761,'1959-04-10','Sumali','Liedekerke','M','1992-05-30'),
762
+ (10762,'1965-01-19','Lech','Himler','M','1992-01-21'),
763
+ (10763,'1962-04-15','Giap','Bolsens','M','1987-02-23'),
764
+ (10764,'1953-01-12','Yunming','Beetstra','F','1989-11-27'),
765
+ (10765,'1961-02-24','Goetz','Norsworthy','M','1994-05-07'),
766
+ (10766,'1964-06-10','Nathalie','Standera','M','1996-08-05'),
767
+ (10767,'1954-02-28','Monique','Doering','F','1987-06-17'),
768
+ (10768,'1955-06-24','Ishfaq','Candan','M','1985-07-04'),
769
+ (10769,'1962-11-02','Vishv','Bouloucos','M','1987-08-16'),
770
+ (10770,'1956-06-18','Bedir','Perry','F','1987-12-25'),
771
+ (10771,'1960-05-10','Guiseppe','Kleiser','F','1989-11-08'),
772
+ (10772,'1956-01-21','Munehiro','Dayana','M','1987-06-29'),
773
+ (10773,'1960-07-11','Avishai','Bahr','F','1985-12-01'),
774
+ (10774,'1958-10-03','Jacqueline','Masand','M','1990-01-26'),
775
+ (10775,'1956-03-12','Xiaoheng','Sluis','M','1988-12-09'),
776
+ (10776,'1958-01-27','Mahmut','Skafidas','F','1986-03-16'),
777
+ (10777,'1955-08-11','Mizuhito','Kemmerer','F','1988-07-05'),
778
+ (10778,'1953-03-13','Selwyn','Merey','M','1986-07-04'),
779
+ (10779,'1961-07-09','Mori','Yavatkar','F','1988-01-11'),
780
+ (10780,'1955-09-12','Goncalo','Staudhammer','M','1989-11-06'),
781
+ (10781,'1958-09-19','Patricio','Leuchs','M','1991-02-04'),
782
+ (10782,'1952-09-18','Kish','Perna','F','1991-10-21'),
783
+ (10783,'1963-11-13','Moty','Kenevan','M','1994-05-15'),
784
+ (10784,'1957-01-27','Weijing','Bottner','F','1987-05-12'),
785
+ (10785,'1963-02-09','Keiichiro','Marzano','M','1994-11-11'),
786
+ (10786,'1964-05-19','Patricia','dAstous','M','1989-03-14'),
787
+ (10787,'1958-07-10','Shiv','Neimat','F','1991-04-16'),
788
+ (10788,'1963-06-28','Frazer','Ullian','M','1993-12-13'),
789
+ (10789,'1964-05-19','Aruna','Journel','F','1987-02-02'),
790
+ (10790,'1962-04-01','Yurij','Schonegge','M','1990-07-03'),
791
+ (10791,'1954-05-27','Tadahiko','Sgarro','M','1988-07-30'),
792
+ (10792,'1962-09-04','Chinya','Birdsall','M','1985-08-10'),
793
+ (10793,'1960-08-27','Oksana','Roisin','F','1987-10-02'),
794
+ (10794,'1962-06-26','Teunis','Berztiss','M','1992-03-29'),
795
+ (10795,'1954-12-14','Supot','Naudin','M','1985-05-21'),
796
+ (10796,'1959-06-30','Khoa','Rousseau','M','1990-11-08'),
797
+ (10797,'1956-10-04','Goetz','Hiyoshi','F','1988-08-21'),
798
+ (10798,'1961-07-18','Elliott','Bednarek','M','1992-02-09'),
799
+ (10799,'1957-11-21','Gad','Griswold','F','1988-06-06'),
800
+ (10800,'1961-12-15','Yuchang','Matzke','M','1993-05-20'),
801
+ (10801,'1953-03-05','Uinam','Zschoche','M','1994-06-27'),
802
+ (10802,'1960-10-27','Masato','Setlzner','M','1985-08-24'),
803
+ (10803,'1952-09-15','Katsuyuki','Velasco','F','1988-04-20'),
804
+ (10804,'1964-02-20','Terresa','Benantar','M','1996-04-18'),
805
+ (10805,'1959-09-12','Kerhong','Bernick','F','1987-05-26'),
806
+ (10806,'1958-10-17','Giap','Matzel','M','1993-04-25'),
807
+ (10807,'1964-06-23','Munehiro','Zallocco','F','1986-10-23'),
808
+ (10808,'1955-09-11','Chenxi','Leijenhorst','M','1987-03-07'),
809
+ (10809,'1962-01-06','Shim','Feldhoffer','F','1987-03-04'),
810
+ (10810,'1957-10-23','Lijie','Lunn','F','1994-09-07'),
811
+ (10811,'1954-06-29','Ashish','Fortenbacher','M','1997-07-08'),
812
+ (10812,'1957-09-14','Berthier','Menhoudj','F','1987-08-11'),
813
+ (10813,'1954-07-04','Shalesh','Shumilov','M','1990-04-27'),
814
+ (10814,'1952-09-17','Nidapan','Dymetman','F','1993-07-17'),
815
+ (10815,'1960-11-12','Renny','Pramanik','M','1994-04-19'),
816
+ (10816,'1958-02-24','Morris','Caine','F','1989-06-27'),
817
+ (10817,'1958-10-02','Uri','Rullman','F','1990-12-26'),
818
+ (10818,'1958-12-20','Huan','Monarch','M','1995-10-22'),
819
+ (10819,'1957-02-19','Pascal','Sooriamurthi','M','1986-08-02'),
820
+ (10820,'1956-11-12','Baocai','Pena','F','1986-02-23'),
821
+ (10821,'1959-04-14','Irena','Schurmann','M','1987-03-12'),
822
+ (10822,'1956-08-02','Masaru','Passino','F','1986-01-11'),
823
+ (10823,'1956-06-13','Arfst','Mikschl','M','1995-01-02'),
824
+ (10824,'1958-09-20','Kirk','Kalsbeek','M','1985-03-18'),
825
+ (10825,'1958-03-27','Fan','Fairtlough','M','1985-12-30'),
826
+ (10826,'1952-12-06','Arnd','Anandan','M','1993-01-22'),
827
+ (10827,'1953-09-25','Willard','Danley','M','1996-11-07'),
828
+ (10828,'1962-10-12','Godehard','Gammage','M','1986-02-14'),
829
+ (10829,'1955-07-11','Alper','Narahara','F','1993-02-22'),
830
+ (10830,'1954-08-17','Fen','Fiebach','M','1991-08-24'),
831
+ (10831,'1953-10-11','Toong','Driscoll','M','1996-06-21'),
832
+ (10832,'1964-08-29','Hidde','Bergere','F','1986-10-11'),
833
+ (10833,'1953-04-12','Krisda','Gecseg','F','1989-02-08'),
834
+ (10834,'1954-12-16','Huiqun','Rajcani','M','1990-11-24'),
835
+ (10835,'1952-11-23','Tomoyuki','Kermarrec','M','1985-07-28'),
836
+ (10836,'1953-07-15','Jianhua','Leivant','F','1985-07-26'),
837
+ (10837,'1957-02-06','Chuanti','Karlin','M','1986-01-14'),
838
+ (10838,'1957-10-19','Deniz','Ramras','M','1990-04-11'),
839
+ (10839,'1964-04-02','Gurbir','Katiyar','M','1991-10-05'),
840
+ (10840,'1961-04-26','Mohammad','Koshino','M','1993-06-04'),
841
+ (10841,'1961-10-14','Pranav','Lieberherr','M','1990-04-21'),
842
+ (10842,'1961-08-29','Berni','Sanella','F','1986-07-14'),
843
+ (10843,'1961-09-05','Honesty','Smeets','M','1990-04-26'),
844
+ (10844,'1954-02-03','Dipayan','Koprowski','M','1987-03-03'),
845
+ (10845,'1960-12-24','Hidde','Tasistro','F','1988-06-30'),
846
+ (10846,'1952-06-27','Tokuyasu','Serre','M','1994-01-26'),
847
+ (10847,'1952-03-04','Theirry','Danley','M','1986-07-25'),
848
+ (10848,'1954-07-16','Fen','Bratsberg','F','1985-04-20'),
849
+ (10849,'1953-03-05','Makato','Mayerwieser','M','1995-06-25'),
850
+ (10850,'1963-01-01','Florina','Schapire','F','1990-04-22'),
851
+ (10851,'1959-11-15','Piyawadee','Copas','M','1994-11-21'),
852
+ (10852,'1959-11-24','Hercules','Munck','F','1996-03-21'),
853
+ (10853,'1964-03-22','Yoshinari','Kalloufi','F','1993-05-03'),
854
+ (10854,'1954-08-11','Jagoda','Nannarelli','M','1998-07-13'),
855
+ (10855,'1957-08-07','Kwangho','Reinhart','M','1991-08-05'),
856
+ (10856,'1964-03-13','Sreenivas','Peck','F','1986-12-31'),
857
+ (10857,'1957-06-11','Fusako','Stenning','F','1990-04-04'),
858
+ (10858,'1952-10-01','Kenroku','Gonthier','M','1996-08-15'),
859
+ (10859,'1961-10-16','King','Bernini','F','1993-01-03'),
860
+ (10860,'1961-11-05','Gino','Werthner','M','1992-03-11'),
861
+ (10861,'1962-02-27','Howell','Baek','M','1989-06-10'),
862
+ (10862,'1956-01-19','Zhenbing','Kadhim','F','1985-07-23'),
863
+ (10863,'1962-08-05','Byong','Bhattacharjee','M','1985-12-25'),
864
+ (10864,'1958-01-07','Elliott','Spieker','F','1985-09-04'),
865
+ (10865,'1961-03-16','Danco','Etalle','M','1991-04-19'),
866
+ (10866,'1959-12-13','Fayez','Yeung','F','1990-12-27'),
867
+ (10867,'1952-10-01','Billur','Gyorkos','M','1986-10-08'),
868
+ (10868,'1959-05-11','Houman','Unno','F','1990-03-20'),
869
+ (10869,'1962-10-09','Guangming','Jonsson','F','1996-03-15'),
870
+ (10870,'1956-07-23','Shahid','Leppanen','F','1988-01-13'),
871
+ (10871,'1952-10-24','Aram','Gilg','M','1989-02-15'),
872
+ (10872,'1952-02-21','Karoline','Speel','F','1990-09-06'),
873
+ (10873,'1952-07-09','Sukumar','Wegerle','M','1994-03-23'),
874
+ (10874,'1958-01-18','Mahmut','Borstler','M','1986-04-22'),
875
+ (10875,'1958-10-27','Filipp','Suri','F','1988-05-19'),
876
+ (10876,'1955-08-05','Vincent','Papastamatiou','F','1995-01-29'),
877
+ (10877,'1964-09-11','Subir','Biron','M','1986-06-06'),
878
+ (10878,'1952-06-13','Lakshmi','Deville','M','1988-02-25'),
879
+ (10879,'1953-08-18','Muzhong','Chleq','F','1985-08-15'),
880
+ (10880,'1962-02-11','Weiye','Nitsche','M','1986-04-20'),
881
+ (10881,'1959-06-13','Katsuo','Miake','M','1996-04-18'),
882
+ (10882,'1953-11-01','Fun','Heuser','M','1994-11-29'),
883
+ (10883,'1952-07-30','Shimshon','Champarnaud','M','1987-11-07'),
884
+ (10884,'1958-03-07','Teunis','Kleiser','F','1993-04-15'),
885
+ (10885,'1953-05-06','Rayond','Cronau','M','1991-08-19'),
886
+ (10886,'1964-09-30','Sushant','Begiun','M','1995-03-26'),
887
+ (10887,'1953-01-16','Lunjin','DeMori','M','1989-03-16'),
888
+ (10888,'1959-03-15','Kwangho','Dredge','F','1987-06-28'),
889
+ (10889,'1956-06-21','Cheong','Coors','F','1987-08-11'),
890
+ (10890,'1963-04-13','Ramzi','Furudate','M','1988-04-21'),
891
+ (10891,'1963-12-15','Susanne','Jiang','F','1990-12-07'),
892
+ (10892,'1959-12-13','Kazunori','Vieth','M','1990-04-11'),
893
+ (10893,'1960-01-30','Danil','Kropatsch','M','1989-08-23'),
894
+ (10894,'1958-08-21','Suebskul','Srimani','F','1991-07-18'),
895
+ (10895,'1952-03-21','Vishwani','Petersohn','M','1986-04-26'),
896
+ (10896,'1964-04-12','Adil','Taubenfeld','M','1994-10-08'),
897
+ (10897,'1958-05-27','Arno','Kumaresan','F','1986-04-09'),
898
+ (10898,'1961-11-10','Munenori','Markovitch','F','1986-04-10'),
899
+ (10899,'1962-05-11','Valery','Rousseau','F','1989-10-06'),
900
+ (10900,'1955-07-18','Ferdinand','Prenel','F','1995-09-07'),
901
+ (10901,'1959-06-12','Chrisa','Narahara','M','1992-10-30'),
902
+ (10902,'1964-05-09','Inderjeet','Perly','M','1990-04-22'),
903
+ (10903,'1958-06-04','Visit','Nyanchama','M','1989-02-14'),
904
+ (10904,'1959-08-28','Debatosh','Colorni','F','1993-04-16'),
905
+ (10905,'1961-04-30','Jianhui','Aloia','M','1985-02-28'),
906
+ (10906,'1952-02-06','Munehiro','Carrere','F','1994-01-20'),
907
+ (10907,'1963-09-26','JiYoung','Luks','M','1988-12-25'),
908
+ (10908,'1961-11-27','Rajmohan','Koblick','M','1985-10-08'),
909
+ (10909,'1954-11-11','Georgi','Atchley','M','1985-04-21'),
910
+ (10910,'1958-11-11','Arco','Jervis','M','1989-07-13'),
911
+ (10911,'1959-07-22','Shay','Casley','M','1988-06-25'),
912
+ (10912,'1952-07-27','Oscal','Fasbender','M','1986-04-23'),
913
+ (10913,'1952-09-03','Narain','Thummel','M','1992-06-25'),
914
+ (10914,'1956-04-26','Mizuhito','Prochazka','M','1998-03-24'),
915
+ (10915,'1961-03-11','Valery','Skafidas','M','1987-12-06'),
916
+ (10916,'1962-01-03','Make','Spataro','M','1996-07-01'),
917
+ (10917,'1956-05-10','Tesuya','Slaats','F','1987-12-03'),
918
+ (10918,'1954-12-26','Susumu','Reghbati','M','1985-12-13'),
919
+ (10919,'1961-09-04','Reinhard','Lindenbaum','M','1987-04-19'),
920
+ (10920,'1955-04-08','Ronghao','Narahara','M','1991-07-09'),
921
+ (10921,'1955-07-20','Mara','Bahi','F','1986-07-27'),
922
+ (10922,'1953-10-27','Kyoichi','Wossner','M','1992-08-09'),
923
+ (10923,'1957-04-29','Younwoo','Maquelin','M','1990-04-09'),
924
+ (10924,'1954-04-27','Hironoby','Atchley','F','1988-08-14'),
925
+ (10925,'1960-02-13','Heng','Waterhouse','F','1986-09-04'),
926
+ (10926,'1954-10-13','Leni','Eppinger','F','1990-04-30'),
927
+ (10927,'1953-03-13','Gal','Scallan','M','1985-10-26'),
928
+ (10928,'1961-11-01','Udaiprakash','Schmezko','M','1991-04-07'),
929
+ (10929,'1958-10-26','Sumali','Arlazarov','M','1991-04-15'),
930
+ (10930,'1954-01-13','Arch','Minakawa','M','1990-08-09'),
931
+ (10931,'1963-06-30','Abdulla','Beutelspacher','F','1992-06-14'),
932
+ (10932,'1955-11-19','Avishai','Picci','F','1994-09-09'),
933
+ (10933,'1965-01-24','Juyoung','Seghrouchni','F','1993-08-02'),
934
+ (10934,'1960-05-21','Bartek','Strooper','F','1993-11-11'),
935
+ (10935,'1961-08-09','Morris','Famili','M','1990-03-09'),
936
+ (10936,'1953-04-08','Mountaz','Schicker','F','1987-10-27'),
937
+ (10937,'1964-09-11','Anyuan','Nanard','M','1987-08-29'),
938
+ (10938,'1958-05-11','Shaowei','Iisaku','F','1985-09-24'),
939
+ (10939,'1964-07-13','Matk','Akazan','M','1990-11-01'),
940
+ (10940,'1953-01-07','Aleksander','Fioravanti','F','1994-12-02'),
941
+ (10941,'1960-08-26','Katsuyuki','Norsworthy','M','1993-08-22'),
942
+ (10942,'1952-08-08','Toshimitsu','Larfeldt','F','1989-09-08'),
943
+ (10943,'1955-11-19','Berna','Skafidas','M','1988-02-19'),
944
+ (10944,'1952-05-25','Remko','Zyda','M','1991-05-24'),
945
+ (10945,'1959-09-25','Kazuhiro','Kushnir','F','1990-07-04'),
946
+ (10946,'1956-09-08','Shaz','Kabayashi','M','1996-02-04'),
947
+ (10947,'1954-09-29','Gor','Usery','F','1995-11-16'),
948
+ (10948,'1952-12-23','Shigehito','Brodie','M','1996-09-30'),
949
+ (10949,'1953-08-14','Shigeichiro','Wroclawski','F','1990-03-13'),
950
+ (10950,'1958-12-07','Sushant','Staylopatis','M','1996-06-08'),
951
+ (10951,'1962-01-20','Marco','Iisaku','M','1989-07-06'),
952
+ (10952,'1958-08-26','Inderjeet','Bharadwaj','M','1986-07-22'),
953
+ (10953,'1956-06-23','Jahangir','Laventhal','F','1987-02-12'),
954
+ (10954,'1964-11-16','Ranga','Burnard','F','1990-08-07'),
955
+ (10955,'1959-02-24','Urs','Danley','F','1986-09-27'),
956
+ (10956,'1955-02-02','Arno','Picel','M','1992-06-29'),
957
+ (10957,'1961-06-06','Duke','Schnabel','M','1988-01-23'),
958
+ (10958,'1958-11-07','Huican','Katalagarianos','M','1988-11-27'),
959
+ (10959,'1956-06-19','Kerryn','Vigier','M','1994-03-01'),
960
+ (10960,'1959-10-24','Billur','Braunschweig','M','1988-03-14'),
961
+ (10961,'1957-03-28','Weiwu','Choobineh','M','1986-05-14'),
962
+ (10962,'1956-08-23','Naraig','Kugler','F','1986-12-16'),
963
+ (10963,'1957-04-15','Hatsukazu','Swist','M','1988-01-14'),
964
+ (10964,'1962-04-02','Takushi','Bolsens','F','1990-10-11'),
965
+ (10965,'1955-07-10','Eckart','Braunschweig','M','1986-07-29'),
966
+ (10966,'1962-07-04','Danel','Pardalos','M','1989-11-07'),
967
+ (10967,'1962-10-01','Eran','Adachi','M','1993-08-01'),
968
+ (10968,'1961-03-19','Lakshmi','Kolinko','M','1985-08-11'),
969
+ (10969,'1954-09-05','Premal','Noriega','M','1988-08-22'),
970
+ (10970,'1962-08-24','Gen','Tiemann','F','1994-09-16'),
971
+ (10971,'1955-02-08','Isamu','Vadhan','M','1991-07-30'),
972
+ (10972,'1961-10-05','Fumiko','Asser','F','1987-06-06'),
973
+ (10973,'1961-10-02','Valdiodio','Raczkowsky','M','1989-03-05'),
974
+ (10974,'1952-03-07','Muneo','Papsdorf','M','1985-11-25'),
975
+ (10975,'1962-07-27','Peternela','Birnbaum','F','1986-10-31'),
976
+ (10976,'1963-01-27','Hitomi','Valette','F','1992-12-06'),
977
+ (10977,'1957-03-19','Toong','Murrill','M','1987-08-10'),
978
+ (10978,'1962-09-24','Huiqun','Bellone','M','1985-05-18'),
979
+ (10979,'1959-09-11','Elrique','Raney','F','1986-01-27'),
980
+ (10980,'1963-11-10','Filipp','Munawer','M','1989-01-04'),
981
+ (10981,'1956-07-22','Sugwoo','Dulin','F','1989-01-03'),
982
+ (10982,'1964-02-27','Yishay','Decleir','M','1989-11-11'),
983
+ (10983,'1961-08-09','Somnath','Parascandalo','F','1988-02-22'),
984
+ (10984,'1962-11-10','Pranjal','Billawala','F','1988-07-09'),
985
+ (10985,'1952-05-31','Chiradeep','Furedi','F','1990-12-10'),
986
+ (10986,'1954-08-11','Masako','Schiper','M','1985-10-11'),
987
+ (10987,'1952-11-26','Flemming','Baezner','M','1995-12-19'),
988
+ (10988,'1955-06-24','Chinya','Deyuan','M','1985-06-19'),
989
+ (10989,'1954-09-08','Sumali','Candan','F','1985-07-20'),
990
+ (10990,'1954-10-22','Shin','Foote','M','1988-07-06'),
991
+ (10991,'1957-05-22','Munehiro','Aingworth','M','1993-05-21'),
992
+ (10992,'1958-11-26','Zhensheng','Juneja','M','1988-08-01'),
993
+ (10993,'1958-11-17','Arve','Erde','F','1992-05-29'),
994
+ (10994,'1961-06-17','Divine','Aingworth','M','1987-06-29'),
995
+ (10995,'1963-02-26','Chenye','Hertweck','F','1997-07-19'),
996
+ (10996,'1955-02-01','Matk','Rahimi','F','1990-02-07'),
997
+ (10997,'1959-08-30','Alselm','Parascandalo','F','1994-05-06'),
998
+ (10998,'1956-02-17','Marlo','Kandlur','M','1992-06-28'),
999
+ (10999,'1961-12-04','Insup','Benveniste','F','1996-03-05'),
1000
+ (11000,'1960-09-12','Alain','Bonifati','M','1988-08-20');
employee-sample-database/postgres/dataset_small/load_salary1.sql ADDED
The diff for this file is too large to render. See raw diff
 
employee-sample-database/postgres/dataset_small/load_title.sql ADDED
@@ -0,0 +1,1470 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ INSERT INTO title VALUES (10001,'Senior Engineer','1986-06-26','9999-01-01'),
2
+ (10002,'Staff','1996-08-03','9999-01-01'),
3
+ (10003,'Senior Engineer','1995-12-03','9999-01-01'),
4
+ (10004,'Engineer','1986-12-01','1995-12-01'),
5
+ (10004,'Senior Engineer','1995-12-01','9999-01-01'),
6
+ (10005,'Senior Staff','1996-09-12','9999-01-01'),
7
+ (10005,'Staff','1989-09-12','1996-09-12'),
8
+ (10006,'Senior Engineer','1990-08-05','9999-01-01'),
9
+ (10007,'Senior Staff','1996-02-11','9999-01-01'),
10
+ (10007,'Staff','1989-02-10','1996-02-11'),
11
+ (10008,'Assistant Engineer','1998-03-11','2000-07-31'),
12
+ (10009,'Assistant Engineer','1985-02-18','1990-02-18'),
13
+ (10009,'Engineer','1990-02-18','1995-02-18'),
14
+ (10009,'Senior Engineer','1995-02-18','9999-01-01'),
15
+ (10010,'Engineer','1996-11-24','9999-01-01'),
16
+ (10011,'Staff','1990-01-22','1996-11-09'),
17
+ (10012,'Engineer','1992-12-18','2000-12-18'),
18
+ (10012,'Senior Engineer','2000-12-18','9999-01-01'),
19
+ (10013,'Senior Staff','1985-10-20','9999-01-01'),
20
+ (10014,'Engineer','1993-12-29','9999-01-01'),
21
+ (10015,'Senior Staff','1992-09-19','1993-08-22'),
22
+ (10016,'Staff','1998-02-11','9999-01-01'),
23
+ (10017,'Senior Staff','2000-08-03','9999-01-01'),
24
+ (10017,'Staff','1993-08-03','2000-08-03'),
25
+ (10018,'Engineer','1987-04-03','1995-04-03'),
26
+ (10018,'Senior Engineer','1995-04-03','9999-01-01'),
27
+ (10019,'Staff','1999-04-30','9999-01-01'),
28
+ (10020,'Engineer','1997-12-30','9999-01-01'),
29
+ (10021,'Technique Leader','1988-02-10','2002-07-15'),
30
+ (10022,'Engineer','1999-09-03','9999-01-01'),
31
+ (10023,'Engineer','1999-09-27','9999-01-01'),
32
+ (10024,'Assistant Engineer','1998-06-14','9999-01-01'),
33
+ (10025,'Technique Leader','1987-08-17','1997-10-15'),
34
+ (10026,'Engineer','1995-03-20','2001-03-19'),
35
+ (10026,'Senior Engineer','2001-03-19','9999-01-01'),
36
+ (10027,'Engineer','1995-04-02','2001-04-01'),
37
+ (10027,'Senior Engineer','2001-04-01','9999-01-01'),
38
+ (10028,'Engineer','1991-10-22','1998-04-06'),
39
+ (10029,'Engineer','1991-09-18','2000-09-17'),
40
+ (10029,'Senior Engineer','2000-09-17','9999-01-01'),
41
+ (10030,'Engineer','1994-02-17','2001-02-17'),
42
+ (10030,'Senior Engineer','2001-02-17','9999-01-01'),
43
+ (10031,'Engineer','1991-09-01','1998-09-01'),
44
+ (10031,'Senior Engineer','1998-09-01','9999-01-01'),
45
+ (10032,'Engineer','1990-06-20','1995-06-20'),
46
+ (10032,'Senior Engineer','1995-06-20','9999-01-01'),
47
+ (10033,'Technique Leader','1987-03-18','1993-03-24'),
48
+ (10034,'Staff','1995-04-12','1999-10-31'),
49
+ (10035,'Engineer','1988-09-05','1996-09-05'),
50
+ (10035,'Senior Engineer','1996-09-05','9999-01-01'),
51
+ (10036,'Senior Staff','1992-04-28','9999-01-01'),
52
+ (10037,'Engineer','1990-12-05','1995-12-05'),
53
+ (10037,'Senior Engineer','1995-12-05','9999-01-01'),
54
+ (10038,'Senior Staff','1996-09-20','9999-01-01'),
55
+ (10038,'Staff','1989-09-20','1996-09-20'),
56
+ (10039,'Senior Staff','1997-01-18','9999-01-01'),
57
+ (10039,'Staff','1988-01-19','1997-01-18'),
58
+ (10040,'Engineer','1993-02-14','1999-02-14'),
59
+ (10040,'Senior Engineer','1999-02-14','9999-01-01'),
60
+ (10041,'Senior Staff','1998-11-12','9999-01-01'),
61
+ (10041,'Staff','1989-11-12','1998-11-12'),
62
+ (10042,'Senior Staff','2000-03-21','2000-08-10'),
63
+ (10042,'Staff','1993-03-21','2000-03-21'),
64
+ (10043,'Engineer','1990-10-20','1997-10-20'),
65
+ (10043,'Senior Engineer','1997-10-20','9999-01-01'),
66
+ (10044,'Technique Leader','1994-05-21','9999-01-01'),
67
+ (10045,'Engineer','1996-11-16','9999-01-01'),
68
+ (10046,'Senior Staff','2000-06-20','9999-01-01'),
69
+ (10046,'Staff','1992-06-20','2000-06-20'),
70
+ (10047,'Engineer','1989-03-31','1998-03-31'),
71
+ (10047,'Senior Engineer','1998-03-31','9999-01-01'),
72
+ (10048,'Engineer','1985-02-24','1987-01-27'),
73
+ (10049,'Senior Staff','2000-05-04','9999-01-01'),
74
+ (10049,'Staff','1992-05-04','2000-05-04'),
75
+ (10050,'Senior Staff','1999-12-25','9999-01-01'),
76
+ (10050,'Staff','1990-12-25','1999-12-25'),
77
+ (10051,'Engineer','1992-10-15','1998-10-15'),
78
+ (10051,'Senior Engineer','1998-10-15','9999-01-01'),
79
+ (10052,'Senior Staff','2002-01-31','9999-01-01'),
80
+ (10052,'Staff','1997-01-31','2002-01-31'),
81
+ (10053,'Senior Staff','1994-11-13','9999-01-01'),
82
+ (10054,'Senior Staff','2000-07-28','9999-01-01'),
83
+ (10054,'Staff','1995-07-29','2000-07-28'),
84
+ (10055,'Staff','1992-04-27','1995-07-22'),
85
+ (10056,'Engineer','1990-02-01','1999-02-01'),
86
+ (10056,'Senior Engineer','1999-02-01','9999-01-01'),
87
+ (10057,'Engineer','1992-01-15','2000-01-15'),
88
+ (10057,'Senior Engineer','2000-01-15','9999-01-01'),
89
+ (10058,'Senior Staff','1988-04-25','9999-01-01'),
90
+ (10059,'Senior Staff','1991-06-26','9999-01-01'),
91
+ (10060,'Senior Staff','1996-05-28','9999-01-01'),
92
+ (10060,'Staff','1989-05-28','1996-05-28'),
93
+ (10061,'Senior Staff','1989-12-02','9999-01-01'),
94
+ (10062,'Engineer','1991-08-30','1999-08-30'),
95
+ (10062,'Senior Engineer','1999-08-30','9999-01-01'),
96
+ (10063,'Senior Engineer','1989-04-08','9999-01-01'),
97
+ (10064,'Staff','1985-11-20','1992-03-02'),
98
+ (10065,'Engineer','1998-05-24','9999-01-01'),
99
+ (10066,'Assistant Engineer','1986-02-26','1992-02-26'),
100
+ (10066,'Engineer','1992-02-26','1998-02-25'),
101
+ (10066,'Senior Engineer','1998-02-25','9999-01-01'),
102
+ (10067,'Engineer','1987-03-04','1996-03-03'),
103
+ (10067,'Senior Engineer','1996-03-03','9999-01-01'),
104
+ (10068,'Senior Staff','1996-08-06','9999-01-01'),
105
+ (10068,'Staff','1987-08-07','1996-08-06'),
106
+ (10069,'Technique Leader','1992-06-14','9999-01-01'),
107
+ (10070,'Technique Leader','1985-10-14','9999-01-01'),
108
+ (10071,'Staff','1995-08-05','9999-01-01'),
109
+ (10072,'Engineer','1989-05-21','1995-05-21'),
110
+ (10072,'Senior Engineer','1995-05-21','9999-01-01'),
111
+ (10073,'Engineer','1998-02-02','1998-02-22'),
112
+ (10074,'Technique Leader','1990-08-13','9999-01-01'),
113
+ (10075,'Senior Engineer','1988-05-17','2001-01-15'),
114
+ (10076,'Senior Engineer','1996-07-15','9999-01-01'),
115
+ (10077,'Staff','1994-12-23','9999-01-01'),
116
+ (10078,'Engineer','1994-09-29','9999-01-01'),
117
+ (10079,'Technique Leader','1995-12-13','9999-01-01'),
118
+ (10080,'Senior Staff','2001-09-28','9999-01-01'),
119
+ (10080,'Staff','1994-09-28','2001-09-28'),
120
+ (10081,'Engineer','1986-10-30','1991-10-30'),
121
+ (10081,'Senior Engineer','1991-10-30','9999-01-01'),
122
+ (10082,'Staff','1990-01-03','1990-01-15'),
123
+ (10083,'Engineer','1987-03-31','1994-03-31'),
124
+ (10083,'Senior Engineer','1994-03-31','9999-01-01'),
125
+ (10084,'Engineer','1995-12-15','2001-12-14'),
126
+ (10084,'Senior Engineer','2001-12-14','9999-01-01'),
127
+ (10085,'Senior Engineer','1994-04-09','9999-01-01'),
128
+ (10086,'Senior Staff','1999-02-19','9999-01-01'),
129
+ (10086,'Staff','1992-02-19','1999-02-19'),
130
+ (10087,'Staff','1997-05-08','2001-01-09'),
131
+ (10088,'Senior Staff','1993-09-02','9999-01-01'),
132
+ (10088,'Staff','1988-09-02','1993-09-02'),
133
+ (10089,'Senior Staff','1996-01-11','9999-01-01'),
134
+ (10089,'Staff','1989-01-10','1996-01-11'),
135
+ (10090,'Senior Engineer','1986-03-14','1999-05-07'),
136
+ (10091,'Engineer','1992-11-18','2001-11-18'),
137
+ (10091,'Senior Engineer','2001-11-18','9999-01-01'),
138
+ (10092,'Engineer','1996-04-22','9999-01-01'),
139
+ (10093,'Staff','1997-06-08','9999-01-01'),
140
+ (10094,'Senior Staff','1987-04-18','1997-11-08'),
141
+ (10095,'Senior Staff','2000-03-09','9999-01-01'),
142
+ (10095,'Staff','1994-03-10','2000-03-09'),
143
+ (10096,'Engineer','1999-01-23','9999-01-01'),
144
+ (10097,'Senior Staff','1996-09-14','9999-01-01'),
145
+ (10097,'Staff','1990-09-15','1996-09-14'),
146
+ (10098,'Engineer','1985-05-13','1992-05-13'),
147
+ (10098,'Senior Engineer','1992-05-13','1992-12-11'),
148
+ (10099,'Senior Staff','1995-10-19','9999-01-01'),
149
+ (10099,'Staff','1988-10-18','1995-10-19'),
150
+ (10100,'Senior Staff','1994-09-21','9999-01-01'),
151
+ (10100,'Staff','1987-09-21','1994-09-21'),
152
+ (10101,'Staff','1998-10-14','2000-09-23'),
153
+ (10102,'Assistant Engineer','1995-01-02','2002-01-02'),
154
+ (10102,'Engineer','2002-01-02','9999-01-01'),
155
+ (10103,'Engineer','1998-01-12','9999-01-01'),
156
+ (10104,'Senior Staff','1987-04-16','9999-01-01'),
157
+ (10105,'Staff','1999-05-17','2001-06-11'),
158
+ (10106,'Engineer','1991-10-27','1997-10-26'),
159
+ (10106,'Senior Engineer','1997-10-26','9999-01-01'),
160
+ (10107,'Senior Staff','1999-03-30','9999-01-01'),
161
+ (10108,'Staff','1999-03-20','2001-10-20'),
162
+ (10109,'Engineer','1993-06-16','2001-06-16'),
163
+ (10109,'Senior Engineer','2001-06-16','9999-01-01'),
164
+ (10110,'Senior Staff','1992-08-21','9999-01-01'),
165
+ (10110,'Staff','1986-08-22','1992-08-21'),
166
+ (10111,'Engineer','1988-12-19','1996-12-19'),
167
+ (10111,'Senior Engineer','1996-12-19','9999-01-01'),
168
+ (10112,'Staff','1998-05-01','9999-01-01'),
169
+ (10113,'Engineer','1998-09-14','9999-01-01'),
170
+ (10114,'Senior Staff','1999-07-18','9999-01-01'),
171
+ (10114,'Staff','1992-07-17','1999-07-18'),
172
+ (10115,'Staff','1988-03-03','1992-05-24'),
173
+ (10116,'Senior Engineer','1994-02-27','1998-11-01'),
174
+ (10117,'Senior Engineer','1992-03-19','9999-01-01'),
175
+ (10118,'Senior Engineer','1992-02-02','9999-01-01'),
176
+ (10119,'Engineer','1993-12-09','1997-10-30'),
177
+ (10120,'Engineer','1996-07-06','9999-01-01'),
178
+ (10121,'Engineer','1989-05-03','1996-05-03'),
179
+ (10121,'Senior Engineer','1996-05-03','9999-01-01'),
180
+ (10122,'Technique Leader','1998-08-06','9999-01-01'),
181
+ (10123,'Assistant Engineer','1993-01-15','1999-01-15'),
182
+ (10123,'Engineer','1999-01-15','9999-01-01'),
183
+ (10124,'Engineer','1991-09-05','1998-09-05'),
184
+ (10124,'Senior Engineer','1998-09-05','9999-01-01'),
185
+ (10125,'Staff','1990-10-26','1996-03-25'),
186
+ (10126,'Senior Staff','1991-09-08','9999-01-01'),
187
+ (10126,'Staff','1985-09-08','1991-09-08'),
188
+ (10127,'Senior Engineer','1991-05-17','9999-01-01'),
189
+ (10128,'Senior Staff','1995-06-07','9999-01-01'),
190
+ (10128,'Staff','1988-06-06','1995-06-07'),
191
+ (10129,'Technique Leader','1996-01-16','9999-01-01'),
192
+ (10130,'Senior Engineer','1988-06-21','9999-01-01'),
193
+ (10131,'Engineer','1999-09-17','1999-12-06'),
194
+ (10132,'Staff','1997-06-18','9999-01-01'),
195
+ (10133,'Engineer','1985-12-15','1991-12-15'),
196
+ (10133,'Senior Engineer','1991-12-15','9999-01-01'),
197
+ (10134,'Engineer','1987-12-12','1994-12-12'),
198
+ (10134,'Senior Engineer','1994-12-12','9999-01-01'),
199
+ (10135,'Assistant Engineer','1990-01-04','1999-01-04'),
200
+ (10135,'Engineer','1999-01-04','9999-01-01'),
201
+ (10136,'Senior Staff','1997-06-13','1999-09-20'),
202
+ (10136,'Staff','1988-06-13','1997-06-13'),
203
+ (10137,'Senior Staff','1994-02-18','9999-01-01'),
204
+ (10137,'Staff','1985-02-18','1994-02-18'),
205
+ (10138,'Engineer','1992-03-03','2001-03-03'),
206
+ (10138,'Senior Engineer','2001-03-03','9999-01-01'),
207
+ (10139,'Engineer','1998-03-15','9999-01-01'),
208
+ (10140,'Senior Staff','1998-03-14','9999-01-01'),
209
+ (10140,'Staff','1991-03-14','1998-03-14'),
210
+ (10141,'Senior Staff','1998-07-23','9999-01-01'),
211
+ (10142,'Engineer','1993-10-28','2001-10-28'),
212
+ (10142,'Senior Engineer','2001-10-28','9999-01-01'),
213
+ (10143,'Engineer','1988-09-30','1993-09-30'),
214
+ (10143,'Senior Engineer','1993-09-30','9999-01-01'),
215
+ (10144,'Senior Staff','1992-10-14','1993-08-10'),
216
+ (10144,'Staff','1985-10-14','1992-10-14'),
217
+ (10145,'Engineer','1999-11-03','9999-01-01'),
218
+ (10146,'Staff','1988-06-28','1990-09-07'),
219
+ (10147,'Senior Staff','1995-12-18','9999-01-01'),
220
+ (10147,'Staff','1987-12-18','1995-12-18'),
221
+ (10148,'Staff','1996-07-15','9999-01-01'),
222
+ (10149,'Staff','1994-01-28','1996-08-27'),
223
+ (10150,'Engineer','1986-11-16','1995-11-16'),
224
+ (10150,'Senior Engineer','1995-11-16','9999-01-01'),
225
+ (10151,'Senior Staff','1997-12-12','9999-01-01'),
226
+ (10151,'Staff','1992-12-12','1997-12-12'),
227
+ (10152,'Engineer','1986-01-27','1987-08-03'),
228
+ (10153,'Assistant Engineer','2000-01-08','9999-01-01'),
229
+ (10154,'Staff','1996-10-23','9999-01-01'),
230
+ (10155,'Senior Staff','1996-01-05','9999-01-01'),
231
+ (10155,'Staff','1990-01-05','1996-01-05'),
232
+ (10156,'Engineer','1993-05-14','2001-05-14'),
233
+ (10156,'Senior Engineer','2001-05-14','9999-01-01'),
234
+ (10157,'Senior Engineer','1997-12-10','9999-01-01'),
235
+ (10158,'Engineer','1987-06-04','1996-06-03'),
236
+ (10158,'Senior Engineer','1996-06-03','9999-01-01'),
237
+ (10159,'Senior Engineer','1996-06-12','9999-01-01'),
238
+ (10160,'Senior Staff','2000-12-06','9999-01-01'),
239
+ (10160,'Staff','1993-12-06','2000-12-06'),
240
+ (10161,'Engineer','1991-06-09','1994-01-05'),
241
+ (10162,'Engineer','1998-05-27','9999-01-01'),
242
+ (10163,'Senior Staff','1992-02-02','9999-01-01'),
243
+ (10164,'Engineer','1990-10-19','1999-10-19'),
244
+ (10164,'Senior Engineer','1999-10-19','9999-01-01'),
245
+ (10165,'Senior Staff','1988-05-17','9999-01-01'),
246
+ (10166,'Engineer','1996-09-02','9999-01-01'),
247
+ (10167,'Engineer','1992-04-04','2001-04-04'),
248
+ (10167,'Senior Engineer','2001-04-04','9999-01-01'),
249
+ (10168,'Senior Staff','1995-12-06','9999-01-01'),
250
+ (10168,'Staff','1986-12-06','1995-12-06'),
251
+ (10169,'Engineer','1998-06-28','9999-01-01'),
252
+ (10170,'Engineer','1986-01-02','1989-02-06'),
253
+ (10171,'Technique Leader','1996-08-05','9999-01-01'),
254
+ (10172,'Engineer','1998-02-04','9999-01-01'),
255
+ (10173,'Senior Staff','1999-03-22','9999-01-01'),
256
+ (10173,'Staff','1992-03-21','1999-03-22'),
257
+ (10174,'Engineer','1987-06-01','1995-06-01'),
258
+ (10174,'Senior Engineer','1995-06-01','9999-01-01'),
259
+ (10175,'Staff','1988-09-24','1995-05-24'),
260
+ (10176,'Senior Staff','1999-12-22','9999-01-01'),
261
+ (10176,'Staff','1994-12-22','1999-12-22'),
262
+ (10177,'Staff','1993-02-06','1994-03-17'),
263
+ (10178,'Staff','1994-03-21','9999-01-01'),
264
+ (10179,'Engineer','2000-01-25','9999-01-01'),
265
+ (10180,'Senior Staff','2002-07-01','9999-01-01'),
266
+ (10180,'Staff','1994-07-01','2002-07-01'),
267
+ (10181,'Senior Engineer','1988-06-22','9999-01-01'),
268
+ (10182,'Engineer','1990-09-02','1995-09-02'),
269
+ (10182,'Senior Engineer','1995-09-02','9999-01-01'),
270
+ (10183,'Staff','1996-08-11','9999-01-01'),
271
+ (10184,'Staff','1997-12-26','9999-01-01'),
272
+ (10185,'Senior Staff','1992-02-29','9999-01-01'),
273
+ (10185,'Staff','1986-03-01','1992-02-29'),
274
+ (10186,'Staff','1996-12-25','1997-08-16'),
275
+ (10187,'Senior Staff','2000-05-31','9999-01-01'),
276
+ (10187,'Staff','1991-06-01','2000-05-31'),
277
+ (10188,'Senior Engineer','1987-08-27','9999-01-01'),
278
+ (10189,'Engineer','1992-09-13','1993-06-29'),
279
+ (10190,'Engineer','1986-06-23','1994-06-23'),
280
+ (10190,'Senior Engineer','1994-06-23','9999-01-01'),
281
+ (10191,'Senior Engineer','1986-04-10','9999-01-01'),
282
+ (10192,'Engineer','1988-06-13','1993-06-13'),
283
+ (10192,'Senior Engineer','1993-06-13','9999-01-01'),
284
+ (10193,'Engineer','1996-09-21','9999-01-01'),
285
+ (10194,'Senior Staff','2002-02-14','9999-01-01'),
286
+ (10194,'Staff','1997-02-14','2002-02-14'),
287
+ (10195,'Engineer','1985-02-15','1991-02-15'),
288
+ (10195,'Senior Engineer','1991-02-15','2001-04-14'),
289
+ (10196,'Staff','1999-01-31','9999-01-01'),
290
+ (10197,'Engineer','1994-06-28','2001-06-28'),
291
+ (10197,'Senior Engineer','2001-06-28','9999-01-01'),
292
+ (10198,'Engineer','1985-08-31','1993-08-31'),
293
+ (10198,'Senior Engineer','1993-08-31','9999-01-01'),
294
+ (10199,'Staff','1998-02-07','9999-01-01'),
295
+ (10200,'Engineer','1994-02-17','2000-02-17'),
296
+ (10200,'Senior Engineer','2000-02-17','9999-01-01'),
297
+ (10201,'Engineer','1992-11-10','1998-11-10'),
298
+ (10201,'Senior Engineer','1998-11-10','9999-01-01'),
299
+ (10202,'Engineer','1991-10-06','2000-10-05'),
300
+ (10202,'Senior Engineer','2000-10-05','9999-01-01'),
301
+ (10203,'Senior Staff','1995-04-06','9999-01-01'),
302
+ (10203,'Staff','1989-04-06','1995-04-06'),
303
+ (10204,'Engineer','1998-12-18','1999-03-08'),
304
+ (10205,'Senior Engineer','1993-08-23','9999-01-01'),
305
+ (10206,'Technique Leader','1988-04-19','9999-01-01'),
306
+ (10207,'Engineer','1992-10-11','1997-10-11'),
307
+ (10207,'Senior Engineer','1997-10-11','9999-01-01'),
308
+ (10208,'Staff','1995-02-05','1999-05-15'),
309
+ (10209,'Senior Staff','1997-11-22','9999-01-01'),
310
+ (10209,'Staff','1991-11-23','1997-11-22'),
311
+ (10210,'Senior Staff','2002-02-23','9999-01-01'),
312
+ (10210,'Staff','1996-02-24','2002-02-23'),
313
+ (10211,'Engineer','1991-11-22','1996-11-21'),
314
+ (10211,'Senior Engineer','1996-11-21','9999-01-01'),
315
+ (10212,'Engineer','1996-01-28','2001-01-27'),
316
+ (10212,'Senior Engineer','2001-01-27','9999-01-01'),
317
+ (10213,'Staff','1994-10-06','9999-01-01'),
318
+ (10214,'Senior Staff','1988-02-29','9999-01-01'),
319
+ (10215,'Senior Staff','1991-11-23','9999-01-01'),
320
+ (10216,'Senior Staff','1993-10-29','9999-01-01'),
321
+ (10216,'Staff','1987-10-30','1993-10-29'),
322
+ (10217,'Technique Leader','1986-05-12','1993-08-05'),
323
+ (10218,'Senior Engineer','1997-01-31','9999-01-01'),
324
+ (10219,'Senior Staff','1993-03-31','9999-01-01'),
325
+ (10220,'Staff','1997-09-16','9999-01-01'),
326
+ (10221,'Engineer','1988-06-08','1997-06-08'),
327
+ (10221,'Senior Engineer','1997-06-08','2000-10-04'),
328
+ (10222,'Assistant Engineer','1986-06-08','1995-06-08'),
329
+ (10222,'Engineer','1995-06-08','9999-01-01'),
330
+ (10223,'Engineer','1998-04-01','9999-01-01'),
331
+ (10224,'Engineer','1988-01-09','1996-01-09'),
332
+ (10224,'Senior Engineer','1996-01-09','9999-01-01'),
333
+ (10225,'Staff','1995-12-14','9999-01-01'),
334
+ (10226,'Staff','1996-01-29','9999-01-01'),
335
+ (10227,'Technique Leader','1994-11-01','9999-01-01'),
336
+ (10228,'Senior Staff','1998-12-22','9999-01-01'),
337
+ (10228,'Staff','1992-12-22','1998-12-22'),
338
+ (10229,'Engineer','1996-02-20','2000-06-30'),
339
+ (10230,'Senior Staff','2002-06-16','9999-01-01'),
340
+ (10230,'Staff','1996-06-16','2002-06-16'),
341
+ (10231,'Staff','1998-09-09','9999-01-01'),
342
+ (10232,'Senior Staff','1998-06-04','9999-01-01'),
343
+ (10232,'Staff','1992-06-04','1998-06-04'),
344
+ (10233,'Senior Staff','2000-04-28','9999-01-01'),
345
+ (10233,'Staff','1994-04-29','2000-04-28'),
346
+ (10234,'Senior Staff','1995-11-19','1999-08-06'),
347
+ (10234,'Staff','1990-11-19','1995-11-19'),
348
+ (10235,'Senior Engineer','1995-04-06','9999-01-01'),
349
+ (10236,'Staff','1996-08-30','9999-01-01'),
350
+ (10237,'Senior Staff','1997-08-11','2000-02-21'),
351
+ (10237,'Staff','1989-08-11','1997-08-11'),
352
+ (10238,'Engineer','1995-03-31','9999-01-01'),
353
+ (10239,'Staff','1996-05-04','9999-01-01'),
354
+ (10240,'Engineer','1998-10-06','9999-01-01'),
355
+ (10241,'Senior Staff','1995-06-13','9999-01-01'),
356
+ (10241,'Staff','1988-06-12','1995-06-13'),
357
+ (10242,'Engineer','1988-01-18','1995-01-18'),
358
+ (10242,'Senior Engineer','1995-01-18','9999-01-01'),
359
+ (10243,'Senior Staff','1986-06-07','9999-01-01'),
360
+ (10244,'Engineer','1999-09-16','9999-01-01'),
361
+ (10245,'Staff','1994-04-21','1995-02-20'),
362
+ (10246,'Senior Engineer','1991-02-01','9999-01-01'),
363
+ (10247,'Engineer','1992-08-14','1998-08-14'),
364
+ (10247,'Senior Engineer','1998-08-14','9999-01-01'),
365
+ (10248,'Senior Staff','1997-08-12','9999-01-01'),
366
+ (10248,'Staff','1991-08-13','1997-08-12'),
367
+ (10249,'Engineer','1991-12-08','2000-12-07'),
368
+ (10249,'Senior Engineer','2000-12-07','9999-01-01'),
369
+ (10250,'Engineer','1992-08-30','2001-08-30'),
370
+ (10250,'Senior Engineer','2001-08-30','9999-01-01'),
371
+ (10251,'Senior Staff','2001-06-25','9999-01-01'),
372
+ (10251,'Staff','1992-06-25','2001-06-25'),
373
+ (10252,'Engineer','1990-11-08','1998-11-08'),
374
+ (10252,'Senior Engineer','1998-11-08','9999-01-01'),
375
+ (10253,'Senior Staff','1993-02-21','1994-03-20'),
376
+ (10253,'Staff','1985-02-21','1993-02-21'),
377
+ (10254,'Senior Staff','1998-06-14','9999-01-01'),
378
+ (10254,'Staff','1990-06-14','1998-06-14'),
379
+ (10255,'Engineer','1993-05-12','1999-05-12'),
380
+ (10255,'Senior Engineer','1999-05-12','1999-11-14'),
381
+ (10256,'Senior Staff','1990-10-12','9999-01-01'),
382
+ (10256,'Staff','1985-10-12','1990-10-12'),
383
+ (10257,'Technique Leader','1997-07-16','9999-01-01'),
384
+ (10258,'Assistant Engineer','1985-05-17','1991-05-17'),
385
+ (10258,'Engineer','1991-05-17','1997-05-16'),
386
+ (10258,'Senior Engineer','1997-05-16','9999-01-01'),
387
+ (10259,'Senior Staff','1993-07-24','1999-01-06'),
388
+ (10259,'Staff','1987-07-25','1993-07-24'),
389
+ (10260,'Engineer','1993-02-01','2002-02-01'),
390
+ (10260,'Senior Engineer','2002-02-01','9999-01-01'),
391
+ (10261,'Senior Engineer','1996-09-11','1999-02-23'),
392
+ (10262,'Staff','1996-01-22','9999-01-01'),
393
+ (10263,'Staff','1996-12-21','9999-01-01'),
394
+ (10264,'Engineer','1997-07-16','9999-01-01'),
395
+ (10265,'Senior Engineer','1997-09-12','9999-01-01'),
396
+ (10266,'Senior Engineer','1990-05-25','9999-01-01'),
397
+ (10267,'Engineer','1997-04-26','9999-01-01'),
398
+ (10268,'Engineer','1986-12-17','1990-08-17'),
399
+ (10269,'Engineer','1988-07-24','1996-07-24'),
400
+ (10269,'Senior Engineer','1996-07-24','9999-01-01'),
401
+ (10270,'Senior Staff','1999-09-26','9999-01-01'),
402
+ (10270,'Staff','1991-09-26','1999-09-26'),
403
+ (10271,'Engineer','1986-05-23','1992-05-22'),
404
+ (10271,'Senior Engineer','1992-05-22','9999-01-01'),
405
+ (10272,'Staff','1997-10-23','9999-01-01'),
406
+ (10273,'Senior Staff','1991-11-06','9999-01-01'),
407
+ (10273,'Staff','1985-11-06','1991-11-06'),
408
+ (10274,'Engineer','1997-02-02','9999-01-01'),
409
+ (10275,'Senior Engineer','1987-09-08','9999-01-01'),
410
+ (10276,'Engineer','1986-10-19','1993-10-19'),
411
+ (10276,'Senior Engineer','1993-10-19','2000-02-04'),
412
+ (10277,'Senior Staff','1991-06-16','9999-01-01'),
413
+ (10277,'Staff','1985-06-16','1991-06-16'),
414
+ (10278,'Engineer','1993-07-02','1997-02-14'),
415
+ (10279,'Engineer','1995-04-26','9999-01-01'),
416
+ (10280,'Staff','1995-01-27','9999-01-01'),
417
+ (10281,'Engineer','1994-12-03','2000-12-02'),
418
+ (10281,'Senior Engineer','2000-12-02','9999-01-01'),
419
+ (10282,'Assistant Engineer','1996-05-02','2001-05-02'),
420
+ (10282,'Engineer','2001-05-02','9999-01-01'),
421
+ (10283,'Engineer','1988-05-25','1995-05-26'),
422
+ (10283,'Senior Engineer','1995-05-26','9999-01-01'),
423
+ (10284,'Engineer','1999-07-06','9999-01-01'),
424
+ (10285,'Staff','1995-05-25','9999-01-01'),
425
+ (10286,'Staff','1994-12-24','1999-01-24'),
426
+ (10287,'Senior Staff','2000-12-28','9999-01-01'),
427
+ (10287,'Staff','1992-12-28','2000-12-28'),
428
+ (10288,'Technique Leader','1994-08-29','9999-01-01'),
429
+ (10289,'Technique Leader','1993-03-12','2002-01-31'),
430
+ (10290,'Engineer','1991-09-18','1997-09-17'),
431
+ (10290,'Senior Engineer','1997-09-17','9999-01-01'),
432
+ (10291,'Senior Staff','1994-03-30','9999-01-01'),
433
+ (10291,'Staff','1987-03-30','1994-03-30'),
434
+ (10292,'Senior Staff','1997-06-05','9999-01-01'),
435
+ (10292,'Staff','1989-06-05','1997-06-05'),
436
+ (10293,'Engineer','1992-12-12','2001-12-12'),
437
+ (10293,'Senior Engineer','2001-12-12','9999-01-01'),
438
+ (10294,'Senior Engineer','1999-01-30','1999-05-04'),
439
+ (10295,'Senior Staff','2000-06-18','9999-01-01'),
440
+ (10295,'Staff','1995-06-19','2000-06-18'),
441
+ (10296,'Senior Staff','1994-09-16','9999-01-01'),
442
+ (10296,'Staff','1989-09-16','1994-09-16'),
443
+ (10297,'Engineer','1986-05-28','1995-05-28'),
444
+ (10297,'Senior Engineer','1995-05-28','9999-01-01'),
445
+ (10298,'Staff','1999-04-27','9999-01-01'),
446
+ (10299,'Senior Staff','1997-01-10','9999-01-01'),
447
+ (10299,'Staff','1990-01-10','1997-01-10'),
448
+ (10300,'Engineer','1991-05-17','1996-05-16'),
449
+ (10300,'Senior Engineer','1996-05-16','9999-01-01'),
450
+ (10301,'Senior Staff','1995-05-24','9999-01-01'),
451
+ (10301,'Staff','1988-05-23','1995-05-24'),
452
+ (10302,'Senior Staff','1994-07-22','1999-11-09'),
453
+ (10302,'Staff','1986-07-22','1994-07-22'),
454
+ (10303,'Senior Engineer','1990-02-05','2000-11-15'),
455
+ (10304,'Senior Staff','1997-11-16','2002-05-08'),
456
+ (10304,'Staff','1992-11-16','1997-11-16'),
457
+ (10305,'Engineer','1988-10-31','1992-06-02'),
458
+ (10306,'Staff','1993-09-06','9999-01-01'),
459
+ (10307,'Engineer','1999-10-16','9999-01-01'),
460
+ (10308,'Senior Staff','2001-12-29','9999-01-01'),
461
+ (10308,'Staff','1992-12-29','2001-12-29'),
462
+ (10309,'Assistant Engineer','1997-05-02','9999-01-01'),
463
+ (10310,'Senior Engineer','1990-10-24','2001-07-26'),
464
+ (10311,'Engineer','1998-11-04','9999-01-01'),
465
+ (10312,'Senior Engineer','1986-08-28','9999-01-01'),
466
+ (10313,'Staff','1994-10-10','9999-01-01'),
467
+ (10314,'Senior Staff','1994-01-16','9999-01-01'),
468
+ (10314,'Staff','1986-01-16','1994-01-16'),
469
+ (10315,'Engineer','1987-08-28','1994-08-28'),
470
+ (10315,'Senior Engineer','1994-08-28','9999-01-01'),
471
+ (10316,'Engineer','1990-12-18','1991-01-02'),
472
+ (10317,'Staff','1999-01-24','9999-01-01'),
473
+ (10318,'Engineer','1987-03-23','1995-03-23'),
474
+ (10318,'Senior Engineer','1995-03-23','9999-01-01'),
475
+ (10319,'Senior Staff','1999-06-18','9999-01-01'),
476
+ (10319,'Staff','1994-06-18','1999-06-18'),
477
+ (10320,'Senior Staff','1996-11-03','2001-12-23'),
478
+ (10320,'Staff','1988-11-03','1996-11-03'),
479
+ (10321,'Staff','1995-07-24','1999-08-14'),
480
+ (10322,'Engineer','1990-01-29','1997-01-29'),
481
+ (10322,'Senior Engineer','1997-01-29','9999-01-01'),
482
+ (10323,'Engineer','1991-06-06','2000-06-05'),
483
+ (10323,'Senior Engineer','2000-06-05','9999-01-01'),
484
+ (10324,'Engineer','1999-07-19','9999-01-01'),
485
+ (10325,'Senior Staff','1990-09-20','9999-01-01'),
486
+ (10326,'Staff','1998-09-02','9999-01-01'),
487
+ (10327,'Engineer','1987-09-18','1993-05-22'),
488
+ (10328,'Engineer','1998-07-17','9999-01-01'),
489
+ (10329,'Technique Leader','1986-01-20','9999-01-01'),
490
+ (10330,'Staff','1993-10-08','9999-01-01'),
491
+ (10331,'Senior Staff','1991-10-29','9999-01-01'),
492
+ (10331,'Staff','1986-10-29','1991-10-29'),
493
+ (10332,'Engineer','1988-10-20','1994-10-20'),
494
+ (10332,'Senior Engineer','1994-10-20','1997-03-07'),
495
+ (10333,'Engineer','1993-01-16','1998-01-16'),
496
+ (10333,'Senior Engineer','1998-01-16','9999-01-01'),
497
+ (10334,'Staff','1998-02-15','9999-01-01'),
498
+ (10335,'Senior Staff','1992-04-06','9999-01-01'),
499
+ (10336,'Staff','1996-09-27','9999-01-01'),
500
+ (10337,'Assistant Engineer','1998-04-25','9999-01-01'),
501
+ (10338,'Staff','1999-12-29','9999-01-01'),
502
+ (10339,'Engineer','1989-11-30','1997-11-30'),
503
+ (10339,'Senior Engineer','1997-11-30','9999-01-01'),
504
+ (10340,'Senior Staff','1993-03-30','9999-01-01'),
505
+ (10340,'Staff','1988-03-30','1993-03-30'),
506
+ (10341,'Technique Leader','1987-04-29','1998-11-11'),
507
+ (10342,'Engineer','1987-07-25','1993-07-24'),
508
+ (10342,'Senior Engineer','1993-07-24','9999-01-01'),
509
+ (10343,'Senior Engineer','1997-10-03','9999-01-01'),
510
+ (10344,'Assistant Engineer','1999-04-19','9999-01-01'),
511
+ (10345,'Engineer','1993-11-08','1998-11-08'),
512
+ (10345,'Senior Engineer','1998-11-08','9999-01-01'),
513
+ (10346,'Staff','1992-01-17','1996-04-20'),
514
+ (10347,'Staff','1998-02-20','9999-01-01'),
515
+ (10348,'Technique Leader','1995-10-22','9999-01-01'),
516
+ (10349,'Senior Staff','1997-09-27','9999-01-01'),
517
+ (10349,'Staff','1991-09-28','1997-09-27'),
518
+ (10350,'Assistant Engineer','1991-05-11','1997-05-10'),
519
+ (10350,'Engineer','1997-05-10','1998-01-16'),
520
+ (10351,'Staff','1995-05-01','9999-01-01'),
521
+ (10352,'Engineer','1998-12-16','9999-01-01'),
522
+ (10353,'Senior Staff','1989-08-24','9999-01-01'),
523
+ (10354,'Senior Staff','1999-03-03','2002-01-01'),
524
+ (10355,'Staff','1996-01-26','9999-01-01'),
525
+ (10356,'Senior Staff','1995-06-26','9999-01-01'),
526
+ (10357,'Engineer','1994-04-04','1999-04-03'),
527
+ (10357,'Senior Engineer','1999-04-03','9999-01-01'),
528
+ (10358,'Technique Leader','1991-02-19','9999-01-01'),
529
+ (10359,'Engineer','1998-07-20','9999-01-01'),
530
+ (10360,'Staff','1996-09-04','9999-01-01'),
531
+ (10361,'Senior Staff','1991-10-23','9999-01-01'),
532
+ (10361,'Staff','1986-10-23','1991-10-23'),
533
+ (10362,'Senior Staff','1990-11-02','1997-07-16'),
534
+ (10363,'Assistant Engineer','1985-09-11','1993-02-12'),
535
+ (10364,'Senior Engineer','1985-11-14','9999-01-01'),
536
+ (10365,'Staff','1987-10-22','1992-04-04'),
537
+ (10366,'Engineer','1997-08-15','9999-01-01'),
538
+ (10367,'Senior Staff','2000-06-23','9999-01-01'),
539
+ (10367,'Staff','1991-06-24','2000-06-23'),
540
+ (10368,'Assistant Engineer','1996-05-16','9999-01-01'),
541
+ (10369,'Staff','1994-09-05','9999-01-01'),
542
+ (10370,'Senior Staff','1998-04-18','9999-01-01'),
543
+ (10370,'Staff','1992-04-18','1998-04-18'),
544
+ (10371,'Assistant Engineer','1989-11-28','1998-11-28'),
545
+ (10371,'Engineer','1998-11-28','9999-01-01'),
546
+ (10372,'Technique Leader','1985-07-30','9999-01-01'),
547
+ (10373,'Engineer','1997-04-26','9999-01-01'),
548
+ (10374,'Staff','1993-12-08','1996-03-29'),
549
+ (10375,'Senior Staff','2001-05-29','9999-01-01'),
550
+ (10375,'Staff','1994-05-29','2001-05-29'),
551
+ (10376,'Technique Leader','1990-12-08','9999-01-01'),
552
+ (10377,'Senior Engineer','1996-08-24','9999-01-01'),
553
+ (10378,'Senior Staff','1992-08-31','9999-01-01'),
554
+ (10379,'Engineer','1996-07-15','9999-01-01'),
555
+ (10380,'Senior Staff','1994-03-19','9999-01-01'),
556
+ (10380,'Staff','1985-03-19','1994-03-19'),
557
+ (10381,'Assistant Engineer','1991-12-04','2000-12-03'),
558
+ (10381,'Engineer','2000-12-03','9999-01-01'),
559
+ (10382,'Engineer','1998-07-01','2000-10-27'),
560
+ (10383,'Engineer','1991-06-19','1997-06-18'),
561
+ (10383,'Senior Engineer','1997-06-18','9999-01-01'),
562
+ (10384,'Senior Staff','1991-01-16','9999-01-01'),
563
+ (10384,'Staff','1986-01-16','1991-01-16'),
564
+ (10385,'Engineer','1992-12-20','1998-01-23'),
565
+ (10386,'Engineer','1985-08-02','1994-08-02'),
566
+ (10386,'Senior Engineer','1994-08-02','9999-01-01'),
567
+ (10387,'Senior Staff','1999-01-07','9999-01-01'),
568
+ (10387,'Staff','1994-01-07','1999-01-07'),
569
+ (10388,'Staff','1999-05-28','9999-01-01'),
570
+ (10389,'Technique Leader','1999-05-13','9999-01-01'),
571
+ (10390,'Technique Leader','1989-05-17','9999-01-01'),
572
+ (10391,'Assistant Engineer','1993-01-28','2001-01-28'),
573
+ (10391,'Engineer','2001-01-28','9999-01-01'),
574
+ (10392,'Engineer','1992-03-01','1998-03-01'),
575
+ (10392,'Senior Engineer','1998-03-01','9999-01-01'),
576
+ (10393,'Engineer','1989-06-23','1995-06-23'),
577
+ (10393,'Senior Engineer','1995-06-23','9999-01-01'),
578
+ (10394,'Engineer','1991-03-14','1991-08-25'),
579
+ (10395,'Engineer','1998-08-10','2001-08-13'),
580
+ (10396,'Senior Engineer','1986-01-11','9999-01-01'),
581
+ (10397,'Technique Leader','1993-05-21','9999-01-01'),
582
+ (10398,'Senior Staff','1990-10-12','9999-01-01'),
583
+ (10399,'Staff','2000-01-26','9999-01-01'),
584
+ (10400,'Senior Staff','1993-10-17','9999-01-01'),
585
+ (10401,'Engineer','1999-10-25','2001-04-25'),
586
+ (10402,'Technique Leader','1987-01-02','9999-01-01'),
587
+ (10403,'Senior Staff','2000-09-12','2001-06-15'),
588
+ (10403,'Staff','1991-09-13','2000-09-12'),
589
+ (10404,'Engineer','1988-08-28','1996-08-28'),
590
+ (10404,'Senior Engineer','1996-08-28','9999-01-01'),
591
+ (10405,'Assistant Engineer','1998-09-26','2000-12-05'),
592
+ (10406,'Engineer','1996-01-26','9999-01-01'),
593
+ (10407,'Senior Staff','1999-10-30','9999-01-01'),
594
+ (10408,'Staff','1998-10-07','9999-01-01'),
595
+ (10409,'Engineer','1997-09-26','9999-01-01'),
596
+ (10410,'Staff','1993-10-16','1996-07-21'),
597
+ (10411,'Senior Staff','1994-09-02','9999-01-01'),
598
+ (10411,'Staff','1989-09-02','1994-09-02'),
599
+ (10412,'Engineer','1991-11-21','1996-11-20'),
600
+ (10412,'Senior Engineer','1996-11-20','9999-01-01'),
601
+ (10413,'Senior Staff','1997-12-26','9999-01-01'),
602
+ (10413,'Staff','1991-12-27','1997-12-26'),
603
+ (10414,'Senior Engineer','1990-05-30','1994-12-02'),
604
+ (10415,'Senior Engineer','1993-10-25','9999-01-01'),
605
+ (10416,'Senior Staff','1996-03-24','9999-01-01'),
606
+ (10416,'Staff','1989-03-24','1996-03-24'),
607
+ (10417,'Staff','1999-06-27','9999-01-01'),
608
+ (10418,'Staff','1996-10-04','9999-01-01'),
609
+ (10419,'Senior Staff','2000-04-25','2002-07-06'),
610
+ (10419,'Staff','1992-04-25','2000-04-25'),
611
+ (10420,'Senior Staff','1997-01-16','2000-07-09'),
612
+ (10420,'Staff','1988-01-17','1997-01-16'),
613
+ (10421,'Senior Staff','1998-04-07','9999-01-01'),
614
+ (10421,'Staff','1990-04-07','1998-04-07'),
615
+ (10422,'Engineer','1995-01-03','9999-01-01'),
616
+ (10423,'Staff','1999-05-27','9999-01-01'),
617
+ (10424,'Senior Engineer','1989-08-07','9999-01-01'),
618
+ (10425,'Engineer','1995-05-07','2001-05-06'),
619
+ (10425,'Senior Engineer','2001-05-06','2002-05-06'),
620
+ (10426,'Technique Leader','1985-07-06','9999-01-01'),
621
+ (10427,'Senior Staff','1999-10-03','9999-01-01'),
622
+ (10427,'Staff','1994-10-03','1999-10-03'),
623
+ (10428,'Senior Staff','1999-06-05','9999-01-01'),
624
+ (10428,'Staff','1992-06-04','1999-06-05'),
625
+ (10429,'Senior Engineer','1988-09-23','9999-01-01'),
626
+ (10430,'Senior Engineer','1998-07-05','9999-01-01'),
627
+ (10431,'Senior Staff','1995-10-08','9999-01-01'),
628
+ (10431,'Staff','1987-10-08','1995-10-08'),
629
+ (10432,'Senior Staff','1996-08-12','9999-01-01'),
630
+ (10432,'Staff','1990-08-13','1996-08-12'),
631
+ (10433,'Assistant Engineer','1992-11-26','1999-11-27'),
632
+ (10433,'Engineer','1999-11-27','9999-01-01'),
633
+ (10434,'Engineer','1995-06-27','2001-06-26'),
634
+ (10434,'Senior Engineer','2001-06-26','2002-06-22'),
635
+ (10435,'Engineer','1996-06-08','9999-01-01'),
636
+ (10436,'Senior Staff','1988-01-30','9999-01-01'),
637
+ (10437,'Engineer','1996-04-12','9999-01-01'),
638
+ (10438,'Assistant Engineer','1990-01-19','1997-01-19'),
639
+ (10438,'Engineer','1997-01-19','9999-01-01'),
640
+ (10439,'Engineer','1993-05-01','2002-05-01'),
641
+ (10439,'Senior Engineer','2002-05-01','9999-01-01'),
642
+ (10440,'Technique Leader','1997-04-04','9999-01-01'),
643
+ (10441,'Engineer','1988-07-12','1993-07-12'),
644
+ (10441,'Senior Engineer','1993-07-12','9999-01-01'),
645
+ (10442,'Senior Staff','1999-02-12','2001-03-13'),
646
+ (10442,'Staff','1992-02-12','1999-02-12'),
647
+ (10443,'Senior Engineer','1989-08-01','2002-07-06'),
648
+ (10444,'Staff','1994-10-23','9999-01-01'),
649
+ (10445,'Engineer','1987-11-04','1993-11-03'),
650
+ (10445,'Senior Engineer','1993-11-03','9999-01-01'),
651
+ (10446,'Engineer','1996-12-25','9999-01-01'),
652
+ (10447,'Assistant Engineer','1988-12-29','1997-12-29'),
653
+ (10447,'Engineer','1997-12-29','2000-11-15'),
654
+ (10448,'Senior Staff','2000-03-12','9999-01-01'),
655
+ (10448,'Staff','1992-03-12','2000-03-12'),
656
+ (10449,'Senior Staff','1994-03-28','9999-01-01'),
657
+ (10449,'Staff','1987-03-28','1994-03-28'),
658
+ (10450,'Engineer','1997-08-24','9999-01-01'),
659
+ (10451,'Assistant Engineer','1988-03-12','1993-03-12'),
660
+ (10451,'Engineer','1993-03-12','1998-03-12'),
661
+ (10451,'Senior Engineer','1998-03-12','9999-01-01'),
662
+ (10452,'Engineer','1995-11-12','2000-11-11'),
663
+ (10452,'Senior Engineer','2000-11-11','2001-10-11'),
664
+ (10453,'Senior Staff','1993-04-02','9999-01-01'),
665
+ (10453,'Staff','1985-04-02','1993-04-02'),
666
+ (10454,'Senior Staff','1989-04-16','9999-01-01'),
667
+ (10455,'Senior Staff','2002-02-19','9999-01-01'),
668
+ (10455,'Staff','1995-02-19','2002-02-19'),
669
+ (10456,'Staff','2000-01-06','9999-01-01'),
670
+ (10457,'Senior Engineer','1999-10-23','9999-01-01'),
671
+ (10458,'Senior Staff','2002-07-05','9999-01-01'),
672
+ (10458,'Staff','1994-07-05','2002-07-05'),
673
+ (10459,'Staff','1997-06-28','9999-01-01'),
674
+ (10460,'Engineer','1999-06-30','2001-04-15'),
675
+ (10461,'Senior Staff','1992-08-02','9999-01-01'),
676
+ (10461,'Staff','1987-08-03','1992-08-02'),
677
+ (10462,'Senior Engineer','1996-03-25','9999-01-01'),
678
+ (10463,'Staff','1994-02-17','9999-01-01'),
679
+ (10464,'Senior Staff','1999-05-21','9999-01-01'),
680
+ (10464,'Staff','1991-05-21','1999-05-21'),
681
+ (10465,'Senior Staff','2001-12-11','9999-01-01'),
682
+ (10465,'Staff','1994-12-11','2001-12-11'),
683
+ (10466,'Staff','1997-08-22','2000-08-15'),
684
+ (10467,'Staff','1992-05-22','1999-11-01'),
685
+ (10468,'Senior Staff','1998-05-28','9999-01-01'),
686
+ (10468,'Staff','1991-05-28','1998-05-28'),
687
+ (10469,'Senior Engineer','1985-06-05','9999-01-01'),
688
+ (10470,'Engineer','1989-09-19','1994-09-19'),
689
+ (10470,'Senior Engineer','1994-09-19','9999-01-01'),
690
+ (10471,'Senior Engineer','1990-11-18','9999-01-01'),
691
+ (10472,'Staff','1999-12-01','2002-01-02'),
692
+ (10473,'Engineer','1997-09-23','9999-01-01'),
693
+ (10474,'Engineer','1987-02-21','1992-02-21'),
694
+ (10474,'Senior Engineer','1992-02-21','9999-01-01'),
695
+ (10475,'Engineer','1992-05-13','1994-12-30'),
696
+ (10476,'Senior Staff','1994-09-20','9999-01-01'),
697
+ (10476,'Staff','1987-09-20','1994-09-20'),
698
+ (10477,'Engineer','1997-05-26','2002-05-26'),
699
+ (10477,'Senior Engineer','2002-05-26','9999-01-01'),
700
+ (10478,'Senior Staff','1992-06-09','9999-01-01'),
701
+ (10479,'Senior Engineer','1993-07-24','9999-01-01'),
702
+ (10480,'Staff','1988-05-18','1989-06-03'),
703
+ (10481,'Engineer','1989-10-03','1998-10-03'),
704
+ (10481,'Senior Engineer','1998-10-03','9999-01-01'),
705
+ (10482,'Engineer','1996-02-26','9999-01-01'),
706
+ (10483,'Assistant Engineer','1993-11-10','1998-11-10'),
707
+ (10483,'Engineer','1998-11-10','9999-01-01'),
708
+ (10484,'Senior Staff','1996-12-20','9999-01-01'),
709
+ (10485,'Engineer','1996-01-21','9999-01-01'),
710
+ (10486,'Engineer','1987-10-08','1996-10-07'),
711
+ (10486,'Senior Engineer','1996-10-07','9999-01-01'),
712
+ (10487,'Engineer','1992-08-14','2001-08-14'),
713
+ (10487,'Senior Engineer','2001-08-14','9999-01-01'),
714
+ (10488,'Engineer','1994-07-09','2002-07-09'),
715
+ (10488,'Senior Engineer','2002-07-09','9999-01-01'),
716
+ (10489,'Engineer','1989-09-10','1989-10-06'),
717
+ (10490,'Senior Staff','1997-11-22','9999-01-01'),
718
+ (10490,'Staff','1992-11-22','1997-11-22'),
719
+ (10491,'Senior Staff','1998-01-17','9999-01-01'),
720
+ (10491,'Staff','1990-01-17','1998-01-17'),
721
+ (10492,'Engineer','1988-04-29','1997-04-29'),
722
+ (10492,'Senior Engineer','1997-04-29','9999-01-01'),
723
+ (10493,'Senior Staff','1998-10-29','9999-01-01'),
724
+ (10494,'Engineer','1991-12-18','2000-12-17'),
725
+ (10494,'Senior Engineer','2000-12-17','9999-01-01'),
726
+ (10495,'Technique Leader','1989-09-24','9999-01-01'),
727
+ (10496,'Staff','1995-08-29','1999-01-26'),
728
+ (10497,'Engineer','1992-01-22','1999-01-22'),
729
+ (10497,'Senior Engineer','1999-01-22','9999-01-01'),
730
+ (10498,'Engineer','1994-03-09','9999-01-01'),
731
+ (10499,'Senior Staff','2001-07-31','9999-01-01'),
732
+ (10499,'Staff','1996-07-31','2001-07-31'),
733
+ (10500,'Engineer','1996-12-16','9999-01-01'),
734
+ (10501,'Engineer','1988-09-08','1995-09-09'),
735
+ (10501,'Senior Engineer','1995-09-09','9999-01-01'),
736
+ (10502,'Technique Leader','1993-03-04','9999-01-01'),
737
+ (10503,'Engineer','1997-03-13','9999-01-01'),
738
+ (10504,'Staff','1999-10-19','9999-01-01'),
739
+ (10505,'Senior Staff','1994-07-23','1998-03-26'),
740
+ (10505,'Staff','1985-07-23','1994-07-23'),
741
+ (10506,'Senior Engineer','1996-12-01','9999-01-01'),
742
+ (10507,'Senior Staff','1999-09-30','9999-01-01'),
743
+ (10507,'Staff','1990-09-30','1999-09-30'),
744
+ (10508,'Engineer','1991-05-01','2000-04-30'),
745
+ (10508,'Senior Engineer','2000-04-30','9999-01-01'),
746
+ (10509,'Senior Staff','1997-10-06','9999-01-01'),
747
+ (10509,'Staff','1992-10-06','1997-10-06'),
748
+ (10510,'Senior Staff','1997-04-20','9999-01-01'),
749
+ (10510,'Staff','1990-04-20','1997-04-20'),
750
+ (10511,'Assistant Engineer','1992-01-27','2000-01-27'),
751
+ (10511,'Engineer','2000-01-27','9999-01-01'),
752
+ (10512,'Senior Staff','1998-11-28','9999-01-01'),
753
+ (10512,'Staff','1989-11-28','1998-11-28'),
754
+ (10513,'Senior Staff','1997-04-01','9999-01-01'),
755
+ (10513,'Staff','1991-04-02','1997-04-01'),
756
+ (10514,'Staff','1992-04-29','1995-04-02'),
757
+ (10515,'Senior Staff','1997-01-06','1998-07-21'),
758
+ (10515,'Staff','1990-01-06','1997-01-06'),
759
+ (10516,'Engineer','1985-10-19','1994-10-19'),
760
+ (10516,'Senior Engineer','1994-10-19','9999-01-01'),
761
+ (10517,'Senior Staff','1990-12-25','9999-01-01'),
762
+ (10518,'Technique Leader','1993-09-03','9999-01-01'),
763
+ (10519,'Senior Staff','2000-12-05','2001-10-13'),
764
+ (10519,'Staff','1992-12-05','2000-12-05'),
765
+ (10520,'Senior Engineer','1996-09-05','9999-01-01'),
766
+ (10521,'Senior Staff','1997-05-11','9999-01-01'),
767
+ (10521,'Staff','1989-05-11','1997-05-11'),
768
+ (10522,'Senior Staff','1995-12-12','9999-01-01'),
769
+ (10522,'Staff','1986-12-12','1995-12-12'),
770
+ (10523,'Engineer','1989-12-23','1994-12-23'),
771
+ (10523,'Senior Engineer','1994-12-23','9999-01-01'),
772
+ (10524,'Engineer','1985-10-09','1993-10-09'),
773
+ (10524,'Senior Engineer','1993-10-09','9999-01-01'),
774
+ (10525,'Senior Staff','1990-07-08','1995-12-20'),
775
+ (10526,'Engineer','1988-02-27','1997-02-26'),
776
+ (10526,'Senior Engineer','1997-02-26','9999-01-01'),
777
+ (10527,'Technique Leader','1996-01-25','9999-01-01'),
778
+ (10528,'Senior Engineer','1993-10-28','9999-01-01'),
779
+ (10529,'Assistant Engineer','1997-07-04','9999-01-01'),
780
+ (10530,'Engineer','1987-09-23','1994-09-23'),
781
+ (10530,'Senior Engineer','1994-09-23','9999-01-01'),
782
+ (10531,'Staff','1995-03-16','9999-01-01'),
783
+ (10532,'Senior Staff','1993-05-18','9999-01-01'),
784
+ (10532,'Staff','1986-05-18','1993-05-18'),
785
+ (10533,'Senior Staff','1996-08-16','9999-01-01'),
786
+ (10533,'Staff','1990-08-17','1996-08-16'),
787
+ (10534,'Staff','1998-01-26','2001-03-03'),
788
+ (10535,'Senior Staff','1996-08-21','9999-01-01'),
789
+ (10535,'Staff','1991-08-22','1996-08-21'),
790
+ (10536,'Senior Staff','1997-10-07','9999-01-01'),
791
+ (10536,'Staff','1988-10-07','1997-10-07'),
792
+ (10537,'Senior Staff','1996-09-25','9999-01-01'),
793
+ (10538,'Senior Engineer','1987-07-23','1998-12-13'),
794
+ (10539,'Senior Staff','1990-06-05','9999-01-01'),
795
+ (10540,'Engineer','1994-05-03','2002-05-03'),
796
+ (10540,'Senior Engineer','2002-05-03','9999-01-01'),
797
+ (10541,'Staff','1986-02-28','1986-10-01'),
798
+ (10542,'Senior Engineer','1992-02-07','9999-01-01'),
799
+ (10543,'Staff','1998-11-24','9999-01-01'),
800
+ (10544,'Senior Staff','1995-04-29','9999-01-01'),
801
+ (10545,'Engineer','1990-06-30','1996-06-29'),
802
+ (10545,'Senior Engineer','1996-06-29','9999-01-01'),
803
+ (10546,'Senior Staff','1998-04-14','9999-01-01'),
804
+ (10546,'Staff','1991-04-14','1998-04-14'),
805
+ (10547,'Technique Leader','1988-02-14','1989-06-19'),
806
+ (10548,'Senior Staff','1993-07-04','9999-01-01'),
807
+ (10548,'Staff','1986-07-04','1993-07-04'),
808
+ (10549,'Engineer','1996-10-11','2001-10-11'),
809
+ (10549,'Senior Engineer','2001-10-11','9999-01-01'),
810
+ (10550,'Engineer','1985-02-03','1994-02-03'),
811
+ (10550,'Senior Engineer','1994-02-03','9999-01-01'),
812
+ (10551,'Engineer','1988-08-06','1995-08-07'),
813
+ (10551,'Senior Engineer','1995-08-07','9999-01-01'),
814
+ (10552,'Senior Engineer','1998-08-31','9999-01-01'),
815
+ (10553,'Engineer','1990-07-22','1996-07-21'),
816
+ (10553,'Senior Engineer','1996-07-21','9999-01-01'),
817
+ (10554,'Engineer','1990-11-28','1995-11-28'),
818
+ (10554,'Senior Engineer','1995-11-28','9999-01-01'),
819
+ (10555,'Staff','1992-05-22','1993-01-19'),
820
+ (10556,'Senior Staff','1997-04-15','9999-01-01'),
821
+ (10556,'Staff','1992-04-15','1997-04-15'),
822
+ (10557,'Engineer','1992-09-18','2001-09-18'),
823
+ (10557,'Senior Engineer','2001-09-18','9999-01-01'),
824
+ (10558,'Senior Engineer','1992-04-22','9999-01-01'),
825
+ (10559,'Staff','1999-04-05','9999-01-01'),
826
+ (10560,'Engineer','1996-09-03','9999-01-01'),
827
+ (10561,'Senior Staff','1997-06-30','9999-01-01'),
828
+ (10562,'Engineer','1997-07-24','2002-07-24'),
829
+ (10562,'Senior Engineer','2002-07-24','9999-01-01'),
830
+ (10563,'Engineer','1992-09-29','1999-09-30'),
831
+ (10563,'Senior Engineer','1999-09-30','2002-01-01'),
832
+ (10564,'Engineer','1995-11-23','2000-11-22'),
833
+ (10564,'Senior Engineer','2000-11-22','9999-01-01'),
834
+ (10565,'Senior Engineer','1996-08-05','9999-01-01'),
835
+ (10566,'Engineer','1990-08-23','1997-10-26'),
836
+ (10567,'Senior Staff','1997-10-18','9999-01-01'),
837
+ (10567,'Staff','1992-10-18','1997-10-18'),
838
+ (10568,'Staff','1995-07-08','9999-01-01'),
839
+ (10569,'Senior Staff','1996-03-12','9999-01-01'),
840
+ (10569,'Staff','1987-03-13','1996-03-12'),
841
+ (10570,'Senior Staff','1995-06-16','2000-03-25'),
842
+ (10570,'Staff','1986-06-16','1995-06-16'),
843
+ (10571,'Assistant Engineer','1985-02-24','1991-02-24'),
844
+ (10571,'Engineer','1991-02-24','1997-02-23'),
845
+ (10571,'Senior Engineer','1997-02-23','9999-01-01'),
846
+ (10572,'Engineer','1988-02-16','1994-02-15'),
847
+ (10572,'Senior Engineer','1994-02-15','9999-01-01'),
848
+ (10573,'Staff','1999-08-20','9999-01-01'),
849
+ (10574,'Senior Staff','1999-11-15','9999-01-01'),
850
+ (10575,'Senior Engineer','1988-10-04','2000-11-22'),
851
+ (10576,'Senior Staff','1991-01-03','9999-01-01'),
852
+ (10577,'Senior Staff','2002-07-02','9999-01-01'),
853
+ (10577,'Staff','1993-07-02','2002-07-02'),
854
+ (10578,'Senior Engineer','1989-11-24','9999-01-01'),
855
+ (10579,'Senior Engineer','1991-06-02','9999-01-01'),
856
+ (10580,'Senior Staff','1997-03-01','9999-01-01'),
857
+ (10580,'Staff','1991-03-02','1997-03-01'),
858
+ (10581,'Engineer','1994-04-13','1999-04-13'),
859
+ (10581,'Senior Engineer','1999-04-13','9999-01-01'),
860
+ (10582,'Assistant Engineer','1995-11-06','9999-01-01'),
861
+ (10583,'Engineer','1985-02-14','1990-02-14'),
862
+ (10583,'Senior Engineer','1990-02-14','1998-05-29'),
863
+ (10584,'Engineer','1986-02-17','1993-02-17'),
864
+ (10584,'Senior Engineer','1993-02-17','9999-01-01'),
865
+ (10585,'Senior Engineer','1991-01-09','9999-01-01'),
866
+ (10586,'Engineer','1992-02-04','2000-02-04'),
867
+ (10586,'Senior Engineer','2000-02-04','9999-01-01'),
868
+ (10587,'Engineer','1991-11-20','1999-11-20'),
869
+ (10587,'Senior Engineer','1999-11-20','9999-01-01'),
870
+ (10588,'Engineer','1988-07-25','1993-07-25'),
871
+ (10588,'Senior Engineer','1993-07-25','9999-01-01'),
872
+ (10589,'Senior Staff','2002-01-26','9999-01-01'),
873
+ (10589,'Staff','1994-01-26','2002-01-26'),
874
+ (10590,'Senior Staff','1995-04-09','9999-01-01'),
875
+ (10590,'Staff','1986-04-09','1995-04-09'),
876
+ (10591,'Staff','1987-06-18','1988-09-20'),
877
+ (10592,'Staff','1993-09-27','9999-01-01'),
878
+ (10593,'Engineer','1990-09-12','1999-09-12'),
879
+ (10593,'Senior Engineer','1999-09-12','9999-01-01'),
880
+ (10594,'Engineer','1988-04-02','1996-04-02'),
881
+ (10594,'Senior Engineer','1996-04-02','9999-01-01'),
882
+ (10595,'Senior Engineer','1989-11-24','9999-01-01'),
883
+ (10596,'Senior Staff','2001-05-23','9999-01-01'),
884
+ (10596,'Staff','1996-05-23','2001-05-23'),
885
+ (10597,'Senior Staff','1995-04-01','9999-01-01'),
886
+ (10597,'Staff','1990-04-01','1995-04-01'),
887
+ (10598,'Senior Engineer','1998-06-22','2000-09-27'),
888
+ (10599,'Technique Leader','1991-11-17','9999-01-01'),
889
+ (10600,'Senior Staff','1997-04-27','9999-01-01'),
890
+ (10600,'Staff','1992-04-27','1997-04-27'),
891
+ (10601,'Staff','1999-07-24','2002-05-09'),
892
+ (10602,'Staff','1989-04-23','1993-11-06'),
893
+ (10603,'Staff','1995-07-20','9999-01-01'),
894
+ (10604,'Engineer','1990-04-07','1997-04-07'),
895
+ (10604,'Senior Engineer','1997-04-07','9999-01-01'),
896
+ (10605,'Engineer','1993-07-01','1998-07-01'),
897
+ (10605,'Senior Engineer','1998-07-01','9999-01-01'),
898
+ (10606,'Engineer','1987-05-02','1992-05-01'),
899
+ (10606,'Senior Engineer','1992-05-01','9999-01-01'),
900
+ (10607,'Engineer','1996-01-13','9999-01-01'),
901
+ (10608,'Senior Engineer','1986-05-25','1991-06-02'),
902
+ (10609,'Assistant Engineer','1994-12-03','1999-12-03'),
903
+ (10609,'Engineer','1999-12-03','9999-01-01'),
904
+ (10610,'Engineer','1997-03-30','9999-01-01'),
905
+ (10611,'Senior Engineer','1989-09-16','9999-01-01'),
906
+ (10612,'Assistant Engineer','1991-09-02','1996-09-01'),
907
+ (10612,'Engineer','1996-09-01','2001-09-01'),
908
+ (10612,'Senior Engineer','2001-09-01','9999-01-01'),
909
+ (10613,'Staff','1997-10-13','9999-01-01'),
910
+ (10614,'Engineer','1990-03-03','1998-03-03'),
911
+ (10614,'Senior Engineer','1998-03-03','9999-01-01'),
912
+ (10615,'Senior Staff','2002-03-10','9999-01-01'),
913
+ (10615,'Staff','1996-03-10','2002-03-10'),
914
+ (10616,'Staff','1996-11-07','9999-01-01'),
915
+ (10617,'Senior Staff','1991-10-30','2001-10-03'),
916
+ (10618,'Engineer','1994-10-07','9999-01-01'),
917
+ (10619,'Senior Staff','1993-04-09','9999-01-01'),
918
+ (10620,'Assistant Engineer','1990-11-10','1999-11-10'),
919
+ (10620,'Engineer','1999-11-10','9999-01-01'),
920
+ (10621,'Engineer','1992-02-10','1999-02-10'),
921
+ (10621,'Senior Engineer','1999-02-10','9999-01-01'),
922
+ (10622,'Engineer','1989-05-15','1996-05-15'),
923
+ (10622,'Senior Engineer','1996-05-15','9999-01-01'),
924
+ (10623,'Engineer','1992-01-15','1999-01-15'),
925
+ (10623,'Senior Engineer','1999-01-15','9999-01-01'),
926
+ (10624,'Technique Leader','1990-05-07','9999-01-01'),
927
+ (10625,'Engineer','1986-07-15','1991-07-15'),
928
+ (10625,'Senior Engineer','1991-07-15','1995-01-13'),
929
+ (10626,'Staff','1996-12-03','9999-01-01'),
930
+ (10627,'Senior Staff','2001-03-12','9999-01-01'),
931
+ (10627,'Staff','1995-03-13','2001-03-12'),
932
+ (10628,'Assistant Engineer','1987-03-14','1994-03-14'),
933
+ (10628,'Engineer','1994-03-14','2001-03-14'),
934
+ (10628,'Senior Engineer','2001-03-14','9999-01-01'),
935
+ (10629,'Staff','1999-10-20','2001-12-07'),
936
+ (10630,'Engineer','1997-01-13','9999-01-01'),
937
+ (10631,'Engineer','1994-10-18','9999-01-01'),
938
+ (10632,'Technique Leader','1985-07-25','1987-11-20'),
939
+ (10633,'Staff','1997-05-16','9999-01-01'),
940
+ (10634,'Assistant Engineer','1990-11-11','1995-11-11'),
941
+ (10634,'Engineer','1995-11-11','2000-11-10'),
942
+ (10634,'Senior Engineer','2000-11-10','9999-01-01'),
943
+ (10635,'Senior Engineer','1991-09-22','1999-12-20'),
944
+ (10636,'Staff','1996-09-25','9999-01-01'),
945
+ (10637,'Senior Staff','1998-07-11','2000-01-19'),
946
+ (10637,'Staff','1993-07-11','1998-07-11'),
947
+ (10638,'Senior Staff','2000-11-09','9999-01-01'),
948
+ (10638,'Staff','1994-11-10','2000-11-09'),
949
+ (10639,'Engineer','1992-10-25','1999-10-26'),
950
+ (10639,'Senior Engineer','1999-10-26','9999-01-01'),
951
+ (10640,'Senior Staff','1992-12-04','9999-01-01'),
952
+ (10641,'Assistant Engineer','1993-03-21','1999-03-21'),
953
+ (10641,'Engineer','1999-03-21','9999-01-01'),
954
+ (10642,'Engineer','1998-10-05','9999-01-01'),
955
+ (10643,'Engineer','1987-11-11','1994-11-11'),
956
+ (10643,'Senior Engineer','1994-11-11','9999-01-01'),
957
+ (10644,'Senior Staff','1994-05-29','1995-08-25'),
958
+ (10644,'Staff','1985-05-29','1994-05-29'),
959
+ (10645,'Engineer','1988-03-01','1995-03-02'),
960
+ (10645,'Senior Engineer','1995-03-02','9999-01-01'),
961
+ (10646,'Senior Staff','2002-01-30','9999-01-01'),
962
+ (10646,'Staff','1996-01-31','2002-01-30'),
963
+ (10647,'Assistant Engineer','1997-09-03','9999-01-01'),
964
+ (10648,'Engineer','1988-02-16','1993-02-15'),
965
+ (10648,'Senior Engineer','1993-02-15','9999-01-01'),
966
+ (10649,'Senior Staff','1998-06-23','9999-01-01'),
967
+ (10650,'Assistant Engineer','1992-10-04','2000-10-04'),
968
+ (10650,'Engineer','2000-10-04','9999-01-01'),
969
+ (10651,'Senior Staff','2002-01-07','9999-01-01'),
970
+ (10651,'Staff','1996-01-08','2002-01-07'),
971
+ (10652,'Staff','1990-02-12','1992-01-13'),
972
+ (10653,'Senior Engineer','1987-04-30','9999-01-01'),
973
+ (10654,'Engineer','1990-03-25','1999-03-25'),
974
+ (10654,'Senior Engineer','1999-03-25','9999-01-01'),
975
+ (10655,'Senior Staff','1997-07-04','9999-01-01'),
976
+ (10656,'Engineer','1988-06-21','1993-06-21'),
977
+ (10656,'Senior Engineer','1993-06-21','9999-01-01'),
978
+ (10657,'Senior Staff','1999-03-27','9999-01-01'),
979
+ (10657,'Staff','1992-03-26','1999-03-27'),
980
+ (10658,'Senior Staff','1994-04-29','9999-01-01'),
981
+ (10659,'Engineer','1995-06-01','2000-05-31'),
982
+ (10659,'Senior Engineer','2000-05-31','9999-01-01'),
983
+ (10660,'Senior Engineer','1988-08-12','1991-07-12'),
984
+ (10661,'Senior Staff','1993-01-11','9999-01-01'),
985
+ (10661,'Staff','1988-01-12','1993-01-11'),
986
+ (10662,'Engineer','1999-12-17','9999-01-01'),
987
+ (10663,'Technique Leader','1993-01-23','9999-01-01'),
988
+ (10664,'Engineer','1989-12-24','1998-12-24'),
989
+ (10664,'Senior Engineer','1998-12-24','9999-01-01'),
990
+ (10665,'Engineer','1988-01-23','1995-01-23'),
991
+ (10665,'Senior Engineer','1995-01-23','2000-07-13'),
992
+ (10666,'Senior Staff','1998-05-20','9999-01-01'),
993
+ (10666,'Staff','1989-05-20','1998-05-20'),
994
+ (10667,'Senior Staff','1999-07-28','9999-01-01'),
995
+ (10668,'Staff','1997-11-28','1999-09-03'),
996
+ (10669,'Senior Staff','2001-11-17','9999-01-01'),
997
+ (10669,'Staff','1996-11-17','2001-11-17'),
998
+ (10670,'Senior Staff','1993-03-23','9999-01-01'),
999
+ (10670,'Staff','1988-03-23','1993-03-23'),
1000
+ (10671,'Senior Staff','2001-09-13','9999-01-01'),
1001
+ (10671,'Staff','1995-09-14','2001-09-13'),
1002
+ (10672,'Senior Engineer','1991-09-29','1996-04-19'),
1003
+ (10673,'Engineer','1994-07-29','1998-01-14'),
1004
+ (10674,'Engineer','1999-03-17','9999-01-01'),
1005
+ (10675,'Senior Staff','1993-02-02','9999-01-01'),
1006
+ (10676,'Engineer','1999-09-04','9999-01-01'),
1007
+ (10677,'Engineer','1999-10-13','9999-01-01'),
1008
+ (10678,'Engineer','1987-08-02','1995-08-02'),
1009
+ (10678,'Senior Engineer','1995-08-02','9999-01-01'),
1010
+ (10679,'Senior Staff','1997-05-13','9999-01-01'),
1011
+ (10679,'Staff','1990-05-13','1997-05-13'),
1012
+ (10680,'Senior Engineer','1992-11-21','1998-12-08'),
1013
+ (10681,'Staff','1995-10-02','9999-01-01'),
1014
+ (10682,'Senior Staff','1990-11-09','9999-01-01'),
1015
+ (10683,'Senior Engineer','1997-06-23','9999-01-01'),
1016
+ (10684,'Engineer','1999-10-28','9999-01-01'),
1017
+ (10685,'Senior Staff','1995-12-27','1996-10-20'),
1018
+ (10686,'Senior Engineer','1987-05-17','9999-01-01'),
1019
+ (10687,'Senior Staff','1999-03-13','9999-01-01'),
1020
+ (10687,'Staff','1990-03-13','1999-03-13'),
1021
+ (10688,'Senior Staff','1986-04-13','9999-01-01'),
1022
+ (10689,'Senior Staff','1993-08-05','9999-01-01'),
1023
+ (10689,'Staff','1988-08-05','1993-08-05'),
1024
+ (10690,'Engineer','1989-08-22','1994-08-22'),
1025
+ (10690,'Senior Engineer','1994-08-22','9999-01-01'),
1026
+ (10691,'Technique Leader','1989-09-17','9999-01-01'),
1027
+ (10692,'Senior Staff','2000-03-22','9999-01-01'),
1028
+ (10692,'Staff','1993-03-22','2000-03-22'),
1029
+ (10693,'Senior Staff','1991-01-08','9999-01-01'),
1030
+ (10693,'Staff','1986-01-08','1991-01-08'),
1031
+ (10694,'Senior Staff','1993-01-25','2001-07-11'),
1032
+ (10694,'Staff','1988-01-26','1993-01-25'),
1033
+ (10695,'Engineer','1998-05-19','9999-01-01'),
1034
+ (10696,'Technique Leader','1991-09-09','9999-01-01'),
1035
+ (10697,'Staff','1999-08-29','9999-01-01'),
1036
+ (10698,'Senior Engineer','1994-12-08','9999-01-01'),
1037
+ (10699,'Engineer','1985-11-17','1993-11-17'),
1038
+ (10699,'Senior Engineer','1993-11-17','9999-01-01'),
1039
+ (10700,'Engineer','1998-04-14','2002-06-27'),
1040
+ (10701,'Senior Staff','1994-10-27','9999-01-01'),
1041
+ (10701,'Staff','1986-10-27','1994-10-27'),
1042
+ (10702,'Senior Engineer','1991-01-14','9999-01-01'),
1043
+ (10703,'Engineer','1996-05-12','2002-05-12'),
1044
+ (10703,'Senior Engineer','2002-05-12','9999-01-01'),
1045
+ (10704,'Senior Staff','2001-02-16','9999-01-01'),
1046
+ (10704,'Staff','1995-02-17','2001-02-16'),
1047
+ (10705,'Senior Staff','1996-07-17','9999-01-01'),
1048
+ (10705,'Staff','1990-07-18','1996-07-17'),
1049
+ (10706,'Technique Leader','1994-05-03','2001-04-08'),
1050
+ (10707,'Engineer','1990-12-24','1997-12-24'),
1051
+ (10707,'Senior Engineer','1997-12-24','9999-01-01'),
1052
+ (10708,'Staff','1999-11-09','9999-01-01'),
1053
+ (10709,'Engineer','1986-02-02','1992-02-02'),
1054
+ (10709,'Senior Engineer','1992-02-02','9999-01-01'),
1055
+ (10710,'Senior Staff','2000-07-08','9999-01-01'),
1056
+ (10710,'Staff','1995-07-09','2000-07-08'),
1057
+ (10711,'Engineer','1991-06-21','1996-06-20'),
1058
+ (10711,'Senior Engineer','1996-06-20','9999-01-01'),
1059
+ (10712,'Engineer','1994-08-18','2001-08-18'),
1060
+ (10712,'Senior Engineer','2001-08-18','9999-01-01'),
1061
+ (10713,'Senior Staff','1986-04-26','2001-02-21'),
1062
+ (10714,'Engineer','1999-11-24','9999-01-01'),
1063
+ (10715,'Engineer','1999-10-28','9999-01-01'),
1064
+ (10716,'Engineer','1987-08-12','1993-08-11'),
1065
+ (10716,'Senior Engineer','1993-08-11','9999-01-01'),
1066
+ (10717,'Senior Staff','1996-09-12','9999-01-01'),
1067
+ (10717,'Staff','1991-09-13','1996-09-12'),
1068
+ (10718,'Engineer','1988-07-21','1997-07-21'),
1069
+ (10718,'Senior Engineer','1997-07-21','9999-01-01'),
1070
+ (10719,'Assistant Engineer','1995-09-05','1999-07-31'),
1071
+ (10720,'Senior Staff','1996-06-26','9999-01-01'),
1072
+ (10721,'Staff','1999-07-15','9999-01-01'),
1073
+ (10722,'Senior Staff','1994-01-17','2000-04-14'),
1074
+ (10722,'Staff','1989-01-17','1994-01-17'),
1075
+ (10723,'Technique Leader','1997-07-14','9999-01-01'),
1076
+ (10724,'Engineer','1995-12-07','2001-12-06'),
1077
+ (10724,'Senior Engineer','2001-12-06','9999-01-01'),
1078
+ (10725,'Senior Staff','1990-09-08','9999-01-01'),
1079
+ (10726,'Engineer','1992-02-25','2001-02-24'),
1080
+ (10726,'Senior Engineer','2001-02-24','9999-01-01'),
1081
+ (10727,'Senior Staff','1998-01-08','2000-06-06'),
1082
+ (10727,'Staff','1991-01-08','1998-01-08'),
1083
+ (10728,'Engineer','1989-12-09','1998-12-09'),
1084
+ (10728,'Senior Engineer','1998-12-09','9999-01-01'),
1085
+ (10729,'Senior Engineer','1986-04-20','9999-01-01'),
1086
+ (10730,'Senior Engineer','1996-05-14','1998-06-07'),
1087
+ (10731,'Senior Staff','1994-02-20','2000-10-09'),
1088
+ (10731,'Staff','1987-02-20','1994-02-20'),
1089
+ (10732,'Senior Engineer','1994-12-21','9999-01-01'),
1090
+ (10733,'Senior Staff','2002-02-19','9999-01-01'),
1091
+ (10733,'Staff','1996-02-20','2002-02-19'),
1092
+ (10734,'Engineer','1995-12-19','9999-01-01'),
1093
+ (10735,'Senior Staff','1993-10-29','9999-01-01'),
1094
+ (10735,'Staff','1985-10-29','1993-10-29'),
1095
+ (10736,'Senior Engineer','1991-09-26','9999-01-01'),
1096
+ (10737,'Engineer','1999-06-22','9999-01-01'),
1097
+ (10738,'Technique Leader','1991-04-30','9999-01-01'),
1098
+ (10739,'Assistant Engineer','1985-03-30','1994-03-30'),
1099
+ (10739,'Engineer','1994-03-30','9999-01-01'),
1100
+ (10740,'Engineer','1996-04-30','2002-03-17'),
1101
+ (10741,'Senior Staff','1997-01-06','9999-01-01'),
1102
+ (10741,'Staff','1989-01-06','1997-01-06'),
1103
+ (10742,'Technique Leader','1997-04-03','9999-01-01'),
1104
+ (10743,'Staff','1999-11-05','9999-01-01'),
1105
+ (10744,'Staff','1985-12-29','1992-06-03'),
1106
+ (10745,'Engineer','1988-01-23','1997-01-22'),
1107
+ (10745,'Senior Engineer','1997-01-22','9999-01-01'),
1108
+ (10746,'Technique Leader','1990-08-31','9999-01-01'),
1109
+ (10747,'Senior Engineer','1990-10-08','1999-09-20'),
1110
+ (10748,'Senior Staff','1996-08-13','9999-01-01'),
1111
+ (10748,'Staff','1990-08-14','1996-08-13'),
1112
+ (10749,'Engineer','1985-09-26','1990-09-26'),
1113
+ (10749,'Senior Engineer','1990-09-26','9999-01-01'),
1114
+ (10750,'Technique Leader','1998-11-06','9999-01-01'),
1115
+ (10751,'Engineer','1999-12-14','2000-12-05'),
1116
+ (10752,'Senior Engineer','1993-05-28','9999-01-01'),
1117
+ (10753,'Engineer','1985-05-17','1993-05-17'),
1118
+ (10753,'Senior Engineer','1993-05-17','1999-08-25'),
1119
+ (10754,'Senior Staff','1988-01-11','9999-01-01'),
1120
+ (10755,'Assistant Engineer','1995-04-01','2001-11-13'),
1121
+ (10756,'Senior Engineer','1997-10-07','9999-01-01'),
1122
+ (10757,'Engineer','1986-01-06','1991-10-18'),
1123
+ (10758,'Engineer','1999-07-01','9999-01-01'),
1124
+ (10759,'Technique Leader','1991-12-04','9999-01-01'),
1125
+ (10760,'Senior Staff','1997-08-22','9999-01-01'),
1126
+ (10761,'Staff','1992-05-30','1999-01-04'),
1127
+ (10762,'Senior Staff','1999-01-21','9999-01-01'),
1128
+ (10762,'Staff','1992-01-21','1999-01-21'),
1129
+ (10763,'Engineer','1987-02-23','1993-02-22'),
1130
+ (10763,'Senior Engineer','1993-02-22','9999-01-01'),
1131
+ (10764,'Engineer','1989-11-27','1998-11-27'),
1132
+ (10764,'Senior Engineer','1998-11-27','9999-01-01'),
1133
+ (10765,'Staff','1994-05-07','1994-05-11'),
1134
+ (10766,'Staff','1999-09-18','9999-01-01'),
1135
+ (10767,'Staff','1997-07-15','9999-01-01'),
1136
+ (10768,'Engineer','1985-07-04','1990-07-04'),
1137
+ (10768,'Senior Engineer','1990-07-04','9999-01-01'),
1138
+ (10769,'Technique Leader','1991-08-30','9999-01-01'),
1139
+ (10770,'Senior Staff','1987-12-25','1989-02-27'),
1140
+ (10771,'Senior Staff','1996-04-01','9999-01-01'),
1141
+ (10772,'Senior Engineer','1990-02-22','9999-01-01'),
1142
+ (10773,'Staff','1997-02-09','1997-11-29'),
1143
+ (10774,'Engineer','1990-01-26','1995-01-26'),
1144
+ (10774,'Senior Engineer','1995-01-26','9999-01-01'),
1145
+ (10775,'Engineer','1994-12-30','1999-12-30'),
1146
+ (10775,'Senior Engineer','1999-12-30','9999-01-01'),
1147
+ (10776,'Technique Leader','1986-03-16','9999-01-01'),
1148
+ (10777,'Engineer','1990-03-17','1996-03-16'),
1149
+ (10777,'Senior Engineer','1996-03-16','2001-03-27'),
1150
+ (10778,'Senior Staff','1986-07-04','9999-01-01'),
1151
+ (10779,'Senior Staff','1993-01-10','9999-01-01'),
1152
+ (10779,'Staff','1988-01-11','1993-01-10'),
1153
+ (10780,'Engineer','1994-08-01','1996-08-18'),
1154
+ (10781,'Senior Staff','1997-02-03','9999-01-01'),
1155
+ (10781,'Staff','1991-02-04','1997-02-03'),
1156
+ (10782,'Staff','1997-07-06','2002-03-30'),
1157
+ (10783,'Senior Staff','1999-05-15','9999-01-01'),
1158
+ (10783,'Staff','1994-05-15','1999-05-15'),
1159
+ (10784,'Assistant Engineer','1998-10-14','9999-01-01'),
1160
+ (10785,'Engineer','1994-11-11','2001-11-11'),
1161
+ (10785,'Senior Engineer','2001-11-11','9999-01-01'),
1162
+ (10786,'Senior Engineer','1997-06-06','9999-01-01'),
1163
+ (10787,'Senior Staff','2000-07-18','2002-07-27'),
1164
+ (10787,'Staff','1991-07-19','2000-07-18'),
1165
+ (10788,'Staff','1998-05-29','9999-01-01'),
1166
+ (10789,'Staff','1998-01-26','9999-01-01'),
1167
+ (10790,'Engineer','1999-03-02','9999-01-01'),
1168
+ (10791,'Engineer','1988-07-30','1995-07-31'),
1169
+ (10791,'Senior Engineer','1995-07-31','9999-01-01'),
1170
+ (10792,'Engineer','1985-08-10','1992-08-10'),
1171
+ (10792,'Senior Engineer','1992-08-10','1993-12-20'),
1172
+ (10793,'Senior Engineer','1990-09-18','9999-01-01'),
1173
+ (10794,'Senior Staff','2000-05-23','9999-01-01'),
1174
+ (10794,'Staff','1994-05-24','2000-05-23'),
1175
+ (10795,'Senior Staff','1999-05-03','9999-01-01'),
1176
+ (10795,'Staff','1993-05-03','1999-05-03'),
1177
+ (10796,'Technique Leader','1990-11-08','9999-01-01'),
1178
+ (10797,'Assistant Engineer','1988-08-21','1997-08-21'),
1179
+ (10797,'Engineer','1997-08-21','9999-01-01'),
1180
+ (10798,'Engineer','1996-09-21','2001-09-21'),
1181
+ (10798,'Senior Engineer','2001-09-21','9999-01-01'),
1182
+ (10799,'Engineer','1989-03-01','1995-03-01'),
1183
+ (10799,'Senior Engineer','1995-03-01','9999-01-01'),
1184
+ (10800,'Engineer','1993-05-20','1998-05-20'),
1185
+ (10800,'Senior Engineer','1998-05-20','9999-01-01'),
1186
+ (10801,'Engineer','1998-04-07','2001-01-15'),
1187
+ (10802,'Engineer','1985-08-24','1990-08-24'),
1188
+ (10802,'Senior Engineer','1990-08-24','9999-01-01'),
1189
+ (10803,'Engineer','1988-04-20','1997-04-20'),
1190
+ (10803,'Senior Engineer','1997-04-20','2002-04-02'),
1191
+ (10804,'Staff','1997-06-09','9999-01-01'),
1192
+ (10805,'Senior Staff','1996-05-25','9999-01-01'),
1193
+ (10805,'Staff','1987-05-26','1996-05-25'),
1194
+ (10806,'Senior Staff','2000-04-25','9999-01-01'),
1195
+ (10806,'Staff','1993-04-25','2000-04-25'),
1196
+ (10807,'Senior Staff','1999-10-19','9999-01-01'),
1197
+ (10808,'Senior Engineer','1987-03-07','9999-01-01'),
1198
+ (10809,'Engineer','1988-02-25','1994-02-24'),
1199
+ (10809,'Senior Engineer','1994-02-24','9999-01-01'),
1200
+ (10810,'Senior Staff','2000-09-06','9999-01-01'),
1201
+ (10810,'Staff','1994-09-07','2000-09-06'),
1202
+ (10811,'Engineer','1997-07-08','9999-01-01'),
1203
+ (10812,'Engineer','1996-09-20','1997-10-06'),
1204
+ (10813,'Senior Staff','1990-04-27','9999-01-01'),
1205
+ (10814,'Senior Staff','1998-07-17','9999-01-01'),
1206
+ (10814,'Staff','1993-07-17','1998-07-17'),
1207
+ (10815,'Senior Staff','2002-04-19','9999-01-01'),
1208
+ (10815,'Staff','1994-04-19','2002-04-19'),
1209
+ (10816,'Senior Staff','1991-05-22','9999-01-01'),
1210
+ (10817,'Senior Staff','1998-12-26','9999-01-01'),
1211
+ (10817,'Staff','1990-12-26','1998-12-26'),
1212
+ (10818,'Staff','1998-04-09','9999-01-01'),
1213
+ (10819,'Engineer','1986-08-02','1993-08-02'),
1214
+ (10819,'Senior Engineer','1993-08-02','1999-12-28'),
1215
+ (10820,'Senior Staff','1992-06-26','9999-01-01'),
1216
+ (10821,'Engineer','1988-10-06','1990-04-17'),
1217
+ (10822,'Engineer','1986-01-11','1992-01-11'),
1218
+ (10822,'Senior Engineer','1992-01-11','9999-01-01'),
1219
+ (10823,'Staff','1999-08-19','9999-01-01'),
1220
+ (10824,'Staff','1995-08-01','9999-01-01'),
1221
+ (10825,'Engineer','1993-12-04','1998-12-04'),
1222
+ (10825,'Senior Engineer','1998-12-04','9999-01-01'),
1223
+ (10826,'Senior Engineer','1993-01-22','9999-01-01'),
1224
+ (10827,'Staff','1996-11-07','9999-01-01'),
1225
+ (10828,'Staff','1986-02-14','1990-03-30'),
1226
+ (10829,'Staff','1993-07-21','1993-11-29'),
1227
+ (10830,'Senior Staff','1997-08-23','9999-01-01'),
1228
+ (10830,'Staff','1991-08-24','1997-08-23'),
1229
+ (10831,'Technique Leader','1998-02-22','9999-01-01'),
1230
+ (10832,'Senior Staff','1992-10-10','9999-01-01'),
1231
+ (10832,'Staff','1986-10-11','1992-10-10'),
1232
+ (10833,'Technique Leader','1998-12-23','9999-01-01'),
1233
+ (10834,'Assistant Engineer','1990-11-24','1999-11-24'),
1234
+ (10834,'Engineer','1999-11-24','9999-01-01'),
1235
+ (10835,'Engineer','1995-08-22','9999-01-01'),
1236
+ (10836,'Senior Staff','1987-08-10','9999-01-01'),
1237
+ (10837,'Senior Staff','1993-01-14','2002-02-22'),
1238
+ (10837,'Staff','1986-01-14','1993-01-14'),
1239
+ (10838,'Engineer','1994-04-26','2001-04-26'),
1240
+ (10838,'Senior Engineer','2001-04-26','9999-01-01'),
1241
+ (10839,'Assistant Engineer','1996-12-30','9999-01-01'),
1242
+ (10840,'Engineer','1993-06-04','1998-06-04'),
1243
+ (10840,'Senior Engineer','1998-06-04','9999-01-01'),
1244
+ (10841,'Senior Staff','1997-01-21','9999-01-01'),
1245
+ (10841,'Staff','1992-01-22','1997-01-21'),
1246
+ (10842,'Engineer','1986-07-14','1991-07-14'),
1247
+ (10842,'Senior Engineer','1991-07-14','1998-06-27'),
1248
+ (10843,'Engineer','1990-04-26','1998-04-26'),
1249
+ (10843,'Senior Engineer','1998-04-26','9999-01-01'),
1250
+ (10844,'Engineer','1997-04-25','9999-01-01'),
1251
+ (10845,'Engineer','1997-01-25','2002-01-25'),
1252
+ (10845,'Senior Engineer','2002-01-25','9999-01-01'),
1253
+ (10846,'Senior Engineer','1995-01-17','9999-01-01'),
1254
+ (10847,'Senior Staff','1992-07-24','9999-01-01'),
1255
+ (10847,'Staff','1986-07-25','1992-07-24'),
1256
+ (10848,'Engineer','1985-04-20','1992-04-20'),
1257
+ (10848,'Senior Engineer','1992-04-20','9999-01-01'),
1258
+ (10849,'Assistant Engineer','1995-06-25','2001-06-24'),
1259
+ (10849,'Engineer','2001-06-24','9999-01-01'),
1260
+ (10850,'Staff','1990-04-22','1995-05-11'),
1261
+ (10851,'Senior Staff','1999-11-21','9999-01-01'),
1262
+ (10851,'Staff','1994-11-21','1999-11-21'),
1263
+ (10852,'Technique Leader','1999-08-21','9999-01-01'),
1264
+ (10853,'Technique Leader','1993-05-03','9999-01-01'),
1265
+ (10854,'Engineer','1998-07-13','9999-01-01'),
1266
+ (10855,'Senior Staff','1993-03-29','9999-01-01'),
1267
+ (10856,'Staff','1986-12-31','1990-06-18'),
1268
+ (10857,'Senior Staff','1996-04-02','9999-01-01'),
1269
+ (10857,'Staff','1990-04-04','1996-04-02'),
1270
+ (10858,'Engineer','1997-01-01','2002-01-01'),
1271
+ (10858,'Senior Engineer','2002-01-01','9999-01-01'),
1272
+ (10859,'Staff','1996-05-21','9999-01-01'),
1273
+ (10860,'Technique Leader','1998-01-22','9999-01-01'),
1274
+ (10861,'Senior Engineer','1989-06-10','1992-04-12'),
1275
+ (10862,'Senior Staff','1992-07-23','9999-01-01'),
1276
+ (10862,'Staff','1985-07-23','1992-07-23'),
1277
+ (10863,'Engineer','1985-12-25','1991-12-25'),
1278
+ (10863,'Senior Engineer','1991-12-25','9999-01-01'),
1279
+ (10864,'Senior Staff','1992-09-24','9999-01-01'),
1280
+ (10864,'Staff','1986-09-25','1992-09-24'),
1281
+ (10865,'Staff','1993-05-29','1993-09-19'),
1282
+ (10866,'Senior Staff','1995-12-27','9999-01-01'),
1283
+ (10866,'Staff','1990-12-27','1995-12-27'),
1284
+ (10867,'Engineer','1997-03-23','2002-03-22'),
1285
+ (10868,'Engineer','1990-03-20','1999-03-20'),
1286
+ (10868,'Senior Engineer','1999-03-20','9999-01-01'),
1287
+ (10869,'Staff','1997-09-04','1998-10-15'),
1288
+ (10870,'Senior Engineer','1988-01-13','9999-01-01'),
1289
+ (10871,'Staff','1999-06-16','9999-01-01'),
1290
+ (10872,'Senior Staff','1996-09-05','9999-01-01'),
1291
+ (10872,'Staff','1990-09-06','1996-09-05'),
1292
+ (10873,'Staff','1994-03-23','9999-01-01'),
1293
+ (10874,'Engineer','1986-04-22','1992-04-21'),
1294
+ (10874,'Senior Engineer','1992-04-21','9999-01-01'),
1295
+ (10875,'Senior Engineer','1988-05-19','9999-01-01'),
1296
+ (10876,'Staff','1995-01-29','1999-09-14'),
1297
+ (10877,'Senior Staff','1986-06-06','9999-01-01'),
1298
+ (10878,'Staff','1997-04-25','9999-01-01'),
1299
+ (10879,'Senior Engineer','1985-08-15','9999-01-01'),
1300
+ (10880,'Engineer','1992-01-11','1997-01-10'),
1301
+ (10880,'Senior Engineer','1997-01-10','9999-01-01'),
1302
+ (10881,'Engineer','1997-02-18','1998-10-25'),
1303
+ (10882,'Engineer','1999-04-29','9999-01-01'),
1304
+ (10883,'Engineer','1996-12-28','9999-01-01'),
1305
+ (10884,'Engineer','1993-04-15','1998-04-15'),
1306
+ (10884,'Senior Engineer','1998-04-15','9999-01-01'),
1307
+ (10885,'Senior Staff','1991-08-19','9999-01-01'),
1308
+ (10886,'Engineer','1995-03-26','2000-03-25'),
1309
+ (10886,'Senior Engineer','2000-03-25','9999-01-01'),
1310
+ (10887,'Senior Engineer','1989-03-17','9999-01-01'),
1311
+ (10888,'Engineer','1987-06-28','1989-09-11'),
1312
+ (10889,'Senior Staff','1987-08-11','9999-01-01'),
1313
+ (10890,'Senior Staff','1990-03-10','9999-01-01'),
1314
+ (10891,'Assistant Engineer','1995-10-06','2001-10-05'),
1315
+ (10891,'Engineer','2001-10-05','9999-01-01'),
1316
+ (10892,'Senior Staff','1998-04-11','9999-01-01'),
1317
+ (10892,'Staff','1990-04-11','1998-04-11'),
1318
+ (10893,'Senior Staff','1995-08-23','9999-01-01'),
1319
+ (10893,'Staff','1989-08-23','1995-08-23'),
1320
+ (10894,'Engineer','1995-12-05','9999-01-01'),
1321
+ (10895,'Staff','1986-04-26','1987-04-13'),
1322
+ (10896,'Engineer','1997-11-27','9999-01-01'),
1323
+ (10897,'Senior Staff','1995-04-09','9999-01-01'),
1324
+ (10897,'Staff','1986-04-09','1995-04-09'),
1325
+ (10898,'Senior Engineer','1993-01-08','9999-01-01'),
1326
+ (10899,'Senior Staff','1999-04-05','9999-01-01'),
1327
+ (10899,'Staff','1990-04-05','1999-04-05'),
1328
+ (10900,'Senior Engineer','1995-09-07','9999-01-01'),
1329
+ (10901,'Staff','1998-08-05','9999-01-01'),
1330
+ (10902,'Assistant Engineer','1990-06-11','1990-09-25'),
1331
+ (10903,'Senior Staff','1997-02-14','9999-01-01'),
1332
+ (10903,'Staff','1989-02-14','1997-02-14'),
1333
+ (10904,'Engineer','1993-04-16','1999-04-16'),
1334
+ (10904,'Senior Engineer','1999-04-16','9999-01-01'),
1335
+ (10905,'Senior Engineer','1985-02-28','1986-03-07'),
1336
+ (10906,'Staff','1998-10-18','9999-01-01'),
1337
+ (10907,'Senior Staff','1995-12-26','9999-01-01'),
1338
+ (10907,'Staff','1988-12-25','1995-12-26'),
1339
+ (10908,'Senior Staff','1993-04-05','9999-01-01'),
1340
+ (10908,'Staff','1986-04-05','1993-04-05'),
1341
+ (10909,'Engineer','1993-12-26','2000-12-26'),
1342
+ (10909,'Senior Engineer','2000-12-26','9999-01-01'),
1343
+ (10910,'Senior Staff','1995-09-02','9999-01-01'),
1344
+ (10910,'Staff','1989-09-02','1995-09-02'),
1345
+ (10911,'Senior Engineer','1988-06-25','9999-01-01'),
1346
+ (10912,'Senior Staff','1991-04-23','1999-09-26'),
1347
+ (10912,'Staff','1986-04-23','1991-04-23'),
1348
+ (10913,'Staff','1998-10-25','9999-01-01'),
1349
+ (10914,'Staff','1998-03-24','1998-09-01'),
1350
+ (10915,'Senior Engineer','1999-10-28','9999-01-01'),
1351
+ (10916,'Engineer','1998-03-12','9999-01-01'),
1352
+ (10917,'Engineer','1993-01-30','1998-01-30'),
1353
+ (10917,'Senior Engineer','1998-01-30','9999-01-01'),
1354
+ (10918,'Staff','1990-01-29','1990-10-10'),
1355
+ (10919,'Staff','1999-10-30','9999-01-01'),
1356
+ (10920,'Senior Staff','1998-02-23','9999-01-01'),
1357
+ (10920,'Staff','1992-02-24','1998-02-23'),
1358
+ (10921,'Engineer','1986-07-27','1995-07-27'),
1359
+ (10921,'Senior Engineer','1995-07-27','9999-01-01'),
1360
+ (10922,'Staff','1996-02-02','1999-01-16'),
1361
+ (10923,'Senior Staff','1990-04-09','9999-01-01'),
1362
+ (10924,'Senior Staff','1997-08-14','9999-01-01'),
1363
+ (10924,'Staff','1988-08-14','1997-08-14'),
1364
+ (10925,'Technique Leader','1991-06-11','9999-01-01'),
1365
+ (10926,'Engineer','1990-04-30','1995-04-30'),
1366
+ (10926,'Senior Engineer','1995-04-30','9999-01-01'),
1367
+ (10927,'Senior Staff','1993-09-12','9999-01-01'),
1368
+ (10927,'Staff','1986-09-12','1993-09-12'),
1369
+ (10928,'Senior Staff','1997-04-06','9999-01-01'),
1370
+ (10928,'Staff','1991-04-07','1997-04-06'),
1371
+ (10929,'Senior Staff','1998-04-15','9999-01-01'),
1372
+ (10929,'Staff','1991-04-15','1998-04-15'),
1373
+ (10930,'Engineer','1991-11-22','1998-11-22'),
1374
+ (10930,'Senior Engineer','1998-11-22','9999-01-01'),
1375
+ (10931,'Technique Leader','1992-06-14','1999-09-19'),
1376
+ (10932,'Engineer','1994-09-09','1999-09-09'),
1377
+ (10932,'Senior Engineer','1999-09-09','9999-01-01'),
1378
+ (10933,'Senior Engineer','1993-08-02','9999-01-01'),
1379
+ (10934,'Staff','1995-09-17','9999-01-01'),
1380
+ (10935,'Staff','1994-10-17','9999-01-01'),
1381
+ (10936,'Senior Staff','1996-05-08','9999-01-01'),
1382
+ (10936,'Staff','1990-05-09','1996-05-08'),
1383
+ (10937,'Engineer','1988-06-16','1994-06-16'),
1384
+ (10937,'Senior Engineer','1994-06-16','9999-01-01'),
1385
+ (10938,'Senior Staff','1993-09-24','9999-01-01'),
1386
+ (10938,'Staff','1985-09-24','1993-09-24'),
1387
+ (10939,'Assistant Engineer','1997-12-11','9999-01-01'),
1388
+ (10940,'Engineer','1997-06-30','1999-12-02'),
1389
+ (10941,'Senior Staff','2001-08-22','9999-01-01'),
1390
+ (10941,'Staff','1993-08-22','2001-08-22'),
1391
+ (10942,'Engineer','1996-01-21','9999-01-01'),
1392
+ (10943,'Engineer','1993-05-22','1999-05-22'),
1393
+ (10943,'Senior Engineer','1999-05-22','9999-01-01'),
1394
+ (10944,'Senior Engineer','1995-09-07','9999-01-01'),
1395
+ (10945,'Engineer','1993-04-04','2001-04-04'),
1396
+ (10945,'Senior Engineer','2001-04-04','9999-01-01'),
1397
+ (10946,'Staff','1996-10-26','9999-01-01'),
1398
+ (10947,'Senior Staff','2001-11-15','9999-01-01'),
1399
+ (10947,'Staff','1995-11-16','2001-11-15'),
1400
+ (10948,'Senior Engineer','1996-09-30','1997-06-23'),
1401
+ (10949,'Senior Staff','1996-06-28','9999-01-01'),
1402
+ (10949,'Staff','1990-06-29','1996-06-28'),
1403
+ (10950,'Senior Engineer','1996-06-08','1998-01-13'),
1404
+ (10951,'Senior Staff','1994-07-06','9999-01-01'),
1405
+ (10951,'Staff','1989-07-06','1994-07-06'),
1406
+ (10952,'Senior Engineer','1986-07-22','1988-04-26'),
1407
+ (10953,'Senior Staff','1987-02-12','9999-01-01'),
1408
+ (10954,'Staff','1995-12-14','9999-01-01'),
1409
+ (10955,'Senior Staff','1991-09-27','9999-01-01'),
1410
+ (10955,'Staff','1986-09-27','1991-09-27'),
1411
+ (10956,'Engineer','1995-12-02','9999-01-01'),
1412
+ (10957,'Senior Staff','1990-10-01','9999-01-01'),
1413
+ (10958,'Engineer','1988-11-27','1993-11-27'),
1414
+ (10958,'Senior Engineer','1993-11-27','9999-01-01'),
1415
+ (10959,'Staff','1994-03-01','1996-04-12'),
1416
+ (10960,'Senior Staff','1995-07-07','9999-01-01'),
1417
+ (10961,'Engineer','1993-11-04','1999-11-04'),
1418
+ (10961,'Senior Engineer','1999-11-04','9999-01-01'),
1419
+ (10962,'Senior Staff','1986-12-16','9999-01-01'),
1420
+ (10963,'Engineer','1988-01-14','1995-04-10'),
1421
+ (10964,'Senior Staff','1999-05-05','9999-01-01'),
1422
+ (10964,'Staff','1991-05-05','1999-05-05'),
1423
+ (10965,'Senior Staff','1986-07-29','9999-01-01'),
1424
+ (10966,'Staff','1997-02-05','9999-01-01'),
1425
+ (10967,'Engineer','1993-08-01','1998-08-01'),
1426
+ (10967,'Senior Engineer','1998-08-01','9999-01-01'),
1427
+ (10968,'Senior Staff','1985-08-11','9999-01-01'),
1428
+ (10969,'Senior Engineer','1994-05-12','9999-01-01'),
1429
+ (10970,'Engineer','1995-11-14','9999-01-01'),
1430
+ (10971,'Technique Leader','1991-07-30','1998-10-24'),
1431
+ (10972,'Engineer','1987-06-06','1996-06-05'),
1432
+ (10972,'Senior Engineer','1996-06-05','9999-01-01'),
1433
+ (10973,'Engineer','1989-03-05','1995-03-05'),
1434
+ (10973,'Senior Engineer','1995-03-05','9999-01-01'),
1435
+ (10974,'Senior Engineer','1999-05-17','9999-01-01'),
1436
+ (10975,'Engineer','1992-03-30','1998-03-30'),
1437
+ (10975,'Senior Engineer','1998-03-30','9999-01-01'),
1438
+ (10976,'Technique Leader','1998-10-31','9999-01-01'),
1439
+ (10977,'Senior Staff','1987-08-10','1987-10-01'),
1440
+ (10978,'Engineer','1985-05-18','1990-05-18'),
1441
+ (10978,'Senior Engineer','1990-05-18','9999-01-01'),
1442
+ (10979,'Engineer','1986-01-27','1993-01-27'),
1443
+ (10979,'Senior Engineer','1993-01-27','9999-01-01'),
1444
+ (10980,'Engineer','1989-01-04','1997-01-04'),
1445
+ (10980,'Senior Engineer','1997-01-04','9999-01-01'),
1446
+ (10981,'Senior Staff','1992-07-07','9999-01-01'),
1447
+ (10982,'Senior Staff','1994-11-11','9999-01-01'),
1448
+ (10982,'Staff','1989-11-11','1994-11-11'),
1449
+ (10983,'Engineer','1988-02-22','1997-02-21'),
1450
+ (10983,'Senior Engineer','1997-02-21','9999-01-01'),
1451
+ (10984,'Senior Engineer','1988-07-09','1993-05-14'),
1452
+ (10985,'Engineer','1999-02-11','1999-03-10'),
1453
+ (10986,'Technique Leader','1985-10-11','9999-01-01'),
1454
+ (10987,'Engineer','1997-05-21','9999-01-01'),
1455
+ (10988,'Senior Engineer','1985-06-19','9999-01-01'),
1456
+ (10989,'Senior Staff','1991-07-20','9999-01-01'),
1457
+ (10989,'Staff','1985-07-20','1991-07-20'),
1458
+ (10990,'Technique Leader','1990-08-06','9999-01-01'),
1459
+ (10991,'Engineer','1999-07-13','9999-01-01'),
1460
+ (10992,'Engineer','1997-04-27','9999-01-01'),
1461
+ (10993,'Engineer','1992-05-29','2000-05-29'),
1462
+ (10993,'Senior Engineer','2000-05-29','9999-01-01'),
1463
+ (10994,'Assistant Engineer','1987-06-29','1989-05-24'),
1464
+ (10995,'Senior Staff','1997-07-19','9999-01-01'),
1465
+ (10996,'Senior Staff','1996-02-07','9999-01-01'),
1466
+ (10996,'Staff','1990-02-07','1996-02-07'),
1467
+ (10997,'Technique Leader','2000-01-04','9999-01-01'),
1468
+ (10998,'Staff','1996-08-07','9999-01-01'),
1469
+ (10999,'Technique Leader','1996-03-05','1997-04-19'),
1470
+ (11000,'Senior Engineer','1996-01-28','9999-01-01');
employee-sample-database/sqlite/README.md ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Employee Sample Database for SQLite
2
+
3
+ This is derived from the [MySQL counterpart](https://github.com/bytebase/employee-sample-database/tree/main/mysql).
4
+
5
+ ## Schema
6
+
7
+ The schema matches the MySQL and PostgreSQL versions, with appropriate adaptations for SQLite syntax.
8
+
9
+ ## Installation:
10
+
11
+ 1. Download the repository
12
+ 2. Change directory to the repository
13
+ 3. Change directory to `dataset_small`
14
+
15
+ Run:
16
+
17
+ ```bash
18
+ cd dataset_small
19
+ ```
20
+
21
+ Then run:
22
+
23
+ ```bash
24
+ sqlite3 employee.db < employee.sql
25
+ ```
26
+
27
+ ## Testing the installation
28
+
29
+ ```bash
30
+ # Under 'dataset_small' directory
31
+ sqlite3 employee.db < test_employee_md5.sql
32
+ ```
33
+
34
+ This will verify the integrity of the loaded data by comparing record counts and MD5 checksums against expected values.
employee-sample-database/sqlite/dataset_small/employee.db ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:eb3b8d727ac7e37d7563277d556320bd3304dd132a3cb20d03e0fae53e43c3a2
3
+ size 868352