Compare commits

...
Sign in to create a new pull request.

108 commits
test ... master

Author SHA1 Message Date
30622c611a feat(smart url): add feature to try alternate url versions with and without .ics suffix 2025-04-15 17:06:02 +03:00
48548dadc8 test(smart url): add tests for smart url handling 2025-04-15 17:04:34 +03:00
927941abf9 build(port): change port from 3000 to 3012 2025-04-15 16:33:03 +03:00
0950ec772e docs(README): document the directory and files calmerger writes to 2025-04-10 18:04:51 +03:00
67fc4a6987 build(docker): add docker-compose.yml file 2025-04-10 17:56:38 +03:00
9910e458f1 feat(input order): swap url and prefix input fields 2025-04-10 15:53:14 +03:00
3abfe4c0e7 feat(remove button): add a remove button to all calendar inputs 2025-04-10 15:42:36 +03:00
6ff8f24f10 feat(remove btn): add a remove calendar button 2025-02-26 14:46:46 +03:00
ce8c6e66a5 style(calendar): add styling to the ui 2025-02-26 14:38:46 +03:00
869beeb3d4 test(calendar): clean up merged calendars directory after tests 2024-11-27 13:25:35 +03:00
18215a89f6 build(logger): install winston for logging and add logs to .gitignore 2024-11-26 03:23:48 +03:00
577faabc3b test(logging): adjust logging to use debug levels 2024-11-26 03:09:49 +03:00
92c6fffe64 test(calendar): run tests for different calendar instances 2024-11-26 01:50:55 +03:00
51c4f5c31f test(calendar): make tests for merged date based calendars pass 2024-11-25 20:59:07 +03:00
5ec6341680 feat(calendar): Set the summary using prefix and override logic 2024-11-25 20:57:32 +03:00
d6022eeb62 chore: Merge branch 'master' of forge.ftt.gmbh:janek/CalMerger 2024-11-25 20:09:02 +03:00
5ec42d07bb Clean up the merged calendars directory before tests 2024-11-25 20:00:36 +03:00
xeruf
ff595a9f70 refactor(calendarUtil): addEventsToCalendar variable naming 2024-11-25 13:41:28 +01:00
xeruf
1706b9cad3 feat(calendarUtil): simplify event property copying 2024-11-25 13:32:47 +01:00
xeruf
2bd5c967af test(calendar): remove line ending normalization 2024-11-25 13:03:51 +01:00
xeruf
c8f3771717 test(calendar): use correct subdirectory to run server 2024-11-25 13:03:47 +01:00
5b40bf5d75 test: add test for date based events 2024-11-25 14:35:55 +03:00
227ec8a211 fix(calendar): handle date events appropriately 2024-11-22 17:03:07 +03:00
5769c9ce5b test: update imports and add ESM-compatible __dirname handling 2024-11-21 19:56:48 +03:00
6a428c55e0 build(tests): ensure compatibility with ESM in Jest by updating test script - Updated test script in package.json to use with Jest. 2024-11-21 19:52:19 +03:00
56e5f69cbb docs: add instructions on how to build and run the server with docker 2024-11-21 15:35:48 +03:00
e45c433797 build(docker): edit CMD to reference app.js to run the application 2024-11-21 14:53:09 +03:00
c4c723d60a build(docker): create dockerfile and .dockerignore files 2024-11-20 19:05:39 +03:00
29208d8b4d build(babel): install babel/core, babel/plugin-transform-modules-commonjs, and babel-jest 2024-11-20 15:21:11 +03:00
c1c6ae47de test: create jest.config,js file 2024-11-20 15:19:13 +03:00
174a845c78 fix(import): enable compatibility between ES modules and CommonJS for ical.jsRenamed ical.js to ical.cjs to explicitly mark it as a CommonJS module and used createRequire to import it into the ES module project. This resolves module system conflicts and ensures seamless integration without modifying ical.js content. 2024-11-20 13:58:35 +03:00
ad3ec6f7a6 build: update start script to correctly point to src/app.js 2024-11-20 13:25:05 +03:00
fab6753c5a fix: ensure accurate TZID inclusion in DTSTART/DTEND- Preserve TZID only when explicitly included in source calendar. - Added a helper function hasTZID to check for explicit TZID in raw properties.- Adjusted datetime processing logic in processDateTimeProperty to streamline handling of various cases. 2024-11-20 01:49:40 +03:00
379a79617b fix(lineendings): normalize calendar line endings to CRLF 2024-11-19 19:06:22 +03:00
d15d0be707 feat(calendar): extract and include X-WR-TIMEZONE if available 2024-11-19 19:03:06 +03:00
5e3e8eab5b feat(calendar): add METHOD property to calendar component if provided 2024-11-19 15:59:23 +03:00
2283b82ba7 test: add google-calendar.ics test calendar 2024-11-19 15:27:07 +03:00
2f3b791e5d test: reorder calendar components in nextcloud-minimal test calendar 2024-11-19 15:26:06 +03:00
ac26afe778 feat(calendars): reorder calendar components 2024-11-19 15:24:16 +03:00
e5e9dbb680 test: add test calendar for google-calendar-minimal 2024-11-19 15:22:43 +03:00
8881361a1f text: create and run test for google-calendar-mininal 2024-11-19 15:21:19 +03:00
8965eaa319 fix(line-endings): normalize line endings to LF for cross-platform consistency- Normalized line endings in generated calendar content to LF.- Updated test assertions to handle line-ending discrepancies.- Ensured compatibility across Windows and UNIX-like systems. 2024-11-19 14:17:42 +03:00
ca52065f66 feat(calendar): include CALSCALE and SEQUENCE details 2024-11-19 14:03:42 +03:00
8ab685dec0 test: run tests for nextcloud minimal alone first 2024-11-19 13:35:14 +03:00
585b83b03c test: run tests for nextcloud minimal alone first 2024-11-19 13:34:35 +03:00
73e46d7f99 feat(prodid): introduce custom PRODID for merged calendars 2024-11-19 13:32:55 +03:00
d2b0234b4b feat(location): conditionally handle VEVENT location based on override flag 2024-11-19 13:21:22 +03:00
2b7002303c fix(calendar): align VEVENT property order and include time zone details 2024-11-19 01:29:32 +03:00
6cf5b8420e feat(calendar): copy summary, timestamps, and recurrence details for VEVENTs 2024-11-18 23:49:50 +03:00
ddcfedbbdf feat(calendar): support extracting and writing VTIMEZONE subcomponents 2024-11-18 23:40:41 +03:00
xeruf
bed3e47f8e test: add nextcloud tests 2024-11-18 13:34:14 +01:00
xeruf
1f19d8cf1f build(gitattributes): ics line feeds 2024-11-18 13:01:47 +01:00
xeruf
77e6963118 test: fix calendar paths 2024-11-18 13:00:24 +01:00
782e62d56d refactor:remove logging for ICAL and ICAL.component as it works now 2024-11-18 14:07:22 +03:00
9468e58132 test: validate fetchCalendarData reads and parses files accurately 2024-11-18 14:04:51 +03:00
d4498cd0d8 fix: export ICAL in ical.timezones.js 2024-11-18 13:55:44 +03:00
3edc551031 test:add logging to confirm import and structure of ICAL 2024-11-16 02:53:06 +03:00
859d3f3db5 fix:pull changes from contrib 2024-11-15 13:14:53 +03:00
xeruf
00e152f08c chore(package.json): remove unused libraries 2024-11-14 13:49:01 +01:00
xeruf
864a3739b3 fix: adjust ical.js to fix import
https://github.com/kewisch/ical.js/issues/329
2024-11-14 13:45:23 +01:00
495fb57675 refactor:create gitattributes file 2024-11-14 15:12:43 +03:00
ff32bb430d Merge remote-tracking branch 'contrib/master' 2024-11-14 14:04:47 +03:00
9a0a62675c fix:add ical.js and ical.timezones.js files in lib 2024-11-14 03:02:54 +03:00
xeruf
0a863a4eb2 test(calendarUtil): failing ical test 2024-11-13 17:43:13 +01:00
a94727df56 build:install luxon to handle timezone parsing 2024-11-13 15:45:53 +03:00
7e2b846029 build:install date-fns and date-fns-tz to handle timezones 2024-11-13 15:18:25 +03:00
cbdfdf6c97 test:update test forhandling timezones 2024-11-13 15:17:17 +03:00
2e9de0749d fix:handle timebased events 2024-11-13 02:54:42 +03:00
d08d87f47c test:get date based calendar test to run 2024-11-12 23:23:59 +03:00
0114c94caa fix: get DTSTAMP to get parsed correctly and remain the same as the original 2024-11-12 23:13:56 +03:00
e8582cd411 test:add logging to ensure DTSTAMP is correctly added to the new event 2024-11-12 22:53:25 +03:00
665c134597 test(in-progress): run tests for date based calendar 2024-11-12 22:40:28 +03:00
0b0ecaa0c2 Merge pull request 'test: preserve date-based calendar' (#4) from janek/CalMerger:master into master
Reviewed-on: ryanmwangi/CalMerger#4
2024-11-12 15:38:31 +00:00
xeruf
4032e2c49d test: preserve date-based calendar 2024-11-12 16:20:53 +01:00
441f4d2fb3 test:set up initial structure for unit tests for fetchCalendarData function 2024-11-11 22:32:12 +03:00
8c0de14d5f refactor: move server.js and app.js into src directory 2024-11-11 20:14:49 +03:00
af980956cb test:edit expected outcome file for override calendar 2024-11-11 20:01:58 +03:00
5d7bdb6878 refactor:streamlined server file 2024-11-11 19:57:56 +03:00
df37f35ace refactor: separated route logic from server startup 2024-11-11 19:45:44 +03:00
2a0fe0812e refactor: move utility functions to calendarUtil.js 2024-11-11 19:34:53 +03:00
3b590958a0 test: run tests to check the produced output against the expected output 2024-11-11 14:03:37 +03:00
299b8c1404 refactor: serve static files from a dedicated directory 2024-11-11 13:47:18 +03:00
be6d378890 style: refactor async functions to use traditional function declaration syntax
- Converted async arrow functions to traditional function declarations for consistency
- Updated  and  to use  syntax
- Maintained overall functionality while improving readability and alignment with preferred style
2024-11-08 15:49:33 +03:00
11a4efe30b fix: ensure valid date-time handling in event components
- Resolved calendar merging error where ICAL.js rejected formatted date-time strings by refactoring  and  initialization to use  for accurate timezone conversion.
- Updated  and  to receive ICAL.Time objects directly, ensuring proper format consistency and timezone handling in event components.
2024-11-08 14:23:30 +03:00
db78a0121e refactor: Refactor addEventsToCalendar to properly handle date validation and usage
- Updated the handling of start and end dates in the addEventsToCalendar function.
- Added validation checks directly on startDate and endDate to ensure they are valid before updating event properties.
- Improved logging for better traceability of event addition and date handling.

Note: The changes are intended to enhance the handling of date properties, but further testing is required to ensure full functionality.
2024-11-08 02:21:22 +03:00
1bb1db7326 logging: log result.data as I debug. correct synta as wellx 2024-11-07 20:37:23 +03:00
73135dd9d4 refactor: use ical.js to generate calendar merged and refreshed calendars 2024-11-07 20:27:43 +03:00
41687e1e22 remove: tests directory 2024-11-07 20:17:37 +03:00
8e143df754 refactor: replace event addition with ical.js
- transition event processing from ical-generator to ical.js
- add logging for event addition to calendar component
- preserve event details (uid, summary, start, end) in new event components
2024-11-07 20:11:48 +03:00
ffd2fa5370 refactor: switch calendar component creation to ical.js
- replace ical-generator with ical.js for VCALENDAR creation
- add logging for component creation process
- set component metadata (prodid, version, name) using ical.js
2024-11-07 20:06:07 +03:00
1c241c0738 chore: add calendar directory to .gitignore 2024-11-07 16:05:18 +03:00
69f2f71a2d test: add test for merging calendars in different timezones and merging date-based and time-based calendars 2024-11-07 16:04:21 +03:00
708144baa6 test: introduce new shorter calendar test files 2024-11-07 15:32:18 +03:00
b32696f14c refactor: refactor endpoint to serve refreshed merge calendars 2024-11-07 14:43:41 +03:00
cdc25981b5 refactor: streamline calendar refresh logic with refreshCalendarData helper 2024-11-07 14:35:25 +03:00
1dde451f9d refactor: refactor endpoint to merge calendars 2024-11-07 14:33:24 +03:00
00f5fedb2a refactor: encapsulate calendar file saving with saveCalendarFile helper 2024-11-07 14:25:02 +03:00
1bc7119b08 refactor: modularize event merging with mergeCalendarEvents helper 2024-11-07 14:23:24 +03:00
0c61cb0e7c refactor: centralize calendar data retrieval with fetchCalendarData helper 2024-11-07 14:20:56 +03:00
af74d809c4 refactor: refactor sanitizeFilename utility that ensures valid file names 2024-11-07 14:18:18 +03:00
cf10a62049 refactor: streamline static file serving 2024-11-07 14:11:09 +03:00
xeruf
495557e6c2 refactor: add starter script 2024-11-07 10:28:11 +01:00
xeruf
5b3a47a122 test: run tests and keep assets in subdirectory 2024-11-07 10:20:56 +01:00
xeruf
8eb44e18f6 fix(server.js): properly propagate errors 2024-11-07 10:15:37 +01:00
6c9fb1139f fix(tests): ensure calendar file path is correct
- Updated file path in merge date-based calendar test to point to the 'calendar' directory within TEST_MERGED_CALENDARS_DIR.
2024-11-07 03:44:11 +03:00
188a2b713c Merge remote-tracking branch 'contrib/master' 2024-11-07 02:22:18 +03:00
4fce46c57e test: changes on temp folder 2024-11-07 02:18:12 +03:00
9f036b43cd chore: Remove debug log for merged calendars directory
- Eliminated console log statement that outputs the merged calendars directory path.
- Cleans up the server output and reduces unnecessary logging.
2024-11-06 15:30:19 +03:00
58 changed files with 12438 additions and 2293 deletions

8
.dockerignore Normal file
View file

@ -0,0 +1,8 @@
node_modules
npm-debug.log
.DS_Store
tests
*.test.js
*.log
.git
.env

2
.gitattributes vendored Normal file
View file

@ -0,0 +1,2 @@
* text=auto eol=lf
*.ics text eol=crlf

4
.gitignore vendored
View file

@ -1,2 +1,4 @@
node_modules/ node_modules/
tests/calendar/ test/calendar/
calendar/
logs/

BIN
.qodo/history.sqlite Normal file

Binary file not shown.

View file

@ -18,6 +18,17 @@ The application also generates a unique URL for the merged calendar and updates
- Generate a unique URL for the merged calendar - Generate a unique URL for the merged calendar
- Automatically update the merged calendar every hour - Automatically update the merged calendar every hour
## Calender Directory
#### `calendar/` (MERGED_CALENDARS_DIR)
- Location: Created in application's current working directory
- Purpose: Stores all generated calendar files
- Contains:
- `.ics` files - Final merged calendars in iCalendar format
- `.json` files - Configuration preserving original merge parameters
- Maintains both formats for each merged calendar group
## Requirements ## Requirements
- [Node.js](https://nodejs.org/) (version 14 or higher) - [Node.js](https://nodejs.org/) (version 14 or higher)
@ -39,6 +50,50 @@ The application also generates a unique URL for the merged calendar and updates
```bash ```bash
npm start npm start
``` ```
## Building and Running with Docker
### 1. Build the Docker Image
Run the following command to build the Docker image:
```bash
docker build -t calmerger-app .
```
### 2. Run the Docker Container
To start the container, use:
```bash
docker run -d --name calmerger -p 3012:3012 calmerger-app
```
This maps the container's port `3012` to the host system's port `3012`. The application will be accessible at [http://localhost:3012](http://localhost:3012).
### 3. Using Docker Compose (Optional)
If you prefer to use Docker Compose, ensure you have a `docker-compose.yml` file in your project directory. Then, run:
```bash
docker-compose up -d
```
This will automatically build and start the container based on the configuration in the `docker-compose.yml` file.
### 4. Stopping the Docker Container
To stop the running container, use:
```bash
docker stop calmerger
```
To remove the container:
```bash
docker rm calmerger
```
## Running Tests ## Running Tests
@ -70,7 +125,7 @@ This generates a `coverage` report, showing how much of the codebase is tested.
## Usage ## Usage
1. Open a web browser and navigate to `http://localhost:3000`. 1. Open a web browser and navigate to `http://localhost:3012`.
2. Click the **Add Calendar** button to add a new calendar. 2. Click the **Add Calendar** button to add a new calendar.
3. Enter the Link Group Name, calendar URL, prefix, and override options (if needed). 3. Enter the Link Group Name, calendar URL, prefix, and override options (if needed).
4. Click the **Merge Calendars** button to generate the merged calendar. 4. Click the **Merge Calendars** button to generate the merged calendar.

View file

@ -1,158 +0,0 @@
import request from 'supertest';
import express from 'express';
import fs from 'fs';
import path from 'path';
import app from './server';
const TEST_MERGED_CALENDARS_DIR = path.join(__dirname, 'tests');
const TEST_CALENDARS_DIR = 'test_calendars';
const EXPECTED_OUTPUTS_DIR = 'expected_outputs';
let server;
describe('Calendar Merging API', () => {
beforeAll(async () => {
console.log(`Test Merged Calendars Directory: ${TEST_MERGED_CALENDARS_DIR}`);
// Ensure the test merged calendars directory exists
if (!fs.existsSync(TEST_MERGED_CALENDARS_DIR)) {
fs.mkdirSync(TEST_MERGED_CALENDARS_DIR, { recursive: true });
}
// Change the working directory to the test-specific directory
process.chdir(TEST_MERGED_CALENDARS_DIR);
console.log(process.cwd());
// Start the server
server = app.listen(0);
});
afterAll(async () => {
// Ensure the server is closed before cleanup
await new Promise(resolve => server.close(resolve));
// Optional: Add a delay to ensure all handles are released
await new Promise(resolve => setTimeout(resolve, 100));
});
const loadCalendarFile = (filename) => {
return path.join(__dirname, TEST_CALENDARS_DIR, filename);
};
const loadExpectedOutput = (filename) => {
return fs.readFileSync(path.join(EXPECTED_OUTPUTS_DIR, filename), 'utf8');
};
test('Merge date-based calendar', async () => {
const response = await request(server)
.post('/merge')
.send({
linkGroupName: 'Date Based Calendar',
calendars: [
{
url: loadCalendarFile('ferien_bayern_2023.ics'),
prefix: 'Ferien_Bayern_2023',
override: false,
},
{
url: loadCalendarFile('US_Holidays.ics'),
prefix: 'US_holidays',
override: false,
},
],
});
expect(response.status).toBe(200);
expect(response.body.url).toMatch(/calendar\/Date_Based_Calendar/);
// Check if the file was created in the test directory
const filePath = path.join(TEST_MERGED_CALENDARS_DIR, 'Date_Based_Calendar.ics');
expect(fs.existsSync(filePath)).toBe(true);
// Load expected output and compare
const expectedOutput = loadExpectedOutput('Date_Based_Calendar.ics');
const actualOutput = fs.readFileSync(filePath, 'utf8');
// expect(actualOutput).toBe(expectedOutput);
});
test('Merge time-based calendar', async () => {
const response = await request(server)
.post('/merge')
.send({
linkGroupName: 'Time Based Calendar',
calendars: [
{
url: loadCalendarFile('other_work.ics'),
prefix: 'other_work',
override: false,
},
{
url: loadCalendarFile('work.ics'),
prefix: 'work',
override: false,
},
],
});
expect(response.status).toBe(200);
expect(response.body.url).toMatch(/calendar\/Time_Based_Calendar/);
// Check if the file was created in the test directory
const filePath = path.join(TEST_MERGED_CALENDARS_DIR, 'Time_Based_Calendar.ics');
expect(fs.existsSync(filePath)).toBe(true);
// Load expected output and compare
const expectedOutput = loadExpectedOutput('Time_Based_Calendar.ics');
const actualOutput = fs.readFileSync (filePath, 'utf8');
// expect(actualOutput).toBe(expectedOutput);
});
test('Merge calendar without prefix', async () => {
const response = await request(server)
.post('/merge')
.send({
linkGroupName: 'No Prefix Calendar',
calendars: [
{
url: loadCalendarFile('San_Francisco_Public_Holidays.ics'),
prefix: '',
override: false,
},
],
});
expect(response.status).toBe(200);
expect(response.body.url).toMatch(/calendar\/No_Prefix_Calendar/);
// Check if the file was created in the test directory
const filePath = path.join(TEST_MERGED_CALENDARS_DIR, 'No_Prefix_Calendar.ics');
expect(fs.existsSync(filePath)).toBe(true);
// Load expected output and compare
const expectedOutput = loadExpectedOutput('No_Prefix_Calendar.ics');
const actualOutput = fs.readFileSync(filePath, 'utf8');
// expect(actualOutput).toBe(expectedOutput);
});
test('Merge calendar with override', async () => {
const response = await request(server)
.post('/merge')
.send({
linkGroupName: 'Override Calendar',
calendars: [
{
url: loadCalendarFile('San_Francisco_Public_Holidays.ics'),
prefix: 'Override Event',
override: true,
},
],
});
expect(response.status).toBe(200);
expect(response.body.url).toMatch(/calendar\/Override_Calendar/);
// Check if the file was created in the test directory
const filePath = path.join(TEST_MERGED_CALENDARS_DIR, 'Override_Calendar.ics');
expect(fs.existsSync(filePath)).toBe(true);
// Load expected output and compare
const expectedOutput = loadExpectedOutput('Override_Calendar.ics');
const actualOutput = fs.readFileSync(filePath, 'utf8');
// expect(actualOutput).toBe(expectedOutput);
});
});

14
docker-compose.yml Normal file
View file

@ -0,0 +1,14 @@
version: "3.3"
services:
calmerge:
build: .
ports:
- "3012:3012"
environment:
- NODE_ENV=production
- NODE_PORT=3012
volumes:
- ./calendar:/app/calendar
- ./logs:/app/logs
restart: unless-stopped

20
dockerfile Normal file
View file

@ -0,0 +1,20 @@
# Use an official Node.js runtime as a parent image
FROM node:18-alpine
# Set working directory inside the container
WORKDIR /usr/src/app
# Copy package.json and package-lock.json for installing dependencies
COPY package*.json ./
# Install dependencies
RUN npm install --omit=dev
# Copy the rest of the project files
COPY . .
# Expose the port your application runs on (if applicable)
EXPOSE 3012
# Command to run the application
CMD ["node", "src/app.js"]

View file

@ -1,48 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Calendar Merger</title>
<style>
body {
font-family: Arial, sans-serif;
}
#calendars {
margin-bottom: 20px;
}
#calendars .calendar {
margin-bottom: 10px;
}
#calendars .calendar input[type="text"] {
width: 50%;
margin-right: 10px;
}
#calendars .calendar input[type="url"] {
width: 50%;
}
#add-calendar {
margin-bottom: 20px;
}
</style>
</head>
<body>
<h1>Calendar Merger</h1>
<form id="merge-form">
<input type="text" id="link-group-name" placeholder="Link Group Name">
<div id="calendars">
<div class="calendar">
<input type="text" id="prefix-0" placeholder="Prefix">
<input type="checkbox" id="override-0">
<label for="override-0">Override</label>
<input type="url" id="url-0" placeholder="Calendar URL">
</div>
</div>
<button id="add-calendar" type="button">Add Calendar</button>
<button type="submit">Merge Calendars</button>
</form>
<div id="result"></div>
<script src="script.js"></script>
</body>
</html>

View file

@ -1,5 +0,0 @@
module.exports = {
transform: {
'^.+\\.jsx?$': 'babel-jest',
},
};

7
jest.config.js Normal file
View file

@ -0,0 +1,7 @@
export default {
transform: {
'^.+\\.jsx?$': 'babel-jest',
},
moduleFileExtensions: ['js', 'jsx'],
testEnvironment: 'node',
};

1212
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,28 +1,32 @@
{ {
"name": "calendar-merger", "name": "calendar-merger",
"version": "1.0.0", "version": "1.1.0",
"type": "module",
"scripts": { "scripts": {
"start": "node server.js", "start": "node src/app.js",
"test": "jest" "test": "node --experimental-vm-modules ./node_modules/jest/bin/jest.js ./test"
}, },
"dependencies": { "dependencies": {
"axios": "^1.7.7", "axios": "^1.7.7",
"calendar-merger": "file:", "calendar-merger": "file:",
"express": "^4.17.1", "express": "^4.17.1",
"ical": "^0.8.0",
"ical-generator": "^0.2.10",
"ical.js": "^2.1.0", "ical.js": "^2.1.0",
"node-cron": "^2.0.3", "node-cron": "^2.0.3",
"supertest": "^7.0.0" "supertest": "^7.0.0",
"winston": "^3.17.0"
}, },
"description": "cal merge", "description": "calmerger",
"main": "script.js", "main": "server.js",
"author": "Ryan", "author": "Ryan",
"type": "module",
"license": "ISC", "license": "ISC",
"devDependencies": { "devDependencies": {
"@babel/core": "^7.26.0",
"@babel/plugin-transform-modules-commonjs": "^7.25.9",
"@babel/preset-env": "^7.26.0", "@babel/preset-env": "^7.26.0",
"@babel/register": "^7.25.9", "@babel/register": "^7.25.9",
"jest": "^29.7.0" "axios-mock-adapter": "^2.1.0",
"babel-jest": "^29.7.0",
"jest": "^29.7.0",
"rewire": "^7.0.0"
} }
} }

50
public/index.html Normal file
View file

@ -0,0 +1,50 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Calendar Merger</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="container">
<h1>📅 Calendar Merger</h1>
<div class="form-card">
<form id="merge-form">
<div class="input-group">
<input type="text"
id="link-group-name"
placeholder="Enter collection name"
class="input-field">
</div>
<div id="calendars">
<div class="calendar-entry">
<input type="url" id="url-0" placeholder="https://example.com/calendar.ics">
<input type="text" id="prefix-0" placeholder="Event prefix">
<div class="checkbox-group">
<input type="checkbox" id="override-0">
<label for="override-0">Override</label>
</div>
<button type="button" class="remove-btn" title="Remove calendar"></button>
</div>
</div>
<div class="button-group">
<button type="button" id="add-calendar" class="button secondary-btn">
Add Another Calendar
</button>
<button type="submit" class="button primary-btn">
🔗 Merge Calendars
</button>
</div>
</form>
</div>
<div id="result"></div>
</div>
<script src="script.js"></script>
</body>
</html>

View file

@ -14,12 +14,15 @@ function isValidUrl(url) {
addCalendarButton.addEventListener('click', () => { addCalendarButton.addEventListener('click', () => {
const newCalendar = document.createElement('div'); const newCalendar = document.createElement('div');
newCalendar.className = 'calendar'; newCalendar.className = 'calendar-entry';
newCalendar.innerHTML = ` newCalendar.innerHTML = `
<input type="text" id="prefix-${calendarIndex}" placeholder="Prefix"> <input type="url" id="url-${calendarIndex}" placeholder="https://example.com/calendar.ics">
<input type="checkbox" id="override-${calendarIndex}"> <input type="text" id="prefix-${calendarIndex}" placeholder="Event prefix">
<label for="override-${calendarIndex}">Override</label> <div class="checkbox-group">
<input type="url" id="url-${calendarIndex}" placeholder="Calendar URL"> <input type="checkbox" id="override-${calendarIndex}">
<label for="override-${calendarIndex}">Override</label>
</div>
<button type="button" class="remove-btn" title="Remove calendar"></button>
`; `;
calendars.appendChild(newCalendar); calendars.appendChild(newCalendar);
calendarIndex++; calendarIndex++;
@ -75,3 +78,12 @@ function isValidUrl(url) {
}); });
} }
}); });
document.addEventListener('click', (event) => {
if (event.target.classList.contains('remove-btn')) {
const calendarEntry = event.target.closest('.calendar-entry');
if (calendarEntry) {
calendarEntry.remove();
}
}
});

159
public/styles.css Normal file
View file

@ -0,0 +1,159 @@
:root {
--primary: #2563eb;
--primary-hover: #1d4ed8;
--background: #f8fafc;
--surface: #ffffff;
--border: #e2e8f0;
--text: #1e293b;
}
body {
font-family: 'Segoe UI', system-ui, sans-serif;
background: var(--background);
color: var(--text);
line-height: 1.6;
margin: 0;
padding: 2rem;
}
.container {
max-width: 800px;
margin: 0 auto;
}
/* Form Styling */
.form-card {
background: var(--surface);
border-radius: 12px;
padding: 2rem;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
margin-bottom: 2rem;
}
.input-group {
display: grid;
gap: 1rem;
margin-bottom: 1.5rem;
}
/* Calendar Entry Styling */
.calendar-entry {
display: flex;
gap: 1rem;
align-items: center;
padding: 1rem;
background: var(--background);
border-radius: 8px;
transition: all 0.2s ease;
margin-bottom: 1rem;
}
.calendar-entry:hover {
transform: translateY(-2px);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
}
/* Input Elements */
input[type="text"],
input[type="url"] {
padding: 0.75rem;
border: 2px solid var(--border);
border-radius: 6px;
width: 100%;
transition: border-color 0.2s ease;
}
input:focus {
outline: none;
border-color: var(--primary);
box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
}
/* Checkbox Styling */
.checkbox-group {
display: flex;
align-items: center;
gap: 0.5rem;
}
input[type="checkbox"] {
width: 1.2em;
height: 1.2em;
accent-color: var(--primary);
}
/* Button Styling */
.button {
padding: 0.75rem 1.5rem;
border: none;
border-radius: 6px;
cursor: pointer;
font-weight: 600;
transition: all 0.2s ease;
}
.primary-btn {
background: var(--primary);
color: white;
}
.primary-btn:hover {
background: var(--primary-hover);
}
.secondary-btn {
background: var(--background);
border: 2px solid var(--border);
}
/* Result Display */
#result {
padding: 1.5rem;
background: var(--surface);
border-radius: 8px;
margin-top: 1rem;
border: 2px dashed var(--border);
}
#result a {
color: var(--primary);
text-decoration: none;
font-weight: 500;
}
/* Responsive Design */
@media (max-width: 640px) {
.calendar-entry {
flex-direction: column;
align-items: stretch;
}
input[type="text"] {
width: 100%;
}
}
.remove-btn {
background: #fef2f2;
color: #dc2626;
border: none;
border-radius: 50%;
width: 32px;
height: 32px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition: all 0.2s ease;
}
.remove-btn:hover {
background: #fee2e2;
transform: scale(1.1);
}
.remove-btn::before {
content: '×';
font-size: 1.4rem;
line-height: 1;
}

250
server.js
View file

@ -1,250 +0,0 @@
import express from 'express';
import ICAL from 'ical.js';
import fs from 'fs';
import axios from 'axios';
import path from 'path';
import icalGenerator from 'ical-generator';
const app = express();
app.use(express.json());
// Determine the merged calendars directory based on the environment
const MERGED_CALENDARS_DIR = 'calendar';
console.log(`Merged calendars directory: ${MERGED_CALENDARS_DIR} under ${process.cwd()}`);
// Ensure the merged calendars directory exists
fs.mkdirSync(MERGED_CALENDARS_DIR, { recursive: true });
app.get('/script.js', (req, res) => {
res.setHeader('Content-Type', 'application/javascript');
res.sendFile('script.js', { root: '.' });
});
app.get('/', (req, res) => {
res.sendFile('index.html', { root: '.' });
});
// Function to sanitize the linkGroupName for use as a filename
function sanitizeFilename(filename) {
return filename.replace(/[<>:"/\\|?* ]/g, '_'); // Replace invalid characters with underscores
}
// Merge calendars endpoint
app.post('/merge', async (req, res) => {
const { linkGroupName, calendars } = req.body;
try {
// Validate the input
if (!linkGroupName || !calendars || !Array.isArray(calendars) || calendars.length === 0) {
return res.status(400).json({ error: 'Invalid input. Please provide a linkGroupName and at least one calendar.' });
}
// Sanitize the linkGroupName to create a valid filename
const sanitizedLinkGroupName = sanitizeFilename(linkGroupName);
const filename = `${sanitizedLinkGroupName}.ics`;
// Fetch calendar data from URLs or load from local files
const promises = calendars.map((calendar) => {
// Check if calendar URL is a file path or a URL
const isFilePath = !calendar.url.startsWith('http');
if (isFilePath) {
try{
// Read calendar data from local file
const data = fs.readFileSync(path.resolve(calendar.url), 'utf-8');
return Promise.resolve({
data: data,
prefix: calendar.prefix,
override: calendar.override,
});
} catch (error){
console.error(`Error reading calendar file ${calendar.url}:`, error);
return Promise.resolve(null);
}
} else {
// Fetch calendar data from URL
return axios.get(calendar.url)
.then((response) => {
return {
data: response.data,
prefix: calendar.prefix,
override: calendar.override,
};
})
.catch((error) => {
console.error(`Error fetching calendar from ${calendar.url}:`, error);
return null;
});
}
});
const results = await Promise.all(promises);
// Filter out any failed requests
const validResults = results.filter((result) => result !== null);
// Create a new iCalendar instance
const calendar = icalGenerator({ name: linkGroupName });
// Parse calendar data
validResults.forEach((result) => {
const parsed = ICAL.parse(result.data);
const component = new ICAL.Component(parsed);
const events = component.getAllSubcomponents('vevent');
events.forEach((event) => {
const vevent = new ICAL.Event(event);
const start = vevent.startDate.toJSDate();
const end = vevent.endDate.toJSDate();
const summary = result.override ? result.prefix : `${result.prefix} ${vevent.summary}`;
if (vevent.startDate.isDate) {
calendar.createEvent({
start: start.toISOString().split('T')[0],
end: end.toISOString().split('T')[0],
summary: summary,
allDay: true,
});
} else {
calendar.createEvent({
start: start,
end: end,
summary: summary,
});
}
});
});
// Save the calendar to a file
const filePath = `${MERGED_CALENDARS_DIR}/${filename}`;
fs.writeFileSync(filePath, calendar.toString());
console.log(`Calendar saved to ${filePath}`);
// Save the user input and sanitizedLinkGroupName in a separate JSON file
saveCalendarData(sanitizedLinkGroupName, linkGroupName, calendars);
res.json({ url: `${req.protocol}://${req.get('host')}/calendar/${sanitizedLinkGroupName}` });
} catch (error) {
console.error('Error merging calendars:', error);
res.status(500).json({ error: 'Failed to merge calendars' });
}
});
// Serve the merged calendar file and refresh if older than an hour
app.get('/calendar/:name', async (req, res) => {
const calendarName = req.params.name;
const icsFilePath = path.resolve(MERGED_CALENDARS_DIR, `${calendarName}.ics`);
const jsonFilePath = path.resolve(MERGED_CALENDARS_DIR, `${calendarName}.json`);
try {
// Check if the .ics file exists
if (fs.existsSync(icsFilePath)) {
const stats = fs.statSync(icsFilePath);
const lastModified = new Date(stats.mtime);
const now = new Date();
// Check if the file is older than one hour
if (now - lastModified > 60 * 60 * 1000) {
console .log('Refreshing calendar data...');
// Read the JSON file to get the source URL and other details
const jsonData = JSON.parse(fs.readFileSync(jsonFilePath, 'utf8'));
const { calendars } = jsonData;
// Fetch calendar data for each merged calendar
const promises = calendars.map((calendar) => {
return axios.get(calendar.url)
.then((response) => {
return {
data: response.data,
prefix: calendar.prefix,
override: calendar.override,
};
})
.catch((error) => {
console.error(error);
return null;
});
});
const results = await Promise.all(promises);
// Filter out any failed requests
const validResults = results.filter((result) => result !== null);
// Create a new iCalendar instance
const calendar = icalGenerator({ name: calendarName });
// Parse calendar data
validResults.forEach((result) => {
const parsed = ICAL.parse(result.data);
const component = new ICAL.Component(parsed);
const events = component.getAllSubcomponents('vevent');
events.forEach((event) => {
const vevent = new ICAL.Event(event);
const start = vevent.startDate.toJSDate();
const end = vevent.endDate.toJSDate();
const summary = result.override ? result.prefix : `${result.prefix} ${vevent.summary}`;
if (vevent.startDate.isDate) {
calendar.createEvent({
start: start.toISOString().split('T')[0],
end: end.toISOString().split('T')[0],
summary: summary,
allDay: true,
});
} else {
calendar.createEvent({
start: start,
end: end,
summary: summary,
});
}
});
});
// Save the calendar to a file
fs.writeFileSync(icsFilePath, calendar.toString());
console.log('Calendar data refreshed.');
}
} else {
return res.status(404).json({ error: 'Calendar not found.' });
}
// Return the contents of the .ics file
res.setHeader('Content-Type', 'text/calendar');
res.sendFile(icsFilePath);
} catch (error) {
console.error(error);
res.status(500).json({ error: 'Failed to retrieve calendar data.' });
}
});
//function to save calendar data to seperate .json files
function saveCalendarData(calendarId, linkGroupName, calendars) {
const calendarFile = `${MERGED_CALENDARS_DIR}/${calendarId}.json`;
const calendarData = {
id: calendarId,
linkGroupName: linkGroupName,
calendars: calendars
};
try {
fs.writeFileSync(calendarFile, JSON.stringify(calendarData, null, 2));
} catch (error) {
console.error('Error writing to calendar file:', error);
}
}
// Start the server
if (process.env.NODE_ENV !== 'test') {
const port = 3000;
app.listen(port, () => {
console.log(`Server started on port ${port}`);
});
}
export default app;

6
src/app.js Normal file
View file

@ -0,0 +1,6 @@
import server from './server.js';
const port = process.env.NODE_PORT || 3012;
server.listen(port, () => {
console.log(`Server started on port ${port}`);
});

138
src/calendarUtil.js Normal file
View file

@ -0,0 +1,138 @@
import ICAL from './lib/ical.timezones.js';
import fs from 'fs';
import path from 'path';
import axios from 'axios';
import logger from './logger.js';
export const MERGED_CALENDARS_DIR = path.join(process.cwd(), 'calendar');
// Ensure the merged calendars directory exists
fs.mkdirSync(MERGED_CALENDARS_DIR, { recursive: true });
// Utility to sanitize filenames
export const sanitizeFilename = (filename) => filename.replace(/[<>:"/\\|?* ]/g, '_');
// Fetch calendar data from URL or file
export async function fetchCalendarData(calendar) {
const isFilePath = !calendar.url.startsWith('http');
if (isFilePath) {
// logger.debug(`Reading calendar from file: ${calendar.url}`);
return { data: fs.readFileSync(path.resolve(calendar.url), 'utf-8'), ...calendar };
}
try {
// First try the original URL
const initialResponse = await axios.get(calendar.url);
return { data: initialResponse.data, ...calendar };
} catch (initialError) {
logger.debug(`Initial fetch failed, trying extension adjustment for: ${calendar.url}`);
// Determine alternate URL version
const altUrl = calendar.url.endsWith('.ics')
? calendar.url.slice(0, -4) // Remove .ics
: calendar.url + '.ics'; // Add .ics
try {
// Try the alternate version
const altResponse = await axios.get(altUrl);
logger.debug(`Success with adjusted URL: ${altUrl}`);
return { data: altResponse.data, ...calendar };
} catch (altError) {
logger.error(`Both URL versions failed:
Original: ${calendar.url}
Adjusted: ${altUrl}`);
throw new Error(`Calendar fetch failed for both URL versions`);
}
}
}
// Create a top-level VCALENDAR component
export function createCalendarComponent(name) {
logger.info(`Creating calendar component with name: ${name}`);
const calendarComponent = new ICAL.Component(['vcalendar', [], []]);
calendarComponent.updatePropertyWithValue('name', name);
calendarComponent.updatePropertyWithValue('prodid', '-//CalMerge//Calendar Merger 1.0//EN');
calendarComponent.updatePropertyWithValue('version', '2.0');
calendarComponent.updatePropertyWithValue('calscale', 'GREGORIAN');
return calendarComponent;
}
// Add events to the calendar component
export function addEventsToCalendar(newCalendar, calendars) {
let defaultTimeZone = null; // To store the first found X-WR-TIMEZONE
calendars.forEach((calendarRaw) => {
try {
const { data, prefix, override } = calendarRaw; // Extract prefix and override
const calendar = new ICAL.Component(ICAL.parse(calendarRaw.data));
// Extract METHOD from the parsed data (if available)
const method = calendar.getFirstPropertyValue('method');
if (method) {
logger.info(`Extracted METHOD: ${method}`);
// Only add the METHOD property once
if (!newCalendar.getFirstPropertyValue('method')) {
newCalendar.updatePropertyWithValue('method', method.toUpperCase());
}
}
// Extract X-WR-TIMEZONE if available
const wrTimeZone = calendar.getFirstPropertyValue('x-wr-timezone');
if (wrTimeZone) {
logger.info(`Extracted X-WR-TIMEZONE: ${wrTimeZone}`);
// Set it as the default if not already set
if (!defaultTimeZone) {
defaultTimeZone = wrTimeZone;
if (!newCalendar.getFirstPropertyValue('x-wr-timezone')) {
newCalendar.updatePropertyWithValue('x-wr-timezone', defaultTimeZone);
}
}
}
// Extract and add VTIMEZONE components
const timezones = calendar.getAllSubcomponents('vtimezone');
timezones.forEach((timezone) => {
const tzid = timezone.getFirstPropertyValue('tzid');
if (!newCalendar.getFirstSubcomponent((comp) => comp.name === 'vtimezone' && comp.getFirstPropertyValue('tzid') === tzid)) {
logger.debug(`Adding VTIMEZONE: ${tzid}`);
newCalendar.addSubcomponent(timezone);
}
});
// Process VEVENT components
calendar.getAllSubcomponents('vevent').forEach((vevent) => {
const event = new ICAL.Event(vevent);
const newEvent = new ICAL.Event();
newEvent.uid = event.uid;
newEvent.startDate = event.startDate;
newEvent.endDate = event.endDate;
const dtstamp = vevent.getFirstPropertyValue('dtstamp');
if (dtstamp) newEvent.component.updatePropertyWithValue('dtstamp', dtstamp);
if (override) {
newEvent.summary = prefix || 'Busy';
} else {
newEvent.summary = prefix ? `${prefix} ${event.summary}` : event.summary;
if (event.location) newEvent.location = event.location;
}
const rrule = vevent.getFirstPropertyValue('rrule');
if (rrule) newEvent.component.updatePropertyWithValue('rrule', rrule);
// Add the VEVENT to the calendar
newCalendar.addSubcomponent(newEvent.component);
});
} catch (error) {
logger.error(`Error processing calendar: ${error.message}`);
}
});
}
// Save calendar data to file
export function saveCalendarFile(filename, content) {
const normalizedContent = content.replace(/\r?\n/g, '\r\n').trimEnd(); // Normalize to CRLF
const filePath = path.join(MERGED_CALENDARS_DIR, filename);
logger.info(`Saving calendar data to file: ${filePath}`);
fs.writeFileSync(filePath, normalizedContent);
return filePath;
}

9501
src/lib/ical.cjs Normal file

File diff suppressed because it is too large Load diff

348
src/lib/ical.timezones.js Normal file
View file

@ -0,0 +1,348 @@
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
const ICAL = require('./ical.cjs');
(function() {
function register(tzdata) { ICAL.TimezoneService.register(ICAL.Component.fromString("BEGIN:VTIMEZONE\r\n" + tzdata + "\r\nEND:VTIMEZONE")) };
ICAL.TimezoneService.IANA_TZDB_VERSION = "2024b";
register("TZID:Africa/Abidjan\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Abidjan\r\nBEGIN:STANDARD\r\nTZNAME:GMT\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Algiers\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Algiers\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Bissau\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Bissau\r\nBEGIN:STANDARD\r\nTZNAME:GMT\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Cairo\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Cairo\r\nBEGIN:DAYLIGHT\r\nTZNAME:EEST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700424T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=-1FR\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701030T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1FR\r\nEND:STANDARD");
register("TZID:Africa/Casablanca\r\nTZUNTIL:20870511T020001Z\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Casablanca\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Ceuta\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Ceuta\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Africa/El_Aaiun\r\nTZUNTIL:20870511T020001Z\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/El_Aaiun\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Johannesburg\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Johannesburg\r\nBEGIN:STANDARD\r\nTZNAME:SAST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Juba\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Juba\r\nBEGIN:STANDARD\r\nTZNAME:CAT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Khartoum\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Khartoum\r\nBEGIN:STANDARD\r\nTZNAME:CAT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Lagos\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Lagos\r\nBEGIN:STANDARD\r\nTZNAME:WAT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Maputo\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Maputo\r\nBEGIN:STANDARD\r\nTZNAME:CAT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Monrovia\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Monrovia\r\nBEGIN:STANDARD\r\nTZNAME:GMT\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Nairobi\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Nairobi\r\nBEGIN:STANDARD\r\nTZNAME:EAT\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Ndjamena\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Ndjamena\r\nBEGIN:STANDARD\r\nTZNAME:WAT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Sao_Tome\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Sao_Tome\r\nBEGIN:STANDARD\r\nTZNAME:GMT\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Tripoli\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Tripoli\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Tunis\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Tunis\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Windhoek\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Windhoek\r\nBEGIN:STANDARD\r\nTZNAME:CAT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Adak\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Adak\r\nBEGIN:DAYLIGHT\r\nTZNAME:HDT\r\nTZOFFSETFROM:-1000\r\nTZOFFSETTO:-0900\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:HST\r\nTZOFFSETFROM:-0900\r\nTZOFFSETTO:-1000\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Anchorage\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Anchorage\r\nBEGIN:DAYLIGHT\r\nTZNAME:AKDT\r\nTZOFFSETFROM:-0900\r\nTZOFFSETTO:-0800\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:AKST\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0900\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Araguaina\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Araguaina\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Argentina/Buenos_Aires\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Argentina/Buenos_Aires\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Argentina/Catamarca\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Argentina/Catamarca\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Argentina/Cordoba\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Argentina/Cordoba\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Argentina/Jujuy\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Argentina/Jujuy\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Argentina/La_Rioja\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Argentina/La_Rioja\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Argentina/Mendoza\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Argentina/Mendoza\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Argentina/Rio_Gallegos\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Argentina/Rio_Gallegos\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Argentina/Salta\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Argentina/Salta\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Argentina/San_Juan\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Argentina/San_Juan\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Argentina/San_Luis\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Argentina/San_Luis\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Argentina/Tucuman\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Argentina/Tucuman\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Argentina/Ushuaia\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Argentina/Ushuaia\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Asuncion\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Asuncion\r\nBEGIN:DAYLIGHT\r\nTZNAME:%z\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0300\r\nDTSTART:19701004T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0400\r\nDTSTART:19700322T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=4SU\r\nEND:STANDARD");
register("TZID:America/Bahia\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Bahia\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Bahia_Banderas\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Bahia_Banderas\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Barbados\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Barbados\r\nBEGIN:STANDARD\r\nTZNAME:AST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Belem\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Belem\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Belize\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Belize\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Boa_Vista\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Boa_Vista\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Bogota\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Bogota\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Boise\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Boise\r\nBEGIN:DAYLIGHT\r\nTZNAME:MDT\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0600\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:MST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0700\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Cambridge_Bay\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Cambridge_Bay\r\nBEGIN:DAYLIGHT\r\nTZNAME:MDT\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0600\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:MST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0700\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Campo_Grande\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Campo_Grande\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Cancun\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Cancun\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Caracas\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Caracas\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Cayenne\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Cayenne\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Chicago\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Chicago\r\nBEGIN:DAYLIGHT\r\nTZNAME:CDT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Chihuahua\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Chihuahua\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Ciudad_Juarez\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Ciudad_Juarez\r\nBEGIN:DAYLIGHT\r\nTZNAME:MDT\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0600\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:MST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0700\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Costa_Rica\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Costa_Rica\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Cuiaba\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Cuiaba\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Danmarkshavn\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Danmarkshavn\r\nBEGIN:STANDARD\r\nTZNAME:GMT\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Dawson\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Dawson\r\nBEGIN:STANDARD\r\nTZNAME:MST\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Dawson_Creek\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Dawson_Creek\r\nBEGIN:STANDARD\r\nTZNAME:MST\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Denver\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Denver\r\nBEGIN:DAYLIGHT\r\nTZNAME:MDT\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0600\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:MST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0700\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Detroit\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Detroit\r\nBEGIN:DAYLIGHT\r\nTZNAME:EDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Edmonton\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Edmonton\r\nBEGIN:DAYLIGHT\r\nTZNAME:MDT\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0600\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:MST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0700\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Eirunepe\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Eirunepe\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/El_Salvador\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/El_Salvador\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Fort_Nelson\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Fort_Nelson\r\nBEGIN:STANDARD\r\nTZNAME:MST\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Fortaleza\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Fortaleza\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Glace_Bay\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Glace_Bay\r\nBEGIN:DAYLIGHT\r\nTZNAME:ADT\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0300\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:AST\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0400\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Goose_Bay\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Goose_Bay\r\nBEGIN:STANDARD\r\nTZNAME:AST\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0400\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:ADT\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0300\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT");
register("TZID:America/Grand_Turk\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Grand_Turk\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:EDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT");
register("TZID:America/Guatemala\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Guatemala\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Guayaquil\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Guayaquil\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Guyana\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Guyana\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Halifax\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Halifax\r\nBEGIN:DAYLIGHT\r\nTZNAME:ADT\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0300\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:AST\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0400\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Havana\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Havana\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nDTSTART:19701101T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:CDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nDTSTART:19700308T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT");
register("TZID:America/Hermosillo\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Hermosillo\r\nBEGIN:STANDARD\r\nTZNAME:MST\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Indiana/Indianapolis\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Indiana/Indianapolis\r\nBEGIN:DAYLIGHT\r\nTZNAME:EDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Indiana/Knox\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Indiana/Knox\r\nBEGIN:DAYLIGHT\r\nTZNAME:CDT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Indiana/Marengo\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Indiana/Marengo\r\nBEGIN:DAYLIGHT\r\nTZNAME:EDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Indiana/Petersburg\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Indiana/Petersburg\r\nBEGIN:DAYLIGHT\r\nTZNAME:EDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Indiana/Tell_City\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Indiana/Tell_City\r\nBEGIN:DAYLIGHT\r\nTZNAME:CDT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Indiana/Vevay\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Indiana/Vevay\r\nBEGIN:DAYLIGHT\r\nTZNAME:EDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Indiana/Vincennes\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Indiana/Vincennes\r\nBEGIN:DAYLIGHT\r\nTZNAME:EDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Indiana/Winamac\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Indiana/Winamac\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:EDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT");
register("TZID:America/Inuvik\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Inuvik\r\nBEGIN:DAYLIGHT\r\nTZNAME:MDT\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0600\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:MST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0700\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Iqaluit\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Iqaluit\r\nBEGIN:DAYLIGHT\r\nTZNAME:EDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Jamaica\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Jamaica\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Juneau\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Juneau\r\nBEGIN:DAYLIGHT\r\nTZNAME:AKDT\r\nTZOFFSETFROM:-0900\r\nTZOFFSETTO:-0800\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:AKST\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0900\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Kentucky/Louisville\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Kentucky/Louisville\r\nBEGIN:DAYLIGHT\r\nTZNAME:EDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Kentucky/Monticello\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Kentucky/Monticello\r\nBEGIN:DAYLIGHT\r\nTZNAME:EDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/La_Paz\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/La_Paz\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Lima\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Lima\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Los_Angeles\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Los_Angeles\r\nBEGIN:DAYLIGHT\r\nTZNAME:PDT\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0700\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:PST\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0800\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Maceio\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Maceio\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Managua\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Managua\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Manaus\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Manaus\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Martinique\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Martinique\r\nBEGIN:STANDARD\r\nTZNAME:AST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Matamoros\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Matamoros\r\nBEGIN:DAYLIGHT\r\nTZNAME:CDT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Mazatlan\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Mazatlan\r\nBEGIN:STANDARD\r\nTZNAME:MST\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Menominee\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Menominee\r\nBEGIN:DAYLIGHT\r\nTZNAME:CDT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Merida\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Merida\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Metlakatla\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Metlakatla\r\nBEGIN:DAYLIGHT\r\nTZNAME:AKDT\r\nTZOFFSETFROM:-0900\r\nTZOFFSETTO:-0800\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:AKST\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0900\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Mexico_City\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Mexico_City\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Miquelon\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Miquelon\r\nBEGIN:DAYLIGHT\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0200\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0200\r\nTZOFFSETTO:-0300\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Moncton\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Moncton\r\nBEGIN:DAYLIGHT\r\nTZNAME:ADT\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0300\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:AST\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0400\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Monterrey\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Monterrey\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Montevideo\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Montevideo\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/New_York\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/New_York\r\nBEGIN:DAYLIGHT\r\nTZNAME:EDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Nome\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Nome\r\nBEGIN:DAYLIGHT\r\nTZNAME:AKDT\r\nTZOFFSETFROM:-0900\r\nTZOFFSETTO:-0800\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:AKST\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0900\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Noronha\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Noronha\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0200\r\nTZOFFSETTO:-0200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/North_Dakota/Beulah\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/North_Dakota/Beulah\r\nBEGIN:DAYLIGHT\r\nTZNAME:CDT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/North_Dakota/Center\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/North_Dakota/Center\r\nBEGIN:DAYLIGHT\r\nTZNAME:CDT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/North_Dakota/New_Salem\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/North_Dakota/New_Salem\r\nBEGIN:DAYLIGHT\r\nTZNAME:CDT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Nuuk\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Nuuk\r\nBEGIN:DAYLIGHT\r\nTZNAME:%z\r\nTZOFFSETFROM:-0200\r\nTZOFFSETTO:-0100\r\nDTSTART:19700328T230000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SA\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0100\r\nTZOFFSETTO:-0200\r\nDTSTART:19701025T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:America/Ojinaga\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Ojinaga\r\nBEGIN:DAYLIGHT\r\nTZNAME:CDT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Panama\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Panama\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Paramaribo\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Paramaribo\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Phoenix\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Phoenix\r\nBEGIN:STANDARD\r\nTZNAME:MST\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Port-au-Prince\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Port-au-Prince\r\nBEGIN:DAYLIGHT\r\nTZNAME:EDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Porto_Velho\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Porto_Velho\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Puerto_Rico\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Puerto_Rico\r\nBEGIN:STANDARD\r\nTZNAME:AST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Punta_Arenas\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Punta_Arenas\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Rankin_Inlet\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Rankin_Inlet\r\nBEGIN:DAYLIGHT\r\nTZNAME:CDT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Recife\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Recife\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Regina\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Regina\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Resolute\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Resolute\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:CDT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT");
register("TZID:America/Rio_Branco\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Rio_Branco\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Santarem\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Santarem\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Santiago\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Santiago\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0400\r\nDTSTART:19700405T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:%z\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0300\r\nDTSTART:19700906T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=1SU\r\nEND:DAYLIGHT");
register("TZID:America/Santo_Domingo\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Santo_Domingo\r\nBEGIN:STANDARD\r\nTZNAME:AST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Sao_Paulo\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Sao_Paulo\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Scoresbysund\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Scoresbysund\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0100\r\nTZOFFSETTO:-0200\r\nDTSTART:19701025T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:%z\r\nTZOFFSETFROM:-0200\r\nTZOFFSETTO:-0100\r\nDTSTART:19700328T230000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SA\r\nEND:DAYLIGHT");
register("TZID:America/Sitka\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Sitka\r\nBEGIN:DAYLIGHT\r\nTZNAME:AKDT\r\nTZOFFSETFROM:-0900\r\nTZOFFSETTO:-0800\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:AKST\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0900\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/St_Johns\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/St_Johns\r\nBEGIN:STANDARD\r\nTZNAME:NST\r\nTZOFFSETFROM:-0230\r\nTZOFFSETTO:-0330\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:NDT\r\nTZOFFSETFROM:-0330\r\nTZOFFSETTO:-0230\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT");
register("TZID:America/Swift_Current\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Swift_Current\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Tegucigalpa\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Tegucigalpa\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Thule\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Thule\r\nBEGIN:DAYLIGHT\r\nTZNAME:ADT\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0300\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:AST\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0400\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Tijuana\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Tijuana\r\nBEGIN:DAYLIGHT\r\nTZNAME:PDT\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0700\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:PST\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0800\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Toronto\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Toronto\r\nBEGIN:DAYLIGHT\r\nTZNAME:EDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Vancouver\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Vancouver\r\nBEGIN:DAYLIGHT\r\nTZNAME:PDT\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0700\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:PST\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0800\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Whitehorse\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Whitehorse\r\nBEGIN:STANDARD\r\nTZNAME:MST\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Winnipeg\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Winnipeg\r\nBEGIN:DAYLIGHT\r\nTZNAME:CDT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Yakutat\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Yakutat\r\nBEGIN:DAYLIGHT\r\nTZNAME:AKDT\r\nTZOFFSETFROM:-0900\r\nTZOFFSETTO:-0800\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:AKST\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0900\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:Antarctica/Casey\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Antarctica/Casey\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Antarctica/Davis\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Antarctica/Davis\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Antarctica/Macquarie\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Antarctica/Macquarie\r\nBEGIN:STANDARD\r\nTZNAME:AEST\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1000\r\nDTSTART:19700405T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:AEDT\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1100\r\nDTSTART:19701004T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU\r\nEND:DAYLIGHT");
register("TZID:Antarctica/Mawson\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Antarctica/Mawson\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Antarctica/Palmer\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Antarctica/Palmer\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Antarctica/Rothera\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Antarctica/Rothera\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Antarctica/Troll\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Antarctica/Troll\r\nBEGIN:DAYLIGHT\r\nTZNAME:+02\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:+00\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0000\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Antarctica/Vostok\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Antarctica/Vostok\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Almaty\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Almaty\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Amman\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Amman\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Anadyr\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Anadyr\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Aqtau\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Aqtau\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Aqtobe\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Aqtobe\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Ashgabat\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Ashgabat\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Atyrau\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Atyrau\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Baghdad\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Baghdad\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Baku\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Baku\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Bangkok\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Bangkok\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Barnaul\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Barnaul\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Beirut\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Beirut\r\nBEGIN:DAYLIGHT\r\nTZNAME:EEST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700329T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701025T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Asia/Bishkek\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Bishkek\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0600\r\nTZOFFSETTO:+0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Chita\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Chita\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0900\r\nTZOFFSETTO:+0900\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Colombo\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Colombo\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0530\r\nTZOFFSETTO:+0530\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Damascus\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Damascus\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Dhaka\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Dhaka\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0600\r\nTZOFFSETTO:+0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Dili\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Dili\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0900\r\nTZOFFSETTO:+0900\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Dubai\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Dubai\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Dushanbe\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Dushanbe\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Famagusta\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Famagusta\r\nBEGIN:DAYLIGHT\r\nTZNAME:EEST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Asia/Gaza\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Gaza\r\nBEGIN:DAYLIGHT\r\nTZNAME:EEST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700328T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SA\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701024T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SA\r\nEND:STANDARD");
register("TZID:Asia/Hebron\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Hebron\r\nBEGIN:DAYLIGHT\r\nTZNAME:EEST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700328T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SA\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701024T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SA\r\nEND:STANDARD");
register("TZID:Asia/Ho_Chi_Minh\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Ho_Chi_Minh\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Hong_Kong\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Hong_Kong\r\nBEGIN:STANDARD\r\nTZNAME:HKT\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Hovd\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Hovd\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Irkutsk\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Irkutsk\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Jakarta\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Jakarta\r\nBEGIN:STANDARD\r\nTZNAME:WIB\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Jayapura\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Jayapura\r\nBEGIN:STANDARD\r\nTZNAME:WIT\r\nTZOFFSETFROM:+0900\r\nTZOFFSETTO:+0900\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Jerusalem\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Jerusalem\r\nBEGIN:DAYLIGHT\r\nTZNAME:IDT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700327T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1FR\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:IST\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701025T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Asia/Kabul\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Kabul\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0430\r\nTZOFFSETTO:+0430\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Kamchatka\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Kamchatka\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Karachi\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Karachi\r\nBEGIN:STANDARD\r\nTZNAME:PKT\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Kathmandu\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Kathmandu\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0545\r\nTZOFFSETTO:+0545\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Khandyga\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Khandyga\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0900\r\nTZOFFSETTO:+0900\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Kolkata\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Kolkata\r\nBEGIN:STANDARD\r\nTZNAME:IST\r\nTZOFFSETFROM:+0530\r\nTZOFFSETTO:+0530\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Krasnoyarsk\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Krasnoyarsk\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Kuching\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Kuching\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Macau\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Macau\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Magadan\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Magadan\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Makassar\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Makassar\r\nBEGIN:STANDARD\r\nTZNAME:WITA\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Manila\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Manila\r\nBEGIN:STANDARD\r\nTZNAME:PST\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Nicosia\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Nicosia\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:EEST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT");
register("TZID:Asia/Novokuznetsk\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Novokuznetsk\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Novosibirsk\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Novosibirsk\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Omsk\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Omsk\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0600\r\nTZOFFSETTO:+0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Oral\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Oral\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Pontianak\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Pontianak\r\nBEGIN:STANDARD\r\nTZNAME:WIB\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Pyongyang\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Pyongyang\r\nBEGIN:STANDARD\r\nTZNAME:KST\r\nTZOFFSETFROM:+0900\r\nTZOFFSETTO:+0900\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Qatar\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Qatar\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Qostanay\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Qostanay\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Qyzylorda\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Qyzylorda\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Riyadh\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Riyadh\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Sakhalin\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Sakhalin\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Samarkand\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Samarkand\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Seoul\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Seoul\r\nBEGIN:STANDARD\r\nTZNAME:KST\r\nTZOFFSETFROM:+0900\r\nTZOFFSETTO:+0900\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Shanghai\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Shanghai\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Singapore\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Singapore\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Srednekolymsk\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Srednekolymsk\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Taipei\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Taipei\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Tashkent\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Tashkent\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Tbilisi\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Tbilisi\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Tehran\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Tehran\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0330\r\nTZOFFSETTO:+0330\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Thimphu\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Thimphu\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0600\r\nTZOFFSETTO:+0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Tokyo\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Tokyo\r\nBEGIN:STANDARD\r\nTZNAME:JST\r\nTZOFFSETFROM:+0900\r\nTZOFFSETTO:+0900\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Tomsk\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Tomsk\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Ulaanbaatar\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Ulaanbaatar\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Urumqi\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Urumqi\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0600\r\nTZOFFSETTO:+0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Ust-Nera\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Ust-Nera\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Vladivostok\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Vladivostok\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Yakutsk\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Yakutsk\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0900\r\nTZOFFSETTO:+0900\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Yangon\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Yangon\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0630\r\nTZOFFSETTO:+0630\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Yekaterinburg\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Yekaterinburg\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Yerevan\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Yerevan\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Atlantic/Azores\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Atlantic/Azores\r\nBEGIN:DAYLIGHT\r\nTZNAME:%z\r\nTZOFFSETFROM:-0100\r\nTZOFFSETTO:+0000\r\nDTSTART:19700329T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:-0100\r\nDTSTART:19701025T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Atlantic/Bermuda\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Atlantic/Bermuda\r\nBEGIN:DAYLIGHT\r\nTZNAME:ADT\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0300\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:AST\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0400\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:Atlantic/Canary\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Atlantic/Canary\r\nBEGIN:DAYLIGHT\r\nTZNAME:WEST\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0100\r\nDTSTART:19700329T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:WET\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0000\r\nDTSTART:19701025T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Atlantic/Cape_Verde\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Atlantic/Cape_Verde\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0100\r\nTZOFFSETTO:-0100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Atlantic/Faroe\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Atlantic/Faroe\r\nBEGIN:DAYLIGHT\r\nTZNAME:WEST\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0100\r\nDTSTART:19700329T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:WET\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0000\r\nDTSTART:19701025T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Atlantic/Madeira\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Atlantic/Madeira\r\nBEGIN:DAYLIGHT\r\nTZNAME:WEST\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0100\r\nDTSTART:19700329T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:WET\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0000\r\nDTSTART:19701025T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Atlantic/South_Georgia\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Atlantic/South_Georgia\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0200\r\nTZOFFSETTO:-0200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Atlantic/Stanley\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Atlantic/Stanley\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Australia/Adelaide\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Australia/Adelaide\r\nBEGIN:STANDARD\r\nTZNAME:ACST\r\nTZOFFSETFROM:+1030\r\nTZOFFSETTO:+0930\r\nDTSTART:19700405T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:ACDT\r\nTZOFFSETFROM:+0930\r\nTZOFFSETTO:+1030\r\nDTSTART:19701004T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU\r\nEND:DAYLIGHT");
register("TZID:Australia/Brisbane\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Australia/Brisbane\r\nBEGIN:STANDARD\r\nTZNAME:AEST\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Australia/Broken_Hill\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Australia/Broken_Hill\r\nBEGIN:STANDARD\r\nTZNAME:ACST\r\nTZOFFSETFROM:+1030\r\nTZOFFSETTO:+0930\r\nDTSTART:19700405T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:ACDT\r\nTZOFFSETFROM:+0930\r\nTZOFFSETTO:+1030\r\nDTSTART:19701004T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU\r\nEND:DAYLIGHT");
register("TZID:Australia/Darwin\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Australia/Darwin\r\nBEGIN:STANDARD\r\nTZNAME:ACST\r\nTZOFFSETFROM:+0930\r\nTZOFFSETTO:+0930\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Australia/Eucla\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Australia/Eucla\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0845\r\nTZOFFSETTO:+0845\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Australia/Hobart\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Australia/Hobart\r\nBEGIN:DAYLIGHT\r\nTZNAME:AEDT\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1100\r\nDTSTART:19701004T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:AEST\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1000\r\nDTSTART:19700405T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:Australia/Lindeman\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Australia/Lindeman\r\nBEGIN:STANDARD\r\nTZNAME:AEST\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Australia/Lord_Howe\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Australia/Lord_Howe\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1030\r\nDTSTART:19700405T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:%z\r\nTZOFFSETFROM:+1030\r\nTZOFFSETTO:+1100\r\nDTSTART:19701004T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU\r\nEND:DAYLIGHT");
register("TZID:Australia/Melbourne\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Australia/Melbourne\r\nBEGIN:STANDARD\r\nTZNAME:AEST\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1000\r\nDTSTART:19700405T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:AEDT\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1100\r\nDTSTART:19701004T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU\r\nEND:DAYLIGHT");
register("TZID:Australia/Perth\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Australia/Perth\r\nBEGIN:STANDARD\r\nTZNAME:AWST\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Australia/Sydney\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Australia/Sydney\r\nBEGIN:STANDARD\r\nTZNAME:AEST\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1000\r\nDTSTART:19700405T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:AEDT\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1100\r\nDTSTART:19701004T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU\r\nEND:DAYLIGHT");
register("TZID:Etc/GMT\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT\r\nBEGIN:STANDARD\r\nTZNAME:GMT\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT+1\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT+1\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0100\r\nTZOFFSETTO:-0100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT+10\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT+10\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-1000\r\nTZOFFSETTO:-1000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT+11\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT+11\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-1100\r\nTZOFFSETTO:-1100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT+12\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT+12\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-1200\r\nTZOFFSETTO:-1200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT+2\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT+2\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0200\r\nTZOFFSETTO:-0200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT+3\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT+3\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT+4\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT+4\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT+5\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT+5\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT+6\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT+6\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT+7\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT+7\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT+8\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT+8\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0800\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT+9\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT+9\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0900\r\nTZOFFSETTO:-0900\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT-1\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT-1\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT-10\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT-10\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT-11\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT-11\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT-12\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT-12\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT-13\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT-13\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1300\r\nTZOFFSETTO:+1300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT-14\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT-14\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1400\r\nTZOFFSETTO:+1400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT-2\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT-2\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT-3\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT-3\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT-4\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT-4\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT-5\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT-5\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT-6\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT-6\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0600\r\nTZOFFSETTO:+0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT-7\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT-7\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT-8\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT-8\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT-9\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT-9\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0900\r\nTZOFFSETTO:+0900\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/UTC\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/UTC\r\nBEGIN:STANDARD\r\nTZNAME:UTC\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Europe/Andorra\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Andorra\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Astrakhan\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Astrakhan\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Europe/Athens\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Athens\r\nBEGIN:DAYLIGHT\r\nTZNAME:EEST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Belgrade\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Belgrade\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Berlin\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Berlin\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Brussels\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Brussels\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Bucharest\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Bucharest\r\nBEGIN:DAYLIGHT\r\nTZNAME:EEST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Budapest\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Budapest\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Chisinau\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Chisinau\r\nBEGIN:DAYLIGHT\r\nTZNAME:EEST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Dublin\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Dublin\r\nBEGIN:STANDARD\r\nTZNAME:IST\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0100\r\nDTSTART:19700329T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:GMT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0000\r\nDTSTART:19701025T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:DAYLIGHT");
register("TZID:Europe/Gibraltar\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Gibraltar\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Helsinki\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Helsinki\r\nBEGIN:DAYLIGHT\r\nTZNAME:EEST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Istanbul\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Istanbul\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Europe/Kaliningrad\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Kaliningrad\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Europe/Kirov\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Kirov\r\nBEGIN:STANDARD\r\nTZNAME:MSK\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Europe/Kyiv\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Kyiv\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:EEST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT");
register("TZID:Europe/Lisbon\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Lisbon\r\nBEGIN:STANDARD\r\nTZNAME:WET\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0000\r\nDTSTART:19701025T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:WEST\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0100\r\nDTSTART:19700329T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT");
register("TZID:Europe/London\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/London\r\nBEGIN:DAYLIGHT\r\nTZNAME:BST\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0100\r\nDTSTART:19700329T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:GMT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0000\r\nDTSTART:19701025T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Madrid\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Madrid\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Malta\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Malta\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Minsk\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Minsk\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Europe/Moscow\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Moscow\r\nBEGIN:STANDARD\r\nTZNAME:MSK\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Europe/Paris\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Paris\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Prague\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Prague\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Riga\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Riga\r\nBEGIN:DAYLIGHT\r\nTZNAME:EEST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Rome\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Rome\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Samara\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Samara\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Europe/Saratov\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Saratov\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Europe/Simferopol\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Simferopol\r\nBEGIN:STANDARD\r\nTZNAME:MSK\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Europe/Sofia\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Sofia\r\nBEGIN:DAYLIGHT\r\nTZNAME:EEST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Tallinn\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Tallinn\r\nBEGIN:DAYLIGHT\r\nTZNAME:EEST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Tirane\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Tirane\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Ulyanovsk\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Ulyanovsk\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Europe/Vienna\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Vienna\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Vilnius\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Vilnius\r\nBEGIN:DAYLIGHT\r\nTZNAME:EEST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Volgograd\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Volgograd\r\nBEGIN:STANDARD\r\nTZNAME:MSK\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Europe/Warsaw\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Warsaw\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Zurich\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Zurich\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Indian/Chagos\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Indian/Chagos\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0600\r\nTZOFFSETTO:+0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Indian/Maldives\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Indian/Maldives\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Indian/Mauritius\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Indian/Mauritius\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Apia\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Apia\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1300\r\nTZOFFSETTO:+1300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Auckland\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Auckland\r\nBEGIN:DAYLIGHT\r\nTZNAME:NZDT\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1300\r\nDTSTART:19700927T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:NZST\r\nTZOFFSETFROM:+1300\r\nTZOFFSETTO:+1200\r\nDTSTART:19700405T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:Pacific/Bougainville\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Bougainville\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Chatham\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Chatham\r\nBEGIN:DAYLIGHT\r\nTZNAME:%z\r\nTZOFFSETFROM:+1245\r\nTZOFFSETTO:+1345\r\nDTSTART:19700927T024500\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1345\r\nTZOFFSETTO:+1245\r\nDTSTART:19700405T034500\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:Pacific/Easter\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Easter\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nDTSTART:19700404T220000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SA\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:%z\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nDTSTART:19700905T220000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=1SA\r\nEND:DAYLIGHT");
register("TZID:Pacific/Efate\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Efate\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Fakaofo\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Fakaofo\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1300\r\nTZOFFSETTO:+1300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Fiji\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Fiji\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Galapagos\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Galapagos\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Gambier\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Gambier\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0900\r\nTZOFFSETTO:-0900\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Guadalcanal\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Guadalcanal\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Guam\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Guam\r\nBEGIN:STANDARD\r\nTZNAME:ChST\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Honolulu\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Honolulu\r\nBEGIN:STANDARD\r\nTZNAME:HST\r\nTZOFFSETFROM:-1000\r\nTZOFFSETTO:-1000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Kanton\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Kanton\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1300\r\nTZOFFSETTO:+1300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Kiritimati\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Kiritimati\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1400\r\nTZOFFSETTO:+1400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Kosrae\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Kosrae\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Kwajalein\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Kwajalein\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Marquesas\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Marquesas\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0930\r\nTZOFFSETTO:-0930\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Nauru\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Nauru\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Niue\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Niue\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-1100\r\nTZOFFSETTO:-1100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Norfolk\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Norfolk\r\nBEGIN:DAYLIGHT\r\nTZNAME:%z\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1200\r\nDTSTART:19701004T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1100\r\nDTSTART:19700405T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:Pacific/Noumea\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Noumea\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Pago_Pago\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Pago_Pago\r\nBEGIN:STANDARD\r\nTZNAME:SST\r\nTZOFFSETFROM:-1100\r\nTZOFFSETTO:-1100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Palau\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Palau\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0900\r\nTZOFFSETTO:+0900\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Pitcairn\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Pitcairn\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0800\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Port_Moresby\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Port_Moresby\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Rarotonga\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Rarotonga\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-1000\r\nTZOFFSETTO:-1000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Tahiti\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Tahiti\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-1000\r\nTZOFFSETTO:-1000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Tarawa\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Tarawa\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Tongatapu\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Tongatapu\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1300\r\nTZOFFSETTO:+1300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
})();
export default ICAL;

24
src/logger.js Normal file
View file

@ -0,0 +1,24 @@
import { createLogger, format, transports } from 'winston';
const { combine, timestamp, printf, colorize } = format;
// Define custom log format
const logFormat = printf(({ level, message, timestamp }) => {
return `[${timestamp}] ${level}: ${message}`;
});
//create logger
const logger = createLogger({
level: process.env.NODE_ENV === 'production' ? 'info' : 'debug',
format: combine(
timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
colorize(),
logFormat
),
transports: [
new transports.Console(),
new transports.File({ filename: 'logs/calmerge.log' })
]
});
export default logger;

85
src/routes.js Normal file
View file

@ -0,0 +1,85 @@
import express from 'express';
import path from 'path';
import fs from 'fs';
import { fetchCalendarData, sanitizeFilename, createCalendarComponent, addEventsToCalendar, saveCalendarFile, MERGED_CALENDARS_DIR } from './calendarUtil.js';
const router = express.Router();
// Merge calendars endpoint
router.post('/merge', async (req, res) => {
const { linkGroupName, calendars } = req.body;
// Validate the input
if (!linkGroupName || !Array.isArray(calendars) || calendars.length === 0) {
return res.status(400).json({ error: 'Invalid input. Please provide a linkGroupName and at least one calendar.' });
}
try {
// Sanitize the linkGroupName to create a valid filename
const sanitizedLinkGroupName = sanitizeFilename(linkGroupName);
const filename = `${sanitizedLinkGroupName}.ics`;
// Fetch calendar data
const results = await Promise.all(calendars.map(fetchCalendarData));
// Generate merged calendar using ical.js
const calendarComponent = createCalendarComponent(linkGroupName);
addEventsToCalendar(calendarComponent, results);
// Save the calendar to a file
saveCalendarFile(filename, calendarComponent.toString());
// Save the user input and sanitizedLinkGroupName in a separate JSON file
saveCalendarFile(`${sanitizedLinkGroupName}.json`, JSON.stringify({ linkGroupName, calendars }, null, 2));
res.json({ url: `${req.protocol}://${req.get('host')}/calendar/${sanitizedLinkGroupName}` });
} catch (error) {
console.error('Error merging calendars:', error.message);
res.status(500).json({ error: 'Failed to merge calendars' });
}
});
// Refresh calendar if outdated
async function refreshCalendarData(calendarName) {
const jsonFilePath = path.join(MERGED_CALENDARS_DIR, `${calendarName}.json`);
console.log(`Refreshing calendar data for: ${calendarName}`);
// Read the JSON file to get the source URL and other details
const { calendars } = JSON.parse(fs.readFileSync(jsonFilePath, 'utf-8'));
const calendarResults = await Promise.all(calendars.map(fetchCalendarData));
const calendarComponent = createCalendarComponent(calendarName);
addEventsToCalendar(calendarComponent, calendarResults);
saveCalendarFile(`${calendarName}.ics`, calendarComponent.toString());
console.log('Calendar data refreshed and saved.');
}
// Serve the merged calendar file and refresh if older than an hour
router.get('/calendar/:name', async (req, res) => {
const calendarName = req.params.name;
const icsFilePath = path.join(MERGED_CALENDARS_DIR, `${calendarName}.ics`);
try {
// Check if the .ics file exists
console.log(`Serving calendar for: ${calendarName}`);
if (fs.existsSync(icsFilePath)) {
const stats = fs.statSync(icsFilePath);
const isOutdated = new Date() - new Date(stats.mtime) > 60 * 60 * 1000;
if (isOutdated){
console.log(`Calendar ${calendarName} is outdated. Refreshing...`);
await refreshCalendarData(calendarName);
}
res.setHeader('Content-Type', 'text/calendar');
res.sendFile(icsFilePath);
} else {
res.status(404).json({ error: 'Calendar not found.' });
}
} catch (error) {
console.error('Error retrieving calendar data:', error.message);
res.status(500).json({ error: 'Failed to retrieve calendar data.' });
}
});
export default router;

14
src/server.js Normal file
View file

@ -0,0 +1,14 @@
import express from 'express';
import path from 'path';
import routes from './routes.js';
console.log(`Starting server in ${process.cwd()}`);
const app = express();
app.use(express.json());
// Serve static files from the 'public' directory
app.use(express.static(path.join(process.cwd(), 'public')));
app.use('/', routes);
export default app;

View file

@ -1,37 +0,0 @@
body {
font-family: Arial, sans-serif;
}
#merge-form {
max-width: 400px;
margin: 40px auto;
padding: 20px;
border: 1px solid #ccc;
border-radius: 10px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
label {
display: block;
margin-bottom: 10px;
}
input[type="url"], input[type="text"] {
width: 100%;
padding: 10px;
margin-bottom: 20px;
border: 1px solid #ccc;
}
button[type="submit"] {
background-color: #4CAF50;
color: #fff;
padding: 10px 20px;
border: none;
border-radius: 5px;
cursor: pointer;
}
button[type="submit"]:hover {
background-color: #3e8e41;
}

341
test/calendar.test.js Normal file
View file

@ -0,0 +1,341 @@
import request from 'supertest';
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
import { fetchCalendarData } from '../src/calendarUtil.js';
// ESM equivalent of __dirname
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const CALENDARS_DIR = path.join(process.cwd(), 'calendar');
const TEST_CALENDARS_DIR = path.join(__dirname, 'test_calendars');
const EXPECTED_OUTPUTS_DIR = path.join(__dirname, 'expected_outputs');
let server;
process.chdir(__dirname)
const app = await import('../src/server');
describe('Calendar Merging API', () => {
beforeAll(async () => {
// Start the server
server = app.default.listen(0);
});
afterAll(async () => {
// Ensure the server is closed before cleanup
await new Promise(resolve => server.close(resolve));
// Clean up the merged calendars directory after tests
if (fs.existsSync(CALENDARS_DIR)) {
fs.rmSync(CALENDARS_DIR, { recursive: true, force: true });
}
// Optional: Add a delay to ensure all handles are released
await new Promise(resolve => setTimeout(resolve, 100));
});
const getTestCalendarFilename = (filename) => {
return path.join(TEST_CALENDARS_DIR, filename);
};
const loadExpectedOutput = (filename) => {
return fs.readFileSync(path.join(EXPECTED_OUTPUTS_DIR, filename), 'utf8');
};
test('Preserve nextcloud calendar', async () => {
const input = getTestCalendarFilename('nextcloud-minimal.ics');
const response = await request(server)
.post('/merge')
.send({
linkGroupName: 'nextcloud-minimal',
calendars: [
{
url: input,
prefix: '',
override: false,
},
],
});
expect(response.status).toBe(200);
// Check if the file was created in the test directory
const filePath = path.join(CALENDARS_DIR, 'nextcloud-minimal.ics');
console.log('Checking if file exists at:', filePath);
expect(fs.existsSync(filePath)).toBe(true);
// Load expected output
const expectedOutput = fs.readFileSync(input, 'utf8');
const actualOutput = fs.readFileSync(filePath, 'utf8');
//compare
expect(actualOutput).toBe(expectedOutput);
});
test('Preserve google calendar', async () => {
const input = getTestCalendarFilename('google-calendar-minimal.ics');
const response = await request(server)
.post('/merge')
.send({
linkGroupName: 'google-calendar-minimal',
calendars: [
{
url: input,
prefix: '',
override: false,
},
],
});
expect(response.status).toBe(200);
// Check if the file was created in the test directory
const filePath = path.join(CALENDARS_DIR, 'google-calendar-minimal.ics');
console.log('Checking if file exists at:', filePath);
expect(fs.existsSync(filePath)).toBe(true);
// Load expected output
const expectedOutput = fs.readFileSync(input, 'utf8');
const actualOutput = fs.readFileSync(filePath, 'utf8');
//compare
expect(actualOutput).toBe(expectedOutput);
});
test('Preserve date-based calendar', async () => {
const input = getTestCalendarFilename('US_Holidays.ics');
const response = await request(server)
.post('/merge')
.send({
linkGroupName: 'US Holidays',
calendars: [
{
url: input,
prefix: '',
override: false,
},
],
});
expect(response.status).toBe(200);
// Check if the file was created in the test directory
const filePath = path.join(CALENDARS_DIR, 'US_Holidays.ics');
console.log('Checking if file exists at:', filePath);
expect(fs.existsSync(filePath)).toBe(true);
// Load expected output and compare
const expectedOutput = fs.readFileSync(input, 'utf8');
const actualOutput = fs.readFileSync(filePath, 'utf8');
expect(actualOutput).toBe(expectedOutput);
});
test('Merge date-based calendar', async () => {
const response = await request(server)
.post('/merge')
.send({
linkGroupName: 'Date Based Calendar',
calendars: [
{
url: getTestCalendarFilename('holiday_calendar_2023.ics'),
prefix: 'holiday_calendar_2023',
override: false,
},
{
url: getTestCalendarFilename('US_Holidays.ics'),
prefix: 'US_holidays',
override: false,
},
],
});
expect(response.status).toBe(200);
expect(response.body.url).toMatch(new RegExp(`calendar/Date_Based_Calendar`));
// Check if the file was created in the test directory
const filePath = path.join(CALENDARS_DIR, 'Date_Based_Calendar.ics');
console.log('Checking if file exists at:', filePath);
expect(fs.existsSync(filePath)).toBe(true);
// Load expected output and compare
const expectedOutput = loadExpectedOutput('Date_Based_Calendar.ics');
const actualOutput = fs.readFileSync(filePath, 'utf8');
expect(actualOutput).toBe(expectedOutput);
});
//test Merge time-based calendar
test('Merge time-based calendar', async () => {
const input = getTestCalendarFilename('work_task_calendar.ics');
const response = await request(server)
.post('/merge')
.send({
linkGroupName: 'Time Based Calendar',
calendars: [
{
url: getTestCalendarFilename('team_meeting_calendar.ics'), // Time-based calendar
prefix: 'team_meeting_calendar',
override: false,
},
{
url: getTestCalendarFilename('work_task_calendar.ics'), // Time-based calendar
prefix: 'Work_Task',
override: false,
},
],
});
expect(response.status).toBe(200);
expect(response.body.url).toMatch(/calendar\/Time_Based_Calendar/);
// Check if the file was created in the test directory
const filePath = path.join(CALENDARS_DIR, 'Time_Based_Calendar.ics');
expect(fs.existsSync(filePath)).toBe(true);
// Load expected output and compare
const expectedOutput = loadExpectedOutput('Time_Based_Calendar.ics');
const actualOutput = fs.readFileSync(filePath, 'utf8');
expect(actualOutput).toBe(expectedOutput);
});
//test Merge calendar without prefix
test('Merge calendar without prefix', async () => {
const response = await request(server)
.post('/merge')
.send({
linkGroupName: 'No Prefix Calendar',
calendars: [
{
url: getTestCalendarFilename('sf_public_holidays.ics'),
prefix: '',
override: false,
},
],
});
expect(response.status).toBe(200);
expect(response.body.url).toMatch(/calendar\/No_Prefix_Calendar/);
// Check if the file was created in the test directory
const filePath = path.join(CALENDARS_DIR, 'No_Prefix_Calendar.ics');
expect(fs.existsSync(filePath)).toBe(true);
// Load expected output and compare
const expectedOutput = loadExpectedOutput('No_Prefix_Calendar.ics');
const actualOutput = fs.readFileSync(filePath, 'utf8');
expect(actualOutput).toBe(expectedOutput);
});
//test Merge calendar with override
test('Merge calendar with override', async () => {
const response = await request(server)
.post('/merge')
.send({
linkGroupName: 'Override Calendar',
calendars: [
{
url: getTestCalendarFilename('sf_public_holidays.ics'),
prefix: 'Override Event',
override: true,
},
],
});
expect(response.status).toBe(200);
expect(response.body.url).toMatch(/calendar\/Override_Calendar/);
// Check if the file was created in the test directory
const filePath = path.join(CALENDARS_DIR, 'Override_Calendar.ics');
expect(fs.existsSync(filePath)).toBe(true);
// Load expected output and compare
const expectedOutput = loadExpectedOutput('Override_Calendar.ics');
const actualOutput = fs.readFileSync(filePath, 'utf8');
expect(actualOutput).toBe(expectedOutput);
});
//test Merge date-based and time-based calendars
test('Merge date-based and time-based calendars', async () => {
const response = await request(server)
.post('/merge')
.send({
linkGroupName: 'Merged Date and Time Based Calendar',
calendars: [
{
url: getTestCalendarFilename('holiday_calendar_2023.ics'), // Date-based calendar
prefix: 'Holiday_2023',
override: false,
},
{
url: getTestCalendarFilename('work_task_calendar.ics'), // Time-based calendar
prefix: 'Work_Task',
override: false,
},
],
});
expect(response.status).toBe(200);
expect(response.body.url).toMatch(new RegExp('calendar/Merged_Date_and_Time_Based_Calendar'));
// Check if the file was created in the test directory
const filePath = path.join(CALENDARS_DIR, 'Merged_Date_and_Time_Based_Calendar.ics');
expect(fs.existsSync(filePath)).toBe(true);
// Load expected output and compare
const expectedOutput = loadExpectedOutput('Merged_Date_and_Time_Based_Calendar.ics');
const actualOutput = fs.readFileSync(filePath, 'utf8');
expect(actualOutput).toBe(expectedOutput);
});
describe('Smart URL Handling', () => {
let mockAxios;
beforeAll(() => {
mockAxios = new MockAdapter(axios);
});
afterEach(() => {
mockAxios.reset();
});
afterAll(() => {
mockAxios.restore();
});
test('should use original URL when valid without .ics', async () => {
const validUrl = 'https://cals.ftt.gmbh/calendar/germanholithunder';
mockAxios.onGet(validUrl).reply(200, 'VALID_CALENDAR');
const result = await fetchCalendarData({ url: validUrl });
expect(result.data).toBe('VALID_CALENDAR');
});
test('should try .ics version when original fails', async () => {
const invalidUrl = 'https://cals.ftt.gmbh/calendar/germanholithunder.ics';
const validUrl = invalidUrl.slice(0, -4);
mockAxios
.onGet(invalidUrl).reply(404)
.onGet(validUrl).reply(200, 'VALID_CALENDAR');
const result = await fetchCalendarData({ url: invalidUrl });
expect(result.data).toBe('VALID_CALENDAR');
});
test('should preserve valid .ics URLs', async () => {
const googleUrl = 'https://calendar.google.com/.../basic.ics';
mockAxios.onGet(googleUrl).reply(200, 'GOOGLE_CALENDAR');
const result = await fetchCalendarData({ url: googleUrl });
expect(result.data).toBe('GOOGLE_CALENDAR');
});
test('should try both versions for ambiguous URLs', async () => {
const baseUrl = 'https://example.com/calendar';
const icsUrl = baseUrl + '.ics';
mockAxios
.onGet(baseUrl).reply(404)
.onGet(icsUrl).reply(200, 'ICS_CALENDAR');
const result = await fetchCalendarData({ url: baseUrl });
expect(result.data).toBe('ICS_CALENDAR');
});
});
});

56
test/calendarUtil.test.js Normal file
View file

@ -0,0 +1,56 @@
import ICAL from '../src/lib/ical.timezones';
import fs from 'fs';
import path from 'path';
import axios from 'axios';
import { jest } from '@jest/globals';
import { fileURLToPath } from 'url';
// ESM equivalent of __dirname
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
// Describe the test suite for Calendar Utility Functions
describe('Calendar Utility Functions', () => {
// Declare variable to hold the functions we will be testing
let fetchCalendarData;
beforeAll(async () => {
const calendarUtilModule = await import('../src/calendarUtil.js');
fetchCalendarData = calendarUtilModule.fetchCalendarData;
});
// Describe a nested test suite for the 'fetchCalendarData' function
describe('fetchCalendarData', () => {
// Test case: fetching data from a URL
it('fetches data from a URL', async () => {
const testCalendar = { url: 'https://calendar.google.com/calendar/ical/b4c66eb4bb2cc15257d071bab3f935385778b042112ea1aaedada47f3f1a6e3a%40group.calendar.google.com/public/basic.ics' };
// Mock the axios.get method to resolve with specific test data
jest.spyOn(axios, 'get').mockResolvedValue({ data: 'test data' });
// Call the fetchCalendarData function with the test calendar object
const result = await fetchCalendarData(testCalendar);
// Assert that the fetched result's data matches the expected test data
expect(result.data).toBe('test data');
// Restore the original axios.get method after the test
axios.get.mockRestore();
});
// Test case: reading data from a file
it('reads and parses data from a file', async () => {
const testCalendar = { url: path.join(__dirname, 'test_calendars', 'nextcloud.ics'), };
// Call the fetchCalendarData function
const result = await fetchCalendarData(testCalendar);
const parsed = ICAL.parse(result.data);
const component = new ICAL.Component(parsed);
const firstEvent = new ICAL.Event(component.getAllSubcomponents('vevent')[0]);
// Assert that the fetched and parsed data matches
expect(firstEvent.startDate.toJSON()).toEqual({"day": 20, "hour": 21, "isDate": false, "minute": 15, "month": 11, "second": 0, "timezone": "Europe/Berlin", "year": 2024});
});
});
});

View file

@ -0,0 +1,21 @@
BEGIN:VCALENDAR
NAME:Date Based Calendar
PRODID:-//CalMerge//Calendar Merger 1.0//EN
VERSION:2.0
CALSCALE:GREGORIAN
BEGIN:VEVENT
UID:20231225T000000-001@example.com
DTSTART;VALUE=DATE:20231225
DTEND;VALUE=DATE:20231226
DTSTAMP:20231225T000000Z
SUMMARY:holiday_calendar_2023 Christmas Day
LOCATION:Germany
END:VEVENT
BEGIN:VEVENT
UID:20231225T000000-001@example.com
DTSTART;VALUE=DATE:20231225
DTEND;VALUE=DATE:20231226
DTSTAMP:20231225T000000Z
SUMMARY:US_holidays Christmas Day
END:VEVENT
END:VCALENDAR

View file

@ -0,0 +1,15 @@
{
"linkGroupName": "Date Based Calendar",
"calendars": [
{
"url": "C:\\Users\\user\\OneDrive\\Desktop\\Internship_tasks\\final calmerg\\test\\test_calendars\\holiday_calendar_2023.ics",
"prefix": "holiday_calendar_2023",
"override": false
},
{
"url": "C:\\Users\\user\\OneDrive\\Desktop\\Internship_tasks\\final calmerg\\test\\test_calendars\\US_Holidays.ics",
"prefix": "US_holidays",
"override": false
}
]
}

View file

@ -0,0 +1,21 @@
BEGIN:VCALENDAR
NAME:Merged Date and Time Based Calendar
PRODID:-//CalMerge//Calendar Merger 1.0//EN
VERSION:2.0
CALSCALE:GREGORIAN
BEGIN:VEVENT
UID:20231225T000000-001@example.com
DTSTART;VALUE=DATE:20231225
DTEND;VALUE=DATE:20231226
DTSTAMP:20231225T000000Z
SUMMARY:Holiday_2023 Christmas Day
LOCATION:Germany
END:VEVENT
BEGIN:VEVENT
UID:20231108T090000-001@example.com
DTSTART:20231108T090000Z
DTEND:20231108T100000Z
DTSTAMP:20231108T090000Z
SUMMARY:Work_Task Work Task
END:VEVENT
END:VCALENDAR

View file

@ -0,0 +1,15 @@
{
"linkGroupName": "Merged Date and Time Based Calendar",
"calendars": [
{
"url": "C:\\Users\\user\\OneDrive\\Desktop\\Internship_tasks\\final calmerg\\test\\test_calendars\\holiday_calendar_2023.ics",
"prefix": "Holiday_2023",
"override": false
},
{
"url": "C:\\Users\\user\\OneDrive\\Desktop\\Internship_tasks\\final calmerg\\test\\test_calendars\\work_task_calendar.ics",
"prefix": "Work_Task",
"override": false
}
]
}

View file

@ -0,0 +1,14 @@
BEGIN:VCALENDAR
NAME:No Prefix Calendar
PRODID:-//CalMerge//Calendar Merger 1.0//EN
VERSION:2.0
CALSCALE:GREGORIAN
BEGIN:VEVENT
UID:20231225T000000-001@example.com
DTSTART;VALUE=DATE:20231225
DTEND;VALUE=DATE:20231226
DTSTAMP:20231225T000000Z
SUMMARY:Christmas Day
LOCATION:San Francisco
END:VEVENT
END:VCALENDAR

View file

@ -0,0 +1,10 @@
{
"linkGroupName": "No Prefix Calendar",
"calendars": [
{
"url": "C:\\Users\\user\\OneDrive\\Desktop\\Internship_tasks\\final calmerg\\test\\test_calendars\\sf_public_holidays.ics",
"prefix": "",
"override": false
}
]
}

View file

@ -0,0 +1,13 @@
BEGIN:VCALENDAR
NAME:Override Calendar
PRODID:-//CalMerge//Calendar Merger 1.0//EN
VERSION:2.0
CALSCALE:GREGORIAN
BEGIN:VEVENT
UID:20231225T000000-001@example.com
DTSTART;VALUE=DATE:20231225
DTEND;VALUE=DATE:20231226
DTSTAMP:20231225T000000Z
SUMMARY:Override Event
END:VEVENT
END:VCALENDAR

View file

@ -0,0 +1,10 @@
{
"linkGroupName": "Override Calendar",
"calendars": [
{
"url": "C:\\Users\\user\\OneDrive\\Desktop\\Internship_tasks\\final calmerg\\test\\test_calendars\\sf_public_holidays.ics",
"prefix": "Override Event",
"override": true
}
]
}

View file

@ -0,0 +1,21 @@
BEGIN:VCALENDAR
NAME:Time Based Calendar
PRODID:-//CalMerge//Calendar Merger 1.0//EN
VERSION:2.0
CALSCALE:GREGORIAN
BEGIN:VEVENT
UID:20231109T110000-001@example.com
DTSTART:20231109T110000Z
DTEND:20231109T120000Z
DTSTAMP:20231109T110000Z
SUMMARY:team_meeting_calendar Team Meeting
LOCATION:Virtual
END:VEVENT
BEGIN:VEVENT
UID:20231108T090000-001@example.com
DTSTART:20231108T090000Z
DTEND:20231108T100000Z
DTSTAMP:20231108T090000Z
SUMMARY:Work_Task Work Task
END:VEVENT
END:VCALENDAR

View file

@ -0,0 +1,15 @@
{
"linkGroupName": "Time Based Calendar",
"calendars": [
{
"url": "C:\\Users\\user\\OneDrive\\Desktop\\Internship_tasks\\final calmerg\\test\\test_calendars\\team_meeting_calendar.ics",
"prefix": "team_meeting_calendar",
"override": false
},
{
"url": "C:\\Users\\user\\OneDrive\\Desktop\\Internship_tasks\\final calmerg\\test\\test_calendars\\work_task_calendar.ics",
"prefix": "work_task",
"override": false
}
]
}

View file

@ -0,0 +1,13 @@
BEGIN:VCALENDAR
NAME:US Holidays
PRODID:-//CalMerge//Calendar Merger 1.0//EN
VERSION:2.0
CALSCALE:GREGORIAN
BEGIN:VEVENT
UID:20231225T000000-001@example.com
DTSTART;VALUE=DATE:20231225
DTEND;VALUE=DATE:20231226
DTSTAMP:20231225T000000Z
SUMMARY:Christmas Day
END:VEVENT
END:VCALENDAR

View file

@ -0,0 +1,15 @@
BEGIN:VCALENDAR
NAME:google-calendar-minimal
PRODID:-//CalMerge//Calendar Merger 1.0//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-TIMEZONE:Africa/Nairobi
BEGIN:VEVENT
UID:6tbrvsitniuu72li7kk15gou2b@google.com
DTSTART:20241003T190000Z
DTEND:20241003T200000Z
DTSTAMP:20241119T115316Z
SUMMARY:progodessey
END:VEVENT
END:VCALENDAR

View file

@ -8,7 +8,7 @@ X-WR-TIMEZONE:Africa/Nairobi
BEGIN:VEVENT BEGIN:VEVENT
DTSTART:20240930T113000Z DTSTART:20240930T113000Z
DTEND:20240930T123000Z DTEND:20240930T123000Z
DTSTAMP:20241104T102505Z DTSTAMP:20241119T115316Z
UID:0d0p2hp0l26ebuk2r0kb1q9kuo@google.com UID:0d0p2hp0l26ebuk2r0kb1q9kuo@google.com
CREATED:20240930T111532Z CREATED:20240930T111532Z
LAST-MODIFIED:20240930T111532Z LAST-MODIFIED:20240930T111532Z
@ -20,7 +20,7 @@ END:VEVENT
BEGIN:VEVENT BEGIN:VEVENT
DTSTART:20241003T190000Z DTSTART:20241003T190000Z
DTEND:20241003T200000Z DTEND:20241003T200000Z
DTSTAMP:20241104T102505Z DTSTAMP:20241119T115316Z
UID:6tbrvsitniuu72li7kk15gou2b@google.com UID:6tbrvsitniuu72li7kk15gou2b@google.com
CREATED:20241001T194455Z CREATED:20241001T194455Z
LAST-MODIFIED:20241001T194455Z LAST-MODIFIED:20241001T194455Z
@ -30,10 +30,10 @@ SUMMARY:progodessey
TRANSP:OPAQUE TRANSP:OPAQUE
END:VEVENT END:VEVENT
BEGIN:VEVENT BEGIN:VEVENT
UID:7l7n9nltrudluv65gfgll2q930@google.com
DTSTART:20241009T173000Z DTSTART:20241009T173000Z
DTEND:20241009T183000Z DTEND:20241009T183000Z
DTSTAMP:20241104T102505Z DTSTAMP:20241119T115316Z
UID:7l7n9nltrudluv65gfgll2q930@google.com
CREATED:20241010T123337Z CREATED:20241010T123337Z
LAST-MODIFIED:20241010T123337Z LAST-MODIFIED:20241010T123337Z
SEQUENCE:0 SEQUENCE:0

View file

@ -0,0 +1,15 @@
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp//NONSGML Event//EN
BEGIN:VEVENT
UID:20231225T000000-001@example.com
DTSTAMP:20231225T000000Z
DTSTART;VALUE=DATE:20231225
DTEND;VALUE=DATE:20231226
SUMMARY:Christmas Day
DESCRIPTION:Public holiday for Christmas.
LOCATION:Germany
STATUS:CONFIRMED
SEQUENCE:0
END:VEVENT
END:VCALENDAR

View file

@ -0,0 +1,32 @@
BEGIN:VCALENDAR
NAME:nextcloud-minimal
PRODID:-//CalMerge//Calendar Merger 1.0//EN
VERSION:2.0
CALSCALE:GREGORIAN
BEGIN:VTIMEZONE
TZID:Europe/Berlin
BEGIN:DAYLIGHT
TZOFFSETFROM:+0100
TZOFFSETTO:+0200
TZNAME:CEST
DTSTART:19700329T020000
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETFROM:+0200
TZOFFSETTO:+0100
TZNAME:CET
DTSTART:19701025T030000
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
UID:5f4ad965-16a8-48eb-8233-78bf93a8b35e
DTSTART;TZID=Europe/Berlin:20241120T211500
DTEND;TZID=Europe/Berlin:20241120T215000
DTSTAMP:20241113T212909Z
SUMMARY:JR Weekly Check-In
LOCATION:FaceTime
RRULE:FREQ=WEEKLY;BYDAY=WE
END:VEVENT
END:VCALENDAR

View file

@ -0,0 +1,131 @@
BEGIN:VCALENDAR
VERSION:2.0
CALSCALE:GREGORIAN
PRODID:-//SabreDAV//SabreDAV//EN
X-WR-CALNAME:Progodyssey Ryan (stackspin-a51baefe-70df-4cce-9be1-048354b619
b8)
X-APPLE-CALENDAR-COLOR:#ddcb55
REFRESH-INTERVAL;VALUE=DURATION:PT4H
X-PUBLISHED-TTL:PT4H
BEGIN:VTIMEZONE
TZID:Europe/Berlin
BEGIN:DAYLIGHT
TZOFFSETFROM:+0100
TZOFFSETTO:+0200
TZNAME:CEST
DTSTART:19700329T020000
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETFROM:+0200
TZOFFSETTO:+0100
TZNAME:CET
DTSTART:19701025T030000
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
CREATED:20241113T212909Z
DTEND;TZID=Europe/Berlin:20241120T215000
DTSTAMP:20241113T212909Z
DTSTART;TZID=Europe/Berlin:20241120T211500
LAST-MODIFIED:20241113T212909Z
LOCATION:FaceTime
RRULE:FREQ=WEEKLY;BYDAY=WE
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:JR Weekly Check-In
TRANSP:OPAQUE
UID:5f4ad965-16a8-48eb-8233-78bf93a8b35e
RELATED-TO;RELTYPE=SIBLING:17cf7d22-9bee-4a8e-9023-878b1a1b73a0
BEGIN:VALARM
ACKNOWLEDGED:20241113T202052Z
ACTION:DISPLAY
DESCRIPTION:This is an event reminder.
TRIGGER:-PT20M
UID:99250427-AB45-4111-A999-DB417FC290D1
X-WR-ALARMUID:99250427-AB45-4111-A999-DB417FC290D1
SUMMARY:JR Weekly Check-In
END:VALARM
END:VEVENT
BEGIN:VEVENT
CREATED:20241113T213036Z
DTEND;TZID=Europe/Berlin:20241204T212500
DTSTAMP:20241113T213036Z
DTSTART;TZID=Europe/Berlin:20241204T203000
LAST-MODIFIED:20241113T213036Z
LOCATION:FaceTime
SEQUENCE:1
STATUS:CONFIRMED
SUMMARY:JR Weekly Check-In
TRANSP:OPAQUE
UID:5f4ad965-16a8-48eb-8233-78bf93a8b35e
RELATED-TO;RELTYPE=SIBLING:17cf7d22-9bee-4a8e-9023-878b1a1b73a0
RECURRENCE-ID;TZID=Europe/Berlin:20241204T211500
BEGIN:VALARM
ACKNOWLEDGED:20241113T202052Z
ACTION:DISPLAY
DESCRIPTION:This is an event reminder.
TRIGGER:-PT20M
UID:99250427-AB45-4111-A999-DB417FC290D1
X-WR-ALARMUID:99250427-AB45-4111-A999-DB417FC290D1
SUMMARY:JR Weekly Check-In
END:VALARM
END:VEVENT
BEGIN:VEVENT
CREATED:20241107T101403Z
DTEND;TZID=Europe/Berlin:20241111T134500
DTSTAMP:20241118T103806Z
DTSTART;TZID=Europe/Berlin:20241111T121500
LAST-MODIFIED:20241118T103803Z
LOCATION:https://call.element.io/room/#/progodyssey?password=bU95nPdV2u-BGJ
4zw9cPGw&roomId=%21QsGQUxdyuMfGKhGvNH%3Acall.ems.host
RRULE:FREQ=WEEKLY;BYDAY=MO
SEQUENCE:4
STATUS:CONFIRMED
SUMMARY:JR Coprogramming Session
TRANSP:OPAQUE
UID:8c251542-6cbf-4396-b83d-490be79c97a9
BEGIN:VALARM
ACKNOWLEDGED:20241118T103803Z
ACTION:DISPLAY
DESCRIPTION:This is an event reminder.
SUMMARY:Coprogramming Session
TRIGGER:-PT1H
UID:55C3B462-E182-4A2B-A500-3F249FC860C2
X-WR-ALARMUID:55C3B462-E182-4A2B-A500-3F249FC860C2
END:VALARM
BEGIN:VALARM
ACTION:DISPLAY
DESCRIPTION:Reminder
TRIGGER:-PT1H
UID:9AABB2AB-A755-4723-87CF-10B119670E7F
X-APPLE-DEFAULT-ALARM:TRUE
X-WR-ALARMUID:9AABB2AB-A755-4723-87CF-10B119670E7F
END:VALARM
END:VEVENT
BEGIN:VEVENT
CREATED:20241107T101605Z
DTEND;TZID=Europe/Berlin:20241113T215500
DTSTAMP:20241113T212909Z
DTSTART;TZID=Europe/Berlin:20241113T213000
LAST-MODIFIED:20241113T212909Z
LOCATION:FaceTime
RRULE:FREQ=WEEKLY;BYDAY=WE;UNTIL=20241120T202959Z
SEQUENCE:4
STATUS:CONFIRMED
SUMMARY:JR Weekly Check-In
TRANSP:OPAQUE
UID:17cf7d22-9bee-4a8e-9023-878b1a1b73a0
RELATED-TO;RELTYPE=SIBLING:5f4ad965-16a8-48eb-8233-78bf93a8b35e
BEGIN:VALARM
ACKNOWLEDGED:20241113T202052Z
ACTION:DISPLAY
DESCRIPTION:This is an event reminder.
SUMMARY:JR Weekly Check-In
TRIGGER:-PT20M
UID:99250427-AB45-4111-A999-DB417FC290D1
X-WR-ALARMUID:99250427-AB45-4111-A999-DB417FC290D1
END:VALARM
END:VEVENT
END:VCALENDAR

View file

@ -0,0 +1,15 @@
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp//NONSGML Event//EN
BEGIN:VEVENT
UID:20231225T000000-001@example.com
DTSTAMP:20231225T000000Z
DTSTART;VALUE=DATE:20231225
DTEND;VALUE=DATE:20231226
SUMMARY:Christmas Day
DESCRIPTION:Public holiday for Christmas in San Francisco.
LOCATION:San Francisco
STATUS:CONFIRMED
SEQUENCE:0
END:VEVENT
END:VCALENDAR

View file

@ -0,0 +1,15 @@
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp//NONSGML Event//EN
BEGIN:VEVENT
UID:20231109T110000-001@example.com
DTSTAMP:20231109T110000Z
DTSTART:20231109T110000Z
DTEND:20231109T120000Z
SUMMARY:Team Meeting
DESCRIPTION:Team meeting for project planning.
LOCATION:Virtual
STATUS:CONFIRMED
SEQUENCE:0
END:VEVENT
END:VCALENDAR

View file

@ -0,0 +1,11 @@
BEGIN:VCALENDAR
NAME:Time Based Calendar
VERSION:2.0
BEGIN:VEVENT
UID:20231108T090000-001@example.com
DTSTAMP:20231108T090000Z
DTSTART:20231108T090000Z
DTEND:20231108T100000Z
SUMMARY:Work Task
END:VEVENT
END:VCALENDAR

View file

@ -1,336 +0,0 @@
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//sebbo.net//ical-generator//EN
NAME:Date Based Calendar
X-WR-CALNAME:Date Based Calendar
BEGIN:VEVENT
UID:l93d@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20230219
DTEND;VALUE=DATE:20230224
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Ferien_Bayern_2023 Winterferien 2023 Bayern
END:VEVENT
BEGIN:VEVENT
UID:bxei@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20230402
DTEND;VALUE=DATE:20230415
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Ferien_Bayern_2023 Osterferien 2023 Bayern
END:VEVENT
BEGIN:VEVENT
UID:csr1@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20230529
DTEND;VALUE=DATE:20230609
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Ferien_Bayern_2023 Pfingstferien 2023 Bayern
END:VEVENT
BEGIN:VEVENT
UID:gamv@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20230730
DTEND;VALUE=DATE:20230911
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Ferien_Bayern_2023 Sommerferien 2023 Bayern
END:VEVENT
BEGIN:VEVENT
UID:xuty@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20231029
DTEND;VALUE=DATE:20231103
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Ferien_Bayern_2023 Herbstferien 2023 Bayern
END:VEVENT
BEGIN:VEVENT
UID:l9k9@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20231121
DTEND;VALUE=DATE:20231122
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Ferien_Bayern_2023 Herbstferien 2023 Bayern
END:VEVENT
BEGIN:VEVENT
UID:om17@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20231222
DTEND;VALUE=DATE:20240105
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Ferien_Bayern_2023 Weihnachtsferien 2023 Bayern
END:VEVENT
BEGIN:VEVENT
UID:1i1v@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20231231
DTEND;VALUE=DATE:20231231
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:US_holidays New Year's Day
END:VEVENT
BEGIN:VEVENT
UID:qga1@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20240114
DTEND;VALUE=DATE:20240114
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:US_holidays M L King Day
END:VEVENT
BEGIN:VEVENT
UID:axvt@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20240218
DTEND;VALUE=DATE:20240218
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:US_holidays Presidents' Day
END:VEVENT
BEGIN:VEVENT
UID:3t87@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20240328
DTEND;VALUE=DATE:20240328
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:US_holidays Good Friday
END:VEVENT
BEGIN:VEVENT
UID:olsu@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20240330
DTEND;VALUE=DATE:20240330
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:US_holidays Easter Sunday
END:VEVENT
BEGIN:VEVENT
UID:xts1@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20240526
DTEND;VALUE=DATE:20240526
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:US_holidays Memorial Day
END:VEVENT
BEGIN:VEVENT
UID:0e36@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20240618
DTEND;VALUE=DATE:20240618
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:US_holidays Juneteenth
END:VEVENT
BEGIN:VEVENT
UID:rc80@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20240703
DTEND;VALUE=DATE:20240703
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:US_holidays Independence Day
END:VEVENT
BEGIN:VEVENT
UID:386s@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20240901
DTEND;VALUE=DATE:20240901
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:US_holidays Labor Day
END:VEVENT
BEGIN:VEVENT
UID:102z@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20241013
DTEND;VALUE=DATE:20241013
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:US_holidays Columbus Day
END:VEVENT
BEGIN:VEVENT
UID:qqbg@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20241110
DTEND;VALUE=DATE:20241110
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:US_holidays Veterans Day
END:VEVENT
BEGIN:VEVENT
UID:dyh3@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20241127
DTEND;VALUE=DATE:20241127
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:US_holidays Thanksgiving Day
END:VEVENT
BEGIN:VEVENT
UID:oqsd@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20241224
DTEND;VALUE=DATE:20241224
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:US_holidays Christmas
END:VEVENT
BEGIN:VEVENT
UID:8140@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20241231
DTEND;VALUE=DATE:20241231
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:US_holidays New Year's Day
END:VEVENT
BEGIN:VEVENT
UID:fmmb@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20250119
DTEND;VALUE=DATE:20250119
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:US_holidays M L King Day
END:VEVENT
BEGIN:VEVENT
UID:l4x1@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20250216
DTEND;VALUE=DATE:20250216
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:US_holidays Presidents' Day
END:VEVENT
BEGIN:VEVENT
UID:fpt7@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20250417
DTEND;VALUE=DATE:20250417
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:US_holidays Good Friday
END:VEVENT
BEGIN:VEVENT
UID:x3y4@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20250419
DTEND;VALUE=DATE:20250419
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:US_holidays Easter Sunday
END:VEVENT
BEGIN:VEVENT
UID:fhn8@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20250525
DTEND;VALUE=DATE:20250525
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:US_holidays Memorial Day
END:VEVENT
BEGIN:VEVENT
UID:wue7@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20250618
DTEND;VALUE=DATE:20250618
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:US_holidays Juneteenth
END:VEVENT
BEGIN:VEVENT
UID:oq6h@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20250703
DTEND;VALUE=DATE:20250703
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:US_holidays Independence Day
END:VEVENT
BEGIN:VEVENT
UID:4gm3@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20250831
DTEND;VALUE=DATE:20250831
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:US_holidays Labor Day
END:VEVENT
BEGIN:VEVENT
UID:8he3@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20251012
DTEND;VALUE=DATE:20251012
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:US_holidays Columbus Day
END:VEVENT
BEGIN:VEVENT
UID:3u40@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20251110
DTEND;VALUE=DATE:20251110
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:US_holidays Veterans Day
END:VEVENT
BEGIN:VEVENT
UID:s651@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20251126
DTEND;VALUE=DATE:20251126
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:US_holidays Thanksgiving Day
END:VEVENT
BEGIN:VEVENT
UID:yzoz@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART;VALUE=DATE:20251224
DTEND;VALUE=DATE:20251224
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:US_holidays Christmas
END:VEVENT
END:VCALENDAR

View file

@ -1,16 +0,0 @@
{
"id": "Date_Based_Calendar",
"linkGroupName": "Date Based Calendar",
"calendars": [
{
"url": "C:\\Users\\user\\OneDrive\\Desktop\\Internship tasks\\final calmerg\\test_calendars\\ferien_bayern_2023.ics",
"prefix": "Ferien_Bayern_2023",
"override": false
},
{
"url": "C:\\Users\\user\\OneDrive\\Desktop\\Internship tasks\\final calmerg\\test_calendars\\US_Holidays.ics",
"prefix": "US_holidays",
"override": false
}
]
}

View file

@ -1,266 +0,0 @@
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//sebbo.net//ical-generator//EN
NAME:No Prefix Calendar
X-WR-CALNAME:No Prefix Calendar
BEGIN:VEVENT
UID:jfle@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20231231
DTEND;VALUE=DATE:20231231
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY: New Year's Day
END:VEVENT
BEGIN:VEVENT
UID:s4ov@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20240101
DTEND;VALUE=DATE:20240101
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY: New Year's Day Holiday
END:VEVENT
BEGIN:VEVENT
UID:ov14@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20240102
DTEND;VALUE=DATE:20240102
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY: New Year's Day Holiday
END:VEVENT
BEGIN:VEVENT
UID:qdqh@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20240103
DTEND;VALUE=DATE:20240103
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY: New Year's Day Holiday
END:VEVENT
BEGIN:VEVENT
UID:i05i@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20240104
DTEND;VALUE=DATE:20240104
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY: New Year's Day Holiday
END:VEVENT
BEGIN:VEVENT
UID:k6ih@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20240106
DTEND;VALUE=DATE:20240106
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY: Orthodox Christmas
END:VEVENT
BEGIN:VEVENT
UID:32bn@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20240107
DTEND;VALUE=DATE:20240107
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY: Orthodox Christmas Holiday
END:VEVENT
BEGIN:VEVENT
UID:k1o7@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20240222
DTEND;VALUE=DATE:20240222
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY: Defender of the Fatherland
END:VEVENT
BEGIN:VEVENT
UID:4l5n@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20240307
DTEND;VALUE=DATE:20240307
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY: Intl. Women's Day
END:VEVENT
BEGIN:VEVENT
UID:ymwf@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20240430
DTEND;VALUE=DATE:20240430
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY: Spring and Labor Day
END:VEVENT
BEGIN:VEVENT
UID:t4fd@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20240508
DTEND;VALUE=DATE:20240508
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY: Victory Day
END:VEVENT
BEGIN:VEVENT
UID:foxu@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20240611
DTEND;VALUE=DATE:20240611
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY: Russia Day
END:VEVENT
BEGIN:VEVENT
UID:ne1r@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20241103
DTEND;VALUE=DATE:20241103
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY: Civil Unity Day
END:VEVENT
BEGIN:VEVENT
UID:jzcn@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20241231
DTEND;VALUE=DATE:20241231
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY: New Year's Day
END:VEVENT
BEGIN:VEVENT
UID:dfzn@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20250101
DTEND;VALUE=DATE:20250101
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY: New Year's Day Holiday
END:VEVENT
BEGIN:VEVENT
UID:v9mu@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20250102
DTEND;VALUE=DATE:20250102
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY: New Year's Day Holiday
END:VEVENT
BEGIN:VEVENT
UID:x79k@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20250103
DTEND;VALUE=DATE:20250103
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY: New Year's Day Holiday
END:VEVENT
BEGIN:VEVENT
UID:gj06@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20250104
DTEND;VALUE=DATE:20250104
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY: New Year's Day Holiday
END:VEVENT
BEGIN:VEVENT
UID:s75j@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20250106
DTEND;VALUE=DATE:20250106
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY: Orthodox Christmas
END:VEVENT
BEGIN:VEVENT
UID:u16z@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20250107
DTEND;VALUE=DATE:20250107
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY: Orthodox Christmas Holiday
END:VEVENT
BEGIN:VEVENT
UID:c1co@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20250223
DTEND;VALUE=DATE:20250223
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY: Defender of the Fatherland
END:VEVENT
BEGIN:VEVENT
UID:s1ga@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20250309
DTEND;VALUE=DATE:20250309
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY: Intl. Women's Day
END:VEVENT
BEGIN:VEVENT
UID:7050@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20250430
DTEND;VALUE=DATE:20250430
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY: Spring and Labor Day
END:VEVENT
BEGIN:VEVENT
UID:stsk@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20250508
DTEND;VALUE=DATE:20250508
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY: Victory Day
END:VEVENT
BEGIN:VEVENT
UID:n4iy@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20250611
DTEND;VALUE=DATE:20250611
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY: Russia Day
END:VEVENT
BEGIN:VEVENT
UID:7dco@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20251103
DTEND;VALUE=DATE:20251103
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY: Civil Unity Day
END:VEVENT
END:VCALENDAR

View file

@ -1,11 +0,0 @@
{
"id": "No_Prefix_Calendar",
"linkGroupName": "No Prefix Calendar",
"calendars": [
{
"url": "C:\\Users\\user\\OneDrive\\Desktop\\Internship tasks\\final calmerg\\test_calendars\\San_Francisco_Public_Holidays.ics",
"prefix": "",
"override": false
}
]
}

View file

@ -1,266 +0,0 @@
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//sebbo.net//ical-generator//EN
NAME:Override Calendar
X-WR-CALNAME:Override Calendar
BEGIN:VEVENT
UID:cknb@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20231231
DTEND;VALUE=DATE:20231231
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Override Event
END:VEVENT
BEGIN:VEVENT
UID:p03j@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20240101
DTEND;VALUE=DATE:20240101
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Override Event
END:VEVENT
BEGIN:VEVENT
UID:s2a8@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20240102
DTEND;VALUE=DATE:20240102
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Override Event
END:VEVENT
BEGIN:VEVENT
UID:ptdn@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20240103
DTEND;VALUE=DATE:20240103
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Override Event
END:VEVENT
BEGIN:VEVENT
UID:d7oa@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20240104
DTEND;VALUE=DATE:20240104
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Override Event
END:VEVENT
BEGIN:VEVENT
UID:wuts@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20240106
DTEND;VALUE=DATE:20240106
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Override Event
END:VEVENT
BEGIN:VEVENT
UID:g3b0@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20240107
DTEND;VALUE=DATE:20240107
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Override Event
END:VEVENT
BEGIN:VEVENT
UID:qbx4@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20240222
DTEND;VALUE=DATE:20240222
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Override Event
END:VEVENT
BEGIN:VEVENT
UID:v25w@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20240307
DTEND;VALUE=DATE:20240307
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Override Event
END:VEVENT
BEGIN:VEVENT
UID:7u8c@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20240430
DTEND;VALUE=DATE:20240430
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Override Event
END:VEVENT
BEGIN:VEVENT
UID:apf4@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20240508
DTEND;VALUE=DATE:20240508
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Override Event
END:VEVENT
BEGIN:VEVENT
UID:jfpb@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20240611
DTEND;VALUE=DATE:20240611
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Override Event
END:VEVENT
BEGIN:VEVENT
UID:2ykv@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20241103
DTEND;VALUE=DATE:20241103
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Override Event
END:VEVENT
BEGIN:VEVENT
UID:0b26@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20241231
DTEND;VALUE=DATE:20241231
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Override Event
END:VEVENT
BEGIN:VEVENT
UID:qs49@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20250101
DTEND;VALUE=DATE:20250101
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Override Event
END:VEVENT
BEGIN:VEVENT
UID:559o@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20250102
DTEND;VALUE=DATE:20250102
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Override Event
END:VEVENT
BEGIN:VEVENT
UID:8giv@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20250103
DTEND;VALUE=DATE:20250103
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Override Event
END:VEVENT
BEGIN:VEVENT
UID:e57i@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20250104
DTEND;VALUE=DATE:20250104
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Override Event
END:VEVENT
BEGIN:VEVENT
UID:ur8w@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20250106
DTEND;VALUE=DATE:20250106
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Override Event
END:VEVENT
BEGIN:VEVENT
UID:08hg@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20250107
DTEND;VALUE=DATE:20250107
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Override Event
END:VEVENT
BEGIN:VEVENT
UID:gvgf@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20250223
DTEND;VALUE=DATE:20250223
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Override Event
END:VEVENT
BEGIN:VEVENT
UID:rllx@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20250309
DTEND;VALUE=DATE:20250309
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Override Event
END:VEVENT
BEGIN:VEVENT
UID:sy19@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20250430
DTEND;VALUE=DATE:20250430
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Override Event
END:VEVENT
BEGIN:VEVENT
UID:um2w@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20250508
DTEND;VALUE=DATE:20250508
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Override Event
END:VEVENT
BEGIN:VEVENT
UID:fdjj@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20250611
DTEND;VALUE=DATE:20250611
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Override Event
END:VEVENT
BEGIN:VEVENT
UID:fsik@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122935Z
DTSTART;VALUE=DATE:20251103
DTEND;VALUE=DATE:20251103
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
SUMMARY:Override Event
END:VEVENT
END:VCALENDAR

View file

@ -1,11 +0,0 @@
{
"id": "Override_Calendar",
"linkGroupName": "Override Calendar",
"calendars": [
{
"url": "C:\\Users\\user\\OneDrive\\Desktop\\Internship tasks\\final calmerg\\test_calendars\\San_Francisco_Public_Holidays.ics",
"prefix": "Override Event",
"override": true
}
]
}

View file

@ -1,46 +0,0 @@
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//sebbo.net//ical-generator//EN
NAME:Time Based Calendar
X-WR-CALNAME:Time Based Calendar
BEGIN:VEVENT
UID:upko@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART:20241001T183000Z
DTEND:20241001T193000Z
SUMMARY:other_work calmerge
END:VEVENT
BEGIN:VEVENT
UID:myd3@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART:20241010T173000Z
DTEND:20241010T183000Z
SUMMARY:other_work to do
END:VEVENT
BEGIN:VEVENT
UID:zs1z@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART:20240930T113000Z
DTEND:20240930T123000Z
SUMMARY:work other work
END:VEVENT
BEGIN:VEVENT
UID:d6rq@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART:20241003T190000Z
DTEND:20241003T200000Z
SUMMARY:work progodessey
END:VEVENT
BEGIN:VEVENT
UID:6c65@Ryan-jr
SEQUENCE:0
DTSTAMP:20241105T122934Z
DTSTART:20241009T173000Z
DTEND:20241009T183000Z
SUMMARY:work do
END:VEVENT
END:VCALENDAR

View file

@ -1,16 +0,0 @@
{
"id": "Time_Based_Calendar",
"linkGroupName": "Time Based Calendar",
"calendars": [
{
"url": "C:\\Users\\user\\OneDrive\\Desktop\\Internship tasks\\final calmerg\\test_calendars\\other_work.ics",
"prefix": "other_work",
"override": false
},
{
"url": "C:\\Users\\user\\OneDrive\\Desktop\\Internship tasks\\final calmerg\\test_calendars\\work.ics",
"prefix": "work",
"override": false
}
]
}

View file

@ -1,320 +0,0 @@
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Calendar Labs//Calendar 1.0//EN
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:Russia Holidays
X-WR-TIMEZONE:Etc/GMT
BEGIN:VEVENT
SUMMARY:New Year's Day
DTSTART;VALUE=DATE:20240101
DTEND;VALUE=DATE:20240101
LOCATION:Russia
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/new-years-day.php to know more about New Year's Day. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:67164e0bcb9111729515019@calendarlabs.com
DTSTAMP:20241021T125019Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:New Year's Day Holiday
DTSTART;VALUE=DATE:20240102
DTEND;VALUE=DATE:20240102
LOCATION:Russia
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/new-years-day.php to know more about New Year's Day Holiday. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:67164e0bcba351729515019@calendarlabs.com
DTSTAMP:20241021T125019Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:New Year's Day Holiday
DTSTART;VALUE=DATE:20240103
DTEND;VALUE=DATE:20240103
LOCATION:Russia
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/new-years-day.php to know more about New Year's Day Holiday. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:67164e0bcbb4a1729515019@calendarlabs.com
DTSTAMP:20241021T125019Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:New Year's Day Holiday
DTSTART;VALUE=DATE:20240104
DTEND;VALUE=DATE:20240104
LOCATION:Russia
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/new-years-day.php to know more about New Year's Day Holiday. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:67164e0bcbc471729515019@calendarlabs.com
DTSTAMP:20241021T125019Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:New Year's Day Holiday
DTSTART;VALUE=DATE:20240105
DTEND;VALUE=DATE:20240105
LOCATION:Russia
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/new-years-day.php to know more about New Year's Day Holiday. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:67164e0bcbd3c1729515019@calendarlabs.com
DTSTAMP:20241021T125019Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Orthodox Christmas
DTSTART;VALUE=DATE:20240107
DTEND;VALUE=DATE:20240107
LOCATION:Russia
DESCRIPTION:Visit https://calendarlabs.com/holidays/russia/orthodox-christmas.php to know more about Orthodox Christmas. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:67164e0bcbe351729515019@calendarlabs.com
DTSTAMP:20241021T125019Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Orthodox Christmas Holiday
DTSTART;VALUE=DATE:20240108
DTEND;VALUE=DATE:20240108
LOCATION:Russia
DESCRIPTION:Visit https://calendarlabs.com/holidays/russia/orthodox-christmas.php to know more about Orthodox Christmas Holiday. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:67164e0bcbf5b1729515019@calendarlabs.com
DTSTAMP:20241021T125019Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Defender of the Fatherland
DTSTART;VALUE=DATE:20240223
DTEND;VALUE=DATE:20240223
LOCATION:Russia
DESCRIPTION:Visit https://calendarlabs.com/holidays/russia/defender-of-the-fatherland.php to know more about Defender of the Fatherland. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:67164e0bcc0661729515019@calendarlabs.com
DTSTAMP:20241021T125019Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Intl. Women's Day
DTSTART;VALUE=DATE:20240308
DTEND;VALUE=DATE:20240308
LOCATION:Russia
DESCRIPTION:Visit https://calendarlabs.com/holidays/international/international-womens-day.php to know more about Intl. Women's Day. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:67164e0bcc16e1729515019@calendarlabs.com
DTSTAMP:20241021T125019Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Spring and Labor Day
DTSTART;VALUE=DATE:20240501
DTEND;VALUE=DATE:20240501
LOCATION:Russia
DESCRIPTION:Visit https://calendarlabs.com/holidays/uk/may-day.php to know more about Spring and Labor Day. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:67164e0bcc26f1729515019@calendarlabs.com
DTSTAMP:20241021T125019Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Victory Day
DTSTART;VALUE=DATE:20240509
DTEND;VALUE=DATE:20240509
LOCATION:Russia
DESCRIPTION:Visit https://calendarlabs.com/holidays/russia/victory-day.php to know more about Victory Day. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:67164e0bcc36f1729515019@calendarlabs.com
DTSTAMP:20241021T125019Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Russia Day
DTSTART;VALUE=DATE:20240612
DTEND;VALUE=DATE:20240612
LOCATION:Russia
DESCRIPTION:Visit https://calendarlabs.com/holidays/russia/russia-day.php to know more about Russia Day. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:67164e0bcc4771729515019@calendarlabs.com
DTSTAMP:20241021T125019Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Civil Unity Day
DTSTART;VALUE=DATE:20241104
DTEND;VALUE=DATE:20241104
LOCATION:Russia
DESCRIPTION:Visit https://calendarlabs.com/holidays/russia/unity-day.php to know more about Civil Unity Day. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:67164e0bcc57d1729515019@calendarlabs.com
DTSTAMP:20241021T125019Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:New Year's Day
DTSTART;VALUE=DATE:20250101
DTEND;VALUE=DATE:20250101
LOCATION:Russia
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/new-years-day.php to know more about New Year's Day. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:67164e0bcc6811729515019@calendarlabs.com
DTSTAMP:20241021T125019Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:New Year's Day Holiday
DTSTART;VALUE=DATE:20250102
DTEND;VALUE=DATE:20250102
LOCATION:Russia
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/new-years-day.php to know more about New Year's Day Holiday. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:67164e0bcc7881729515019@calendarlabs.com
DTSTAMP:20241021T125019Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:New Year's Day Holiday
DTSTART;VALUE=DATE:20250103
DTEND;VALUE=DATE:20250103
LOCATION:Russia
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/new-years-day.php to know more about New Year's Day Holiday. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:67164e0bcc8911729515019@calendarlabs.com
DTSTAMP:20241021T125019Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:New Year's Day Holiday
DTSTART;VALUE=DATE:20250104
DTEND;VALUE=DATE:20250104
LOCATION:Russia
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/new-years-day.php to know more about New Year's Day Holiday. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:67164e0bcc9a21729515019@calendarlabs.com
DTSTAMP:20241021T125019Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:New Year's Day Holiday
DTSTART;VALUE=DATE:20250105
DTEND;VALUE=DATE:20250105
LOCATION:Russia
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/new-years-day.php to know more about New Year's Day Holiday. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:67164e0bccac61729515019@calendarlabs.com
DTSTAMP:20241021T125019Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Orthodox Christmas
DTSTART;VALUE=DATE:20250107
DTEND;VALUE=DATE:20250107
LOCATION:Russia
DESCRIPTION:Visit https://calendarlabs.com/holidays/russia/orthodox-christmas.php to know more about Orthodox Christmas. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:67164e0bccbd41729515019@calendarlabs.com
DTSTAMP:20241021T125019Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Orthodox Christmas Holiday
DTSTART;VALUE=DATE:20250108
DTEND;VALUE=DATE:20250108
LOCATION:Russia
DESCRIPTION:Visit https://calendarlabs.com/holidays/russia/orthodox-christmas.php to know more about Orthodox Christmas Holiday. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:67164e0bccceb1729515019@calendarlabs.com
DTSTAMP:20241021T125019Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Defender of the Fatherland
DTSTART;VALUE=DATE:20250224
DTEND;VALUE=DATE:20250224
LOCATION:Russia
DESCRIPTION:Visit https://calendarlabs.com/holidays/russia/defender-of-the-fatherland.php to know more about Defender of the Fatherland. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:67164e0bcce091729515019@calendarlabs.com
DTSTAMP:20241021T125019Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Intl. Women's Day
DTSTART;VALUE=DATE:20250310
DTEND;VALUE=DATE:20250310
LOCATION:Russia
DESCRIPTION:Visit https://calendarlabs.com/holidays/international/international-womens-day.php to know more about Intl. Women's Day. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:67164e0bccf3b1729515019@calendarlabs.com
DTSTAMP:20241021T125019Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Spring and Labor Day
DTSTART;VALUE=DATE:20250501
DTEND;VALUE=DATE:20250501
LOCATION:Russia
DESCRIPTION:Visit https://calendarlabs.com/holidays/uk/may-day.php to know more about Spring and Labor Day. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:67164e0bcd0531729515019@calendarlabs.com
DTSTAMP:20241021T125019Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Victory Day
DTSTART;VALUE=DATE:20250509
DTEND;VALUE=DATE:20250509
LOCATION:Russia
DESCRIPTION:Visit https://calendarlabs.com/holidays/russia/victory-day.php to know more about Victory Day. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:67164e0bcd16f1729515019@calendarlabs.com
DTSTAMP:20241021T125019Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Russia Day
DTSTART;VALUE=DATE:20250612
DTEND;VALUE=DATE:20250612
LOCATION:Russia
DESCRIPTION:Visit https://calendarlabs.com/holidays/russia/russia-day.php to know more about Russia Day. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:67164e0bcd2961729515019@calendarlabs.com
DTSTAMP:20241021T125019Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Civil Unity Day
DTSTART;VALUE=DATE:20251104
DTEND;VALUE=DATE:20251104
LOCATION:Russia
DESCRIPTION:Visit https://calendarlabs.com/holidays/russia/unity-day.php to know more about Civil Unity Day. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:67164e0bcd3b51729515019@calendarlabs.com
DTSTAMP:20241021T125019Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
END:VCALENDAR

View file

@ -1,320 +0,0 @@
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Calendar Labs//Calendar 1.0//EN
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:US Holidays
X-WR-TIMEZONE:Etc/GMT
BEGIN:VEVENT
SUMMARY:New Year's Day
DTSTART;VALUE=DATE:20240101
DTEND;VALUE=DATE:20240101
LOCATION:United States
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/new-years-day.php to know more about New Year's Day. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:6704d93cca14c1728371004@calendarlabs.com
DTSTAMP:20241008T070324Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:M L King Day
DTSTART;VALUE=DATE:20240115
DTEND;VALUE=DATE:20240115
LOCATION:United States
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/martin-luther-king-day.php to know more about M L King Day. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:6704d93cca1e81728371004@calendarlabs.com
DTSTAMP:20241008T070324Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Presidents' Day
DTSTART;VALUE=DATE:20240219
DTEND;VALUE=DATE:20240219
LOCATION:United States
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/presidents-day.php to know more about Presidents' Day. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:6704d93cca27d1728371004@calendarlabs.com
DTSTAMP:20241008T070324Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Good Friday
DTSTART;VALUE=DATE:20240329
DTEND;VALUE=DATE:20240329
LOCATION:United States
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/good-friday.php to know more about Good Friday. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:6704d93cca3161728371004@calendarlabs.com
DTSTAMP:20241008T070324Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Easter Sunday
DTSTART;VALUE=DATE:20240331
DTEND;VALUE=DATE:20240331
LOCATION:United States
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/easter.php to know more about Easter Sunday. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:6704d93cca3ad1728371004@calendarlabs.com
DTSTAMP:20241008T070324Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Memorial Day
DTSTART;VALUE=DATE:20240527
DTEND;VALUE=DATE:20240527
LOCATION:United States
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/memorial-day.php to know more about Memorial Day. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:6704d93cca44a1728371004@calendarlabs.com
DTSTAMP:20241008T070324Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Juneteenth
DTSTART;VALUE=DATE:20240619
DTEND;VALUE=DATE:20240619
LOCATION:United States
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/juneteenth.php to know more about Juneteenth. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:6704d93cca4dc1728371004@calendarlabs.com
DTSTAMP:20241008T070324Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Independence Day
DTSTART;VALUE=DATE:20240704
DTEND;VALUE=DATE:20240704
LOCATION:United States
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/independence-day.php to know more about Independence Day. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:6704d93cca5731728371004@calendarlabs.com
DTSTAMP:20241008T070324Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Labor Day
DTSTART;VALUE=DATE:20240902
DTEND;VALUE=DATE:20240902
LOCATION:United States
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/labor-day.php to know more about Labor Day. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:6704d93cca60a1728371004@calendarlabs.com
DTSTAMP:20241008T070324Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Columbus Day
DTSTART;VALUE=DATE:20241014
DTEND;VALUE=DATE:20241014
LOCATION:United States
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/columbus-day.php to know more about Columbus Day. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:6704d93cca69e1728371004@calendarlabs.com
DTSTAMP:20241008T070324Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Veterans Day
DTSTART;VALUE=DATE:20241111
DTEND;VALUE=DATE:20241111
LOCATION:United States
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/veterans-day.php to know more about Veterans Day. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:6704d93cca7351728371004@calendarlabs.com
DTSTAMP:20241008T070324Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Thanksgiving Day
DTSTART;VALUE=DATE:20241128
DTEND;VALUE=DATE:20241128
LOCATION:United States
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/thanksgiving-day.php to know more about Thanksgiving Day. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:6704d93cca7c61728371004@calendarlabs.com
DTSTAMP:20241008T070324Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Christmas
DTSTART;VALUE=DATE:20241225
DTEND;VALUE=DATE:20241225
LOCATION:United States
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/christmas.php to know more about Christmas. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:6704d93cca8631728371004@calendarlabs.com
DTSTAMP:20241008T070324Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:New Year's Day
DTSTART;VALUE=DATE:20250101
DTEND;VALUE=DATE:20250101
LOCATION:United States
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/new-years-day.php to know more about New Year's Day. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:6704d93cca8fe1728371004@calendarlabs.com
DTSTAMP:20241008T070324Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:M L King Day
DTSTART;VALUE=DATE:20250120
DTEND;VALUE=DATE:20250120
LOCATION:United States
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/martin-luther-king-day.php to know more about M L King Day. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:6704d93cca99a1728371004@calendarlabs.com
DTSTAMP:20241008T070324Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Presidents' Day
DTSTART;VALUE=DATE:20250217
DTEND;VALUE=DATE:20250217
LOCATION:United States
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/presidents-day.php to know more about Presidents' Day. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:6704d93ccaa361728371004@calendarlabs.com
DTSTAMP:20241008T070324Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Good Friday
DTSTART;VALUE=DATE:20250418
DTEND;VALUE=DATE:20250418
LOCATION:United States
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/good-friday.php to know more about Good Friday. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:6704d93ccaad11728371004@calendarlabs.com
DTSTAMP:20241008T070324Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Easter Sunday
DTSTART;VALUE=DATE:20250420
DTEND;VALUE=DATE:20250420
LOCATION:United States
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/easter.php to know more about Easter Sunday. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:6704d93ccab6b1728371004@calendarlabs.com
DTSTAMP:20241008T070324Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Memorial Day
DTSTART;VALUE=DATE:20250526
DTEND;VALUE=DATE:20250526
LOCATION:United States
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/memorial-day.php to know more about Memorial Day. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:6704d93ccac0d1728371004@calendarlabs.com
DTSTAMP:20241008T070324Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Juneteenth
DTSTART;VALUE=DATE:20250619
DTEND;VALUE=DATE:20250619
LOCATION:United States
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/juneteenth.php to know more about Juneteenth. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:6704d93ccacac1728371004@calendarlabs.com
DTSTAMP:20241008T070324Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Independence Day
DTSTART;VALUE=DATE:20250704
DTEND;VALUE=DATE:20250704
LOCATION:United States
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/independence-day.php to know more about Independence Day. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:6704d93ccad4a1728371004@calendarlabs.com
DTSTAMP:20241008T070324Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Labor Day
DTSTART;VALUE=DATE:20250901
DTEND;VALUE=DATE:20250901
LOCATION:United States
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/labor-day.php to know more about Labor Day. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:6704d93ccadea1728371004@calendarlabs.com
DTSTAMP:20241008T070324Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Columbus Day
DTSTART;VALUE=DATE:20251013
DTEND;VALUE=DATE:20251013
LOCATION:United States
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/columbus-day.php to know more about Columbus Day. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:6704d93ccae8a1728371004@calendarlabs.com
DTSTAMP:20241008T070324Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Veterans Day
DTSTART;VALUE=DATE:20251111
DTEND;VALUE=DATE:20251111
LOCATION:United States
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/veterans-day.php to know more about Veterans Day. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:6704d93ccaf2b1728371004@calendarlabs.com
DTSTAMP:20241008T070324Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Thanksgiving Day
DTSTART;VALUE=DATE:20251127
DTEND;VALUE=DATE:20251127
LOCATION:United States
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/thanksgiving-day.php to know more about Thanksgiving Day. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:6704d93ccafd01728371004@calendarlabs.com
DTSTAMP:20241008T070324Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
BEGIN:VEVENT
SUMMARY:Christmas
DTSTART;VALUE=DATE:20251225
DTEND;VALUE=DATE:20251225
LOCATION:United States
DESCRIPTION:Visit https://calendarlabs.com/holidays/us/christmas.php to know more about Christmas. \n\n Like us on Facebook: http://fb.com/calendarlabs to get updates
UID:6704d93ccb0721728371004@calendarlabs.com
DTSTAMP:20241008T070324Z
STATUS:CONFIRMED
TRANSP:TRANSPARENT
SEQUENCE:0
END:VEVENT
END:VCALENDAR

View file

@ -1,89 +0,0 @@
BEGIN:VCALENDAR
VERSION:2.0
METHOD:PUBLISH
PRODID:-//schulferien.org//iCal Generator//DE
BEGIN:VEVENT
CREATED:20240921T032002Z
LAST-MODIFIED:20240921T032002Z
DTSTAMP:20240921T032002Z
SUMMARY:Winterferien 2023 Bayern
DTSTART;VALUE=DATE:20230220
DTEND;VALUE=DATE:20230225
URL:http://www.schulferien.org
DESCRIPTION:Alle Termine auf www.schulferien.org
TRANSP:TRANSPARENT
UID:F_2023_termin66ee1f432d75c@schulferien.org
END:VEVENT
BEGIN:VEVENT
CREATED:20240921T032002Z
LAST-MODIFIED:20240921T032002Z
DTSTAMP:20240921T032002Z
SUMMARY:Osterferien 2023 Bayern
DTSTART;VALUE=DATE:20230403
DTEND;VALUE=DATE:20230416
URL:http://www.schulferien.org
DESCRIPTION:Alle Termine auf www.schulferien.org
TRANSP:TRANSPARENT
UID:F_2023_termin66ee1f432dc7f@schulferien.org
END:VEVENT
BEGIN:VEVENT
CREATED:20240921T032002Z
LAST-MODIFIED:20240921T032002Z
DTSTAMP:20240921T032002Z
SUMMARY:Pfingstferien 2023 Bayern
DTSTART;VALUE=DATE:20230530
DTEND;VALUE=DATE:20230610
URL:http://www.schulferien.org
DESCRIPTION:Alle Termine auf www.schulferien.org
TRANSP:TRANSPARENT
UID:F_2023_termin66ee1f432dccb@schulferien.org
END:VEVENT
BEGIN:VEVENT
CREATED:20240921T032002Z
LAST-MODIFIED:20240921T032002Z
DTSTAMP:20240921T032002Z
SUMMARY:Sommerferien 2023 Bayern
DTSTART;VALUE=DATE:20230731
DTEND;VALUE=DATE:20230912
URL:http://www.schulferien.org
DESCRIPTION:Alle Termine auf www.schulferien.org
TRANSP:TRANSPARENT
UID:F_2023_termin66ee1f432dd04@schulferien.org
END:VEVENT
BEGIN:VEVENT
CREATED:20240921T032002Z
LAST-MODIFIED:20240921T032002Z
DTSTAMP:20240921T032002Z
SUMMARY:Herbstferien 2023 Bayern
DTSTART;VALUE=DATE:20231030
DTEND;VALUE=DATE:20231104
URL:http://www.schulferien.org
DESCRIPTION:Alle Termine auf www.schulferien.org
TRANSP:TRANSPARENT
UID:F_2023_termin66ee1f432dd29@schulferien.org
END:VEVENT
BEGIN:VEVENT
CREATED:20240921T032002Z
LAST-MODIFIED:20240921T032002Z
DTSTAMP:20240921T032002Z
SUMMARY:Herbstferien 2023 Bayern
DTSTART;VALUE=DATE:20231122
DTEND;VALUE=DATE:20231123
URL:http://www.schulferien.org
DESCRIPTION:Alle Termine auf www.schulferien.org
TRANSP:TRANSPARENT
UID:F_2023_termin66ee1f432dd58@schulferien.org
END:VEVENT
BEGIN:VEVENT
CREATED:20240921T032002Z
LAST-MODIFIED:20240921T032002Z
DTSTAMP:20240921T032002Z
SUMMARY:Weihnachtsferien 2023 Bayern
DTSTART;VALUE=DATE:20231223
DTEND;VALUE=DATE:20240106
URL:http://www.schulferien.org
DESCRIPTION:Alle Termine auf www.schulferien.org
TRANSP:TRANSPARENT
UID:F_2023_termin66ee1f432dd7c@schulferien.org
END:VEVENT
END:VCALENDAR

View file

@ -1,32 +0,0 @@
BEGIN:VCALENDAR
PRODID:-//Google Inc//Google Calendar 70.9054//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:other work
X-WR-TIMEZONE:Africa/Nairobi
BEGIN:VEVENT
DTSTART:20241001T183000Z
DTEND:20241001T193000Z
DTSTAMP:20241104T123219Z
UID:5rplp3qqvjadm1bc210un9po2l@google.com
CREATED:20241001T194435Z
LAST-MODIFIED:20241001T194435Z
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:calmerge
TRANSP:OPAQUE
END:VEVENT
BEGIN:VEVENT
DTSTART:20241010T173000Z
DTEND:20241010T183000Z
DTSTAMP:20241104T123219Z
UID:58f1gf5cbp8k1du2chiufuo510@google.com
CREATED:20241010T123352Z
LAST-MODIFIED:20241010T123352Z
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:to do
TRANSP:OPAQUE
END:VEVENT
END:VCALENDAR