diff --git a/siutinchu/.gitignore b/siutinchu/.gitignore new file mode 100644 index 00000000..7610c364 --- /dev/null +++ b/siutinchu/.gitignore @@ -0,0 +1 @@ +**/*.png diff --git a/siutinchu/ENGG1330-Computer-Programming-I/ENGG1330 assignment_1.pdf b/siutinchu/ENGG1330-Computer-Programming-I/ENGG1330 assignment_1.pdf new file mode 100644 index 00000000..87c8195a Binary files /dev/null and b/siutinchu/ENGG1330-Computer-Programming-I/ENGG1330 assignment_1.pdf differ diff --git a/siutinchu/ENGG1330-Computer-Programming-I/build_delivery.bat b/siutinchu/ENGG1330-Computer-Programming-I/build_delivery.bat new file mode 100644 index 00000000..3c64429f --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/build_delivery.bat @@ -0,0 +1,3 @@ +copy .\src\lv1\lv1.py delivery +copy .\src\lv2\lv2.py delivery +copy .\src\lv3\lv3.py delivery \ No newline at end of file diff --git a/siutinchu/ENGG1330-Computer-Programming-I/materials/1_ENGG1330_introduction.pdf b/siutinchu/ENGG1330-Computer-Programming-I/materials/1_ENGG1330_introduction.pdf new file mode 100644 index 00000000..e51e10f6 Binary files /dev/null and b/siutinchu/ENGG1330-Computer-Programming-I/materials/1_ENGG1330_introduction.pdf differ diff --git a/siutinchu/ENGG1330-Computer-Programming-I/materials/2_ENGG1330_Data (10).pdf b/siutinchu/ENGG1330-Computer-Programming-I/materials/2_ENGG1330_Data (10).pdf new file mode 100644 index 00000000..1f493674 Binary files /dev/null and b/siutinchu/ENGG1330-Computer-Programming-I/materials/2_ENGG1330_Data (10).pdf differ diff --git a/siutinchu/ENGG1330-Computer-Programming-I/materials/3_ENGG1330_flow_control_if (3).pdf b/siutinchu/ENGG1330-Computer-Programming-I/materials/3_ENGG1330_flow_control_if (3).pdf new file mode 100644 index 00000000..66cc91ca Binary files /dev/null and b/siutinchu/ENGG1330-Computer-Programming-I/materials/3_ENGG1330_flow_control_if (3).pdf differ diff --git a/siutinchu/ENGG1330-Computer-Programming-I/materials/4_ENGG1330_flow_control_loop (3).pdf b/siutinchu/ENGG1330-Computer-Programming-I/materials/4_ENGG1330_flow_control_loop (3).pdf new file mode 100644 index 00000000..948df566 Binary files /dev/null and b/siutinchu/ENGG1330-Computer-Programming-I/materials/4_ENGG1330_flow_control_loop (3).pdf differ diff --git a/siutinchu/ENGG1330-Computer-Programming-I/materials/5_ENGG1330_function (1).pdf b/siutinchu/ENGG1330-Computer-Programming-I/materials/5_ENGG1330_function (1).pdf new file mode 100644 index 00000000..84ab4d0f Binary files /dev/null and b/siutinchu/ENGG1330-Computer-Programming-I/materials/5_ENGG1330_function (1).pdf differ diff --git a/siutinchu/ENGG1330-Computer-Programming-I/materials/6_ENGG1330_Array.pdf b/siutinchu/ENGG1330-Computer-Programming-I/materials/6_ENGG1330_Array.pdf new file mode 100644 index 00000000..f0e2e458 Binary files /dev/null and b/siutinchu/ENGG1330-Computer-Programming-I/materials/6_ENGG1330_Array.pdf differ diff --git a/siutinchu/ENGG1330-Computer-Programming-I/materials/ENGG1330_tut1.pdf b/siutinchu/ENGG1330-Computer-Programming-I/materials/ENGG1330_tut1.pdf new file mode 100644 index 00000000..b8f56b39 Binary files /dev/null and b/siutinchu/ENGG1330-Computer-Programming-I/materials/ENGG1330_tut1.pdf differ diff --git a/siutinchu/ENGG1330-Computer-Programming-I/materials/ENGG1330_tut2_2023.pdf b/siutinchu/ENGG1330-Computer-Programming-I/materials/ENGG1330_tut2_2023.pdf new file mode 100644 index 00000000..72cf918d Binary files /dev/null and b/siutinchu/ENGG1330-Computer-Programming-I/materials/ENGG1330_tut2_2023.pdf differ diff --git a/siutinchu/ENGG1330-Computer-Programming-I/materials/ENGG1330_tut3_2023 (2).pdf b/siutinchu/ENGG1330-Computer-Programming-I/materials/ENGG1330_tut3_2023 (2).pdf new file mode 100644 index 00000000..77224ee8 Binary files /dev/null and b/siutinchu/ENGG1330-Computer-Programming-I/materials/ENGG1330_tut3_2023 (2).pdf differ diff --git a/siutinchu/ENGG1330-Computer-Programming-I/materials/ENGG1330_tut4_2023 (3).pdf b/siutinchu/ENGG1330-Computer-Programming-I/materials/ENGG1330_tut4_2023 (3).pdf new file mode 100644 index 00000000..ad0bb97f Binary files /dev/null and b/siutinchu/ENGG1330-Computer-Programming-I/materials/ENGG1330_tut4_2023 (3).pdf differ diff --git a/siutinchu/ENGG1330-Computer-Programming-I/materials/ENGG1330_tut5_2023 (2).pdf b/siutinchu/ENGG1330-Computer-Programming-I/materials/ENGG1330_tut5_2023 (2).pdf new file mode 100644 index 00000000..f1d1d362 Binary files /dev/null and b/siutinchu/ENGG1330-Computer-Programming-I/materials/ENGG1330_tut5_2023 (2).pdf differ diff --git a/siutinchu/ENGG1330-Computer-Programming-I/materials/ENGG1330_tut6_2023 (1).pdf b/siutinchu/ENGG1330-Computer-Programming-I/materials/ENGG1330_tut6_2023 (1).pdf new file mode 100644 index 00000000..8a630752 Binary files /dev/null and b/siutinchu/ENGG1330-Computer-Programming-I/materials/ENGG1330_tut6_2023 (1).pdf differ diff --git a/siutinchu/ENGG1330-Computer-Programming-I/quotation.md b/siutinchu/ENGG1330-Computer-Programming-I/quotation.md new file mode 100644 index 00000000..399e3243 --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/quotation.md @@ -0,0 +1,3 @@ +# \siutinchu + +HKD150 diff --git a/siutinchu/ENGG1330-Computer-Programming-I/readme.md b/siutinchu/ENGG1330-Computer-Programming-I/readme.md new file mode 100644 index 00000000..e0f5b87d --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/readme.md @@ -0,0 +1,13 @@ +A LRU cache is a special kind of cache that defines the way of evicting item from the cache when it is full. Its policy is to evict the least recently used item. + +For example, + - a cache having capacity of 4 and is currently storing + `[[1, '101'], [2, '102'], [3, '103'], [4, '104']]`, + - where the 1st (leftmost) item [1, '101'] is the least recently used and + - the last (rightmost) item [4, '104'] is the most recently used. + - When the item [2, '102'] is accessed, + - the cache becomes [[1, '101'], [3, '103'], [4, '104'], [2, '102']] as the item [2, '102'] becomes the most recently used. + - When another item [10, '110'] is pushed into the cache, + - the cache cannot hold all of the items and + - must evict the least recently used item which is [1, '101'] and + - the cache becomes [[3, '103'], [4, '104'], [2, '102'], [10, '110']]. \ No newline at end of file diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/lv1/input1.txt b/siutinchu/ENGG1330-Computer-Programming-I/src/lv1/input1.txt new file mode 100644 index 00000000..7a28181c --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/lv1/input1.txt @@ -0,0 +1,3 @@ +-1 +1,2,3,4,5,6,7,8,9,10 +101,102,103,104,105,106,107,108,109,110 \ No newline at end of file diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/lv1/input2.txt b/siutinchu/ENGG1330-Computer-Programming-I/src/lv1/input2.txt new file mode 100644 index 00000000..11bcc344 --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/lv1/input2.txt @@ -0,0 +1,3 @@ +3 +1,2,3,4,5,6,7,8,9,10 +101,102,103,104,105,106,107,108,109,110 \ No newline at end of file diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/lv1/input3.txt b/siutinchu/ENGG1330-Computer-Programming-I/src/lv1/input3.txt new file mode 100644 index 00000000..6e226a82 --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/lv1/input3.txt @@ -0,0 +1,3 @@ +6 +9,10 +101,102,103,104,105,106,107,108,109,110 \ No newline at end of file diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/lv1/input4.txt b/siutinchu/ENGG1330-Computer-Programming-I/src/lv1/input4.txt new file mode 100644 index 00000000..a78bf005 --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/lv1/input4.txt @@ -0,0 +1,3 @@ +6 +9,10 +109,110 \ No newline at end of file diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/lv1/lv1.py b/siutinchu/ENGG1330-Computer-Programming-I/src/lv1/lv1.py new file mode 100644 index 00000000..4a145faf --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/lv1/lv1.py @@ -0,0 +1,72 @@ +cache = [] +IDX_KEY=0 +IDX_VALUE=1 + +CACHE_LEN_UNLIMITED=-1 +KEY_VALUE_DIFFERENT_ERROR='Warning: number of keys and values are not the same' + +### Assumptions:s +# - 1 ≤ C ≤ 1000 or C = −1 +# - 1 ≤ Nk,Nv ≤ 1000 +# - Input keys can be converted to integers +# - Input keys are unique, no duplicates +# - Input values are non-null string + +def negative(num): + return 0 - num + +# 1st input, Input keys can be converted to integers +LRU_CACHE_LEN = int(input()) +# 2nd input, keys +KEYS = input() +# 3rd input, values +VALUES = input() + +def convert_to_int(input_list): + output = [] + for i in range(0,len(input_list)): + output.append(int(input_list[i])) + return output + +def create_cache_element(list_keys, list_values): + output = [] + for i in range(0,len(list_keys)): + output.append([list_keys[i], list_values[i]]) + return output + +# REQUIREMENTS: Keys must be stored as integers. +# ASSUMPTIONS: Input keys are unique, no duplicates +# ASSUMPTIONS: Input keys can be converted to integers +list_keys = convert_to_int(KEYS.split(',')) +len_list_keys = len(list_keys) + +# REQUIREMENTS: Values must be stored as strings. +# ASSUMPTIONS: Input values are non-null string +list_values = list(VALUES.split(',')) +len_list_values = len(list_values) + +# HANDLE: If the numbers of keys and values are different, +# prints "Warning: number of keys and values are not the same" and outputs an empty cache. +if (len_list_keys != len_list_values): + print(KEY_VALUE_DIFFERENT_ERROR) + +# HANDLE: If the cache capacity is infinity +elif (LRU_CACHE_LEN == CACHE_LEN_UNLIMITED): + cache = create_cache_element(list_keys, list_values) + +# HANDLE: If the cache capacity is larger than or equal to the number of data items +elif (LRU_CACHE_LEN >= len_list_keys): + cache = create_cache_element(list_keys, list_values) + +# HANDLE: +# If the cache capacity is smaller than the number of data items, +# keeps only those that are near the end of the inputs (right) up to the capacity +elif (LRU_CACHE_LEN < len_list_keys): + temp = create_cache_element(list_keys, list_values) + slice_start = negative(LRU_CACHE_LEN) + cache = temp[slice_start:] + +else: + pass + +print(cache) diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/lv1/lv1_lambda.py b/siutinchu/ENGG1330-Computer-Programming-I/src/lv1/lv1_lambda.py new file mode 100644 index 00000000..6dfd0b1a --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/lv1/lv1_lambda.py @@ -0,0 +1,63 @@ +import os,sys +from pprint import pprint + +cache = [] +IDX_KEY=0 +IDX_VALUE=1 + +CACHE_LEN_UNLIMITED=-1 +KEY_VALUE_DIFFERENT_ERROR='Warning: number of keys and values are not the same' + +### Assumptions: +# - 1 ≤ C ≤ 1000 or C = −1 +# - 1 ≤ Nk,Nv ≤ 1000 +# - Input keys can be converted to integers +# - Input keys are unique, no duplicates +# - Input values are non-null string + +def negative(num): + return 0 - num + +# 1st input, Input keys can be converted to integers +LRU_CACHE_LEN = int(input()) +# 2nd input, keys +KEYS = input() +# 3rd input, values +VALUES = input() + +# REQUIREMENTS: Keys must be stored as integers. +# ASSUMPTIONS: Input keys are unique, no duplicates +# ASSUMPTIONS: Input keys can be converted to integers +list_keys = list(map(lambda x: int(x), KEYS.split(','))) +len_list_keys = len(list_keys) + +# REQUIREMENTS: Values must be stored as strings. +# ASSUMPTIONS: Input values are non-null string +list_values = list(VALUES.split(',')) +len_list_values = len(list_values) + +# HANDLE: If the numbers of keys and values are different, +# prints "Warning: number of keys and values are not the same" and outputs an empty cache. +if (len_list_keys != len_list_values): + print(KEY_VALUE_DIFFERENT_ERROR) + +# HANDLE: If the cache capacity is infinity +elif (LRU_CACHE_LEN == CACHE_LEN_UNLIMITED): + cache = list(map(lambda x: [x[IDX_KEY],x[IDX_VALUE]], zip(list_keys, list_values))) + +# HANDLE: If the cache capacity is larger than or equal to the number of data items +elif (LRU_CACHE_LEN >= len_list_keys): + cache = list(map(lambda x: [x[IDX_KEY],x[IDX_VALUE]], zip(list_keys, list_values))) + +# HANDLE: +# If the cache capacity is smaller than the number of data items, +# keeps only those that are near the end of the inputs (right) up to the capacity +elif (LRU_CACHE_LEN < len_list_keys): + temp = list(map(lambda x: [x[IDX_KEY],x[IDX_VALUE]], zip(list_keys, list_values))) + slice_start = negative(LRU_CACHE_LEN) + cache = temp[slice_start:] + +else: + pass + +print(cache) diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/lv1/lv1_readme.md b/siutinchu/ENGG1330-Computer-Programming-I/src/lv1/lv1_readme.md new file mode 100644 index 00000000..9da9a183 --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/lv1/lv1_readme.md @@ -0,0 +1,93 @@ +# ENGG1330-Computer-Programming-I + +## Level 1 (25%) +Your program will receive + the capacity of the cache, + a list of keys and + a list of values as the inputs. + +You are then required to combine the keys and values to initialize a cache as a list of key-value pairs as follows and each key-value pair is stored as a sub-list of length 2. +![𝐾1, 𝑉1], [𝐾2, 𝑉2], … [𝐾𝑛, 𝑉𝑛],, 𝑤ℎ𝑒𝑟𝑒 𝑛 𝑖𝑠 𝑡ℎ𝑒 𝑛𝑢𝑚𝑏𝑒𝑟 𝑜𝑓 𝑑𝑎𝑡𝑎 𝑖𝑡𝑒𝑚𝑠 + +## Requirements: + +1. Keys must be stored as integers. +1. Values must be stored as strings. +1. If the numbers of keys and values are different, prints "Warning: number of keys and values are not the same" and outputs an empty cache. +1. If the cache capacity is larger than or equal to the number of data items, stores all the data items in the cache. The order of data items stored in the cache must be the same as the order of the input key-value pairs. +1. If the cache capacity is smaller than the number of data items, keeps only those that are near the end of the inputs (right) up to the capacity. For example, if capacity is 3, keys = [1,2,3,4,5] and values = [-1,-2,-3,-4,-5], cache = [[3, '-3'], [4, '-4'], [5, '-5']]. + +### Inputs: +1. Capacity of the cache � (integer). � = -1 means that the cache has unlimited capacity. +1. A string of integral keys K1, K2, …, KNk separated by "," where �! is number of keys. +1. A string of values V1, V2, …, VNv separated by "," where �" is number of values. + +### Outputs: +1. Warning message if `Nk != Nv`. +1. Cache as a list with format ![𝐾1, 𝑉1], [𝐾2, 𝑉2], … [𝐾𝑛, 𝑉𝑛],. + +### Assumptions: +- 1 ≤ � ≤ 1000 �� � = −1 +- 1 ≤ �!, �" ≤ 1000 +- Input keys can be converted to integers +- Input keys are unique, no duplicates +- Input values are non-null string + +### Hints: + +- You can use "A_STRING".split(",") to split a string separated by a comma "," into a +list of strings, e.g., "1,2,3".split(",") à ["1", "2", "3"] +https://docs.python.org/3/library/stdtypes.html#str.split + +### Examples: + +Case Sample input Sample output + +- case 1 + - input + ``` + -1 + 1,2,3,4,5,6,7,8,9,10 + 101,102,103,104,105,106,107,108,109,110 + ``` + - output + ``` + [[1,'101'],[2,'102'],[3,'103'],[4,'104'],[5,'105'],[6,'106'],[7,'107'],[8,'108'],[9,'109'],[10,'110']] + ``` + +- case 2 + - input + ``` + 3 + 1,2,3,4,5,6,7,8,9,10 + 101,102,103,104,105,106,107,108,109,110 + ``` + - output + ``` + [[8, '108'], [9, '109'], [10, '110']] + ``` + +- case 3 + - input + ``` + 6 + 9,10 + 101,102,103,104,105,106,107,108,109,110 + ``` + - output + ``` + Warning: number of keys and values are not the same + [] + ``` + +- case 4 + - input + ``` + 6 + 9,10 + 109,110 + ``` + - output + ``` + [[9, '109'], [10, '110']] + ``` diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/lv1/run.bat b/siutinchu/ENGG1330-Computer-Programming-I/src/lv1/run.bat new file mode 100644 index 00000000..7e00d9d2 --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/lv1/run.bat @@ -0,0 +1,15 @@ +python lv1_lambda.py < input1.txt +python lv1.py < input1.txt +@REM echo "[[1, '101'], [2, '102'], [3, '103'], [4, '104'], [5, '105'], [6, '106'], [7, '107'], [8, '108'], [9, '109'], [10, '110']]" + +python lv1_lambda.py < input2.txt +python lv1.py < input2.txt +@REM [[8, '108'], [9, '109'], [10, '110']] + +python lv1_lambda.py < input3.txt +python lv1.py < input3.txt +@REM echo "[]" + +python lv1_lambda.py < input4.txt +python lv1.py < input4.txt +@REM echo "[[9, '109'], [10, '110']]" diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/lv1/test.bat b/siutinchu/ENGG1330-Computer-Programming-I/src/lv1/test.bat new file mode 100644 index 00000000..283f1ebb --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/lv1/test.bat @@ -0,0 +1 @@ +nodemon --ext "py, bat" --exec run.bat \ No newline at end of file diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/lv2/input1.txt b/siutinchu/ENGG1330-Computer-Programming-I/src/lv2/input1.txt new file mode 100644 index 00000000..797e9731 --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/lv2/input1.txt @@ -0,0 +1,9 @@ +-1 +1,2,3,4,5,6,7,8,9,10 +101,102,103,104,105,106,107,108,109,110 +get,3 +get,6 +get,1 +get,100 +get,5 +end \ No newline at end of file diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/lv2/input2.txt b/siutinchu/ENGG1330-Computer-Programming-I/src/lv2/input2.txt new file mode 100644 index 00000000..95dff2bf --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/lv2/input2.txt @@ -0,0 +1,9 @@ +3 +1,2,3,4,5,6,7,8,9,10 +101,102,103,104,105,106,107,108,109,110 +get,1 +get,2 +get,3 +get,10 +get,9 +end \ No newline at end of file diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/lv2/input3.txt b/siutinchu/ENGG1330-Computer-Programming-I/src/lv2/input3.txt new file mode 100644 index 00000000..b6843424 --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/lv2/input3.txt @@ -0,0 +1,17 @@ +6 +9,10 +101,102,103,104,105,106,107,108,109,110 +get,9 +put,1,100 +put,2,200 +put,3,300 +get,10 +get,2 +put,4,400 +put,5,500 +put,6,600 +put,1,10000 +put,7,700 +get,3 +get,2 +end \ No newline at end of file diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/lv2/input4.txt b/siutinchu/ENGG1330-Computer-Programming-I/src/lv2/input4.txt new file mode 100644 index 00000000..eec3aeb9 --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/lv2/input4.txt @@ -0,0 +1,8 @@ +1 +9,10 +109,110 +get,1 +put,1,6 +put,3,5 +get,1 +end \ No newline at end of file diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/lv2/input5.txt b/siutinchu/ENGG1330-Computer-Programming-I/src/lv2/input5.txt new file mode 100644 index 00000000..ea4628a7 --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/lv2/input5.txt @@ -0,0 +1,13 @@ +-1 +1,2,3,4,5,6,7,8,9,10 +101,102,103,104,105,106,107,108,109,110 +get,3 +get,6 +get,1 +get,100 +get,5 +put,100,1000 +put,200,2000 +put,300,3000 +get,2 +end \ No newline at end of file diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/lv2/lv2.py b/siutinchu/ENGG1330-Computer-Programming-I/src/lv2/lv2.py new file mode 100644 index 00000000..6f22252c --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/lv2/lv2.py @@ -0,0 +1,128 @@ +# Assumptions: +# - 1 ≤ C ≤ 1000 or C = −1 +# - 1 ≤ Nk, Nv ≤ 1000 +# - Input keys can be converted to integers +# - Input keys are unique, no duplicates +# - Input values are non-null string +# - None of the values will be equal to “NULL” + +CACHE_LEN_UNLIMITED=-1 +KEY_VALUE_DIFFERENT_ERROR='Warning: number of keys and values are not the same' +NULL = None +cache = [] +IDX_KEY=0 +IDX_VALUE=1 + +def GETCommand(cache, key): + # ASSUMPTIONS: Input keys are unique, no duplicates + # For every get operation, + # print the value of the key-value pair if the key exists, + # otherwise print “NULL” + + key_found = False + for i in range(0,len(cache)): + if (cache[i][IDX_KEY] == int(key)): + print(cache[i][IDX_VALUE]) + cache.append(cache.pop(i)) + key_found=True + break + + if not(key_found): + print("NULL") + + pass + +def PUTCommand(key, value): + # ASSUMPTION: Input keys can be converted to integers + if LRU_CACHE_LEN != CACHE_LEN_UNLIMITED: + if (len(cache) >= LRU_CACHE_LEN): + cache.pop(0) + cache.append([int(key), value]) + + return cache + +def EndCommand(): + print(cache) + +def ConvertToInt(input_list): + output = [] + for i in range(0,len(input_list)): + output.append(int(input_list[i])) + return output + + +# 1st input, Input keys can be converted to integers +LRU_CACHE_LEN = int(input()) +# 2nd input, keys +KEYS = input() +# 3rd input, values +VALUES = input() + +# REQUIREMENTS: Keys must be stored as integers. +# ASSUMPTIONS: Input keys are unique, no duplicates +# ASSUMPTIONS: Input keys can be converted to integers +list_keys = ConvertToInt(KEYS.split(',')) +len_list_keys = len(list_keys) + +# REQUIREMENTS: Values must be stored as strings. +# ASSUMPTIONS: Input values are non-null string +list_values = list(VALUES.split(',')) +len_list_values = len(list_values) + +# setup cache +# REQUIREMENTS: If the numbers of keys and values are different, prints "Warning: number of keys and values are not the same" and outputs an empty cache. +if (len_list_keys != len_list_values): + print(KEY_VALUE_DIFFERENT_ERROR) + +# REQUIREMENTS: If the cache capacity is larger than or equal to the number of data items +elif (LRU_CACHE_LEN == CACHE_LEN_UNLIMITED): + for i in range(0, len(list_keys)): + key = list_keys[i] + value = list_values[i] + + cache.append([key, value]) + +# REQUIREMENTS: If the cache capacity is larger than or equal to the number of data items +elif (LRU_CACHE_LEN >= len_list_keys): + for i in range(0, len(list_keys)): + key = list_keys[i] + value = list_values[i] + + if (len(cache) >= LRU_CACHE_LEN): + cache.pop(0) + cache.append([key,value]) + +# REQUIREMENTS: +# If the cache capacity is smaller than the number of data items, +# keeps only those that are near the end of the inputs (right) up to the capacity +elif (LRU_CACHE_LEN < len_list_keys): + for i in range(0, len(list_keys)): + key = list_keys[i] + value = list_values[i] + + if (len(cache) >= LRU_CACHE_LEN): + cache.pop(0) + cache.append([key,value]) + +else: + pass + +loop_exit = False +while not(loop_exit): + command = input() + command_splitted = command.split(',') + command_with_para = len(command_splitted) > 1 + + if (command_splitted[0] == 'get'): + cache_pos = command_splitted[1] + GETCommand(cache, cache_pos) + + elif (command_splitted[0] == 'put'): + [put_key, put_value] = command_splitted[1:3] + cache = PUTCommand(put_key, put_value) + + elif command == 'end': + EndCommand() + loop_exit = True + else: + pass \ No newline at end of file diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/lv2/lv2_lambda.py b/siutinchu/ENGG1330-Computer-Programming-I/src/lv2/lv2_lambda.py new file mode 100644 index 00000000..0497b3d6 --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/lv2/lv2_lambda.py @@ -0,0 +1,114 @@ +import os,sys +from pprint import pprint + +# Assumptions: +# - 1 ≤ C ≤ 1000 or C = −1 +# - 1 ≤ Nk, Nv ≤ 1000 +# - Input keys can be converted to integers +# - Input keys are unique, no duplicates +# - Input values are non-null string +# - None of the values will be equal to “NULL” + +CACHE_LEN_UNLIMITED=-1 +KEY_VALUE_DIFFERENT_ERROR='Warning: number of keys and values are not the same' +NULL = None +cache = [] +IDX_KEY=0 +IDX_VALUE=1 + +def GETCommand(cache, key): + # ASSUMPTIONS: Input keys are unique, no duplicates + # For every get operation, + # print the value of the key-value pair if the key exists, + # otherwise print “NULL” + + key_found = False + for i in range(0,len(cache)): + if (cache[i][IDX_KEY] == int(key)): + print(cache[i][IDX_VALUE]) + cache.append(cache.pop(i)) + key_found=True + break + + if not(key_found): + print("NULL") + + pass + +def PUTCommand(key, value): + # ASSUMPTION: Input keys can be converted to integers + if LRU_CACHE_LEN != CACHE_LEN_UNLIMITED: + if (len(cache) >= LRU_CACHE_LEN): + cache.pop(0) + cache.append([int(key), value]) + + return cache + +def EndCommand(): + print(cache) + sys.exit() + +# 1st input, Input keys can be converted to integers +LRU_CACHE_LEN = int(input()) +# 2nd input, keys +KEYS = input() +# 3rd input, values +VALUES = input() + +# REQUIREMENTS: Keys must be stored as integers. +# ASSUMPTIONS: Input keys are unique, no duplicates +# ASSUMPTIONS: Input keys can be converted to integers +list_keys = list(map(lambda x: int(x), KEYS.split(','))) +len_list_keys = len(list_keys) + +# REQUIREMENTS: Values must be stored as strings. +# ASSUMPTIONS: Input values are non-null string +list_values = list(VALUES.split(',')) +len_list_values = len(list_values) + +# setup cache +# REQUIREMENTS: If the numbers of keys and values are different, prints "Warning: number of keys and values are not the same" and outputs an empty cache. +if (len_list_keys != len_list_values): + print(KEY_VALUE_DIFFERENT_ERROR) + +# REQUIREMENTS: If the cache capacity is larger than or equal to the number of data items +elif (LRU_CACHE_LEN == CACHE_LEN_UNLIMITED): + for key, value in zip(list_keys, list_values): + cache.append([key, value]) + +# REQUIREMENTS: If the cache capacity is larger than or equal to the number of data items +elif (LRU_CACHE_LEN >= len_list_keys): + for key, value in zip(list_keys, list_values): + if (len(cache) >= LRU_CACHE_LEN): + cache.pop(0) + cache.append([key,value]) + +# REQUIREMENTS: +# If the cache capacity is smaller than the number of data items, +# keeps only those that are near the end of the inputs (right) up to the capacity +elif (LRU_CACHE_LEN < len_list_keys): + for key, value in zip(list_keys, list_values): + if (len(cache) >= LRU_CACHE_LEN): + cache.pop(0) + cache.append([key,value]) + +else: + pass + +while True: + command = input() + command_splitted = command.split(',') + command_with_para = len(command_splitted) > 1 + + if (command_splitted[0] == 'get'): + cache_pos = command_splitted[1] + GETCommand(cache, cache_pos) + + elif (command_splitted[0] == 'put'): + [put_key, put_value] = command_splitted[1:3] + cache = PUTCommand(put_key, put_value) + + elif command == 'end': + EndCommand() + else: + pass \ No newline at end of file diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/lv2/lv2_readme.md b/siutinchu/ENGG1330-Computer-Programming-I/src/lv2/lv2_readme.md new file mode 100644 index 00000000..a1724df8 --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/lv2/lv2_readme.md @@ -0,0 +1,125 @@ +# ENGG1330-Computer-Programming-I + +## Level 2 (45%) + +Next, you are going to implement two main functions, get(key) and put(key, value) to access a data item in the cache. The get(key) function retrieves the value of the data item given by the key parameter if the key exists in the cache. The put(key, value) function modifies the value of the data item, if the key exists, or inserts a new data item, if the key does not exist. + +The ordering of data items in the cache must conform to the description in the Introduction, i.e., the 1st (leftmost) item is the least recently used while the last (rightmost) item is the most recently used. Every time a data item is accessed, whether using get or put, +the data item has to be moved to the end (rightmost) of the cache to become the most recently used item. When a new data item is inserted to a full cache, the least recently used (leftmost) item needs to be evicted. + +For example, given a cache of capacity 5: + `[[1,'100'], [2,'200'], [3,'300'], [4,'400']]` +, the cache contents will be updated as follows. + +1. get(3) -> [[1,'100'], [2,'200'], [4,'400'], [3,'300']] +1. put(2,’6’) -> [[1,'100'], [4,'400'], [3,'300'], [2,'6']] +1. put(10,’-1’) -> [[1,'100'], [4,'400'], [3,'300'], [2,'6'], [10,'-1']] +1. put(100,’-5’) -> [[4,'400'], [3,'300'], [2,'6'], [10,'-1'], [100,'-5']] + +In addition to the inputs you received from Level 1, you will also receive a list of commands. "get,KEY" denotes the get operation with key KEY and "put,KEY,VALUE" denotes the put operation with key KEY and value VALUE. Get operation prints the value of the keyvalue pair if the key exists, otherwise prints "NULL". Put operation does not need to print anything. The command "end" denotes the end of the inputs and you should then print the final contents of the cache. + +### Inputs: +1. Capacity of the cache `C` (integer). `C` = -1 means that the cache has unlimited capacity. +1. A string of integral keys K1, K2, …, KNk separated by "," where Nk is number of keys. +1. A string of values V1, V2, …, VNv separated by "," where Nv is number of values. +1. A series of commands consisting of either "get,KEY" or "put,KEY,VALUE" separated by a newline character. +1. The input must be ended with "end". + +### Outputs: +1. Warning message if �! ¹ �". +2. For every get operation, print the value of the key-value pair if the key exists, +otherwise print "NULL". +3. Cache as a list with format ![�1, �1],[�2, �2], … [��, ��], with the 1st (leftmost) +item being the least recently used while the last (rightmost) item being the most +recently used. + +### Assumptions: +- 1 ≤ � ≤ 1000 �� � = −1 +- 1 ≤ �!, �" ≤ 1000 +- Input keys can be converted to integers +- Input keys are unique, no duplicates +- Input values are non-null string +- None of the values will be equal to "NULL" + +### Examples: +- Case + - Sample input + - Sample output + + +- Case 1 + - Sample input + ``` + -1 + 1,2,3,4,5,6,7,8,9,10 + 101,102,103,104,105,106,107,108,109,110 + get,3 + get,6 + get,1 + get,100 + get,5 + end + ``` + - Sample output + ``` + 103 + 106 + 101 + NULL + 105 + [[2, '102'], [4, '104'], [7, '107'], [8,'108'], [9, '109'], [10, '110'], [3,'103'], [6, '106'], [1, '101'], [5,'105']] + ``` +- Case 2 + - Sample input + ``` + 3 + 1,2,3,4,5,6,7,8,9,10 + 101,102,103,104,105,106,107,108,109,110 + get,1 + get,2 + get,3 + get,10 + get,9 + end + ``` + - Sample output + ``` + NULL + NULL + NULL + 110 + 109 + [[8, '108'], [10, '110'], [9, '109']] + ``` + +- Case 3 + - Sample input + ``` + 6 + 9,10 + 101,102,103,104,105,106,107,108,109,110 + get,9 + put,1,100 + put,2,200 + put,3,300 + get,10 + get,2 + put,4,400 + put,5,500 + put,6,600 + put,1,10000 + put,7,700 + get,3 + get,2 + end + ``` + - Sample output + ``` + Warning: number of keys and values are not the same + NULL <- get,9 + NULL <- get,10 + 200 <- get,2 + NULL <- get,3 + 200 <- get,2 + [[4, '400'], [5, '500'], [6, '600'], [1, '10000'], [7, '700'], [2, '200']] + ``` diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/lv2/run.bat b/siutinchu/ENGG1330-Computer-Programming-I/src/lv2/run.bat new file mode 100644 index 00000000..f9a83f1e --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/lv2/run.bat @@ -0,0 +1,44 @@ +python lv2.py < input1.txt +python lv2_lambda.py < input1.txt +@REM 103 +@REM 106 +@REM 101 +@REM NULL +@REM 105 +@REM [[2, '102'], [4, '104'], [7, '107'], [8, '108'], [9, '109'], [10, '110'], [3, '103'], [6, '106'], [1, '101'], [5, '105']] + +python lv2.py < input2.txt +python lv2_lambda.py < input2.txt +@REM NULL +@REM NULL +@REM NULL +@REM 110 +@REM 109 +@REM [[8, '108'], [10, '110'], [9, '109']] + +python lv2.py < input3.txt +python lv2_lambda.py < input3.txt +@REM Warning: number of keys and values are not the same +@REM NULL +@REM NULL +@REM 200 +@REM NULL +@REM 200 +@REM [[4, '400'], [5, '500'], [6, '600'], [1, '10000'], [7, '700'], [2, '200']] + +python lv2.py < input4.txt +python lv2_lambda.py < input4.txt +@REM NULL +@REM NULL +@REM [[3, '5']] + +python lv2.py < input5.txt +python lv2_lambda.py < input5.txt +@REM 103 +@REM 106 +@REM 101 +@REM NULL +@REM 105 +@REM 102 +@REM [[4, '104'], [7, '107'], [8, '108'], [9, '109'], [10, '110'], [3, '103'], [6, '106'], [1, '101'], [5, '105'], [100, '1000'], [200, '2000'], [300, '3000'], [2, '102']] + diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/lv2/test.bat b/siutinchu/ENGG1330-Computer-Programming-I/src/lv2/test.bat new file mode 100644 index 00000000..283f1ebb --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/lv2/test.bat @@ -0,0 +1 @@ +nodemon --ext "py, bat" --exec run.bat \ No newline at end of file diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/input1.txt b/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/input1.txt new file mode 100644 index 00000000..797e9731 --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/input1.txt @@ -0,0 +1,9 @@ +-1 +1,2,3,4,5,6,7,8,9,10 +101,102,103,104,105,106,107,108,109,110 +get,3 +get,6 +get,1 +get,100 +get,5 +end \ No newline at end of file diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/input2.txt b/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/input2.txt new file mode 100644 index 00000000..95dff2bf --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/input2.txt @@ -0,0 +1,9 @@ +3 +1,2,3,4,5,6,7,8,9,10 +101,102,103,104,105,106,107,108,109,110 +get,1 +get,2 +get,3 +get,10 +get,9 +end \ No newline at end of file diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/input3.txt b/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/input3.txt new file mode 100644 index 00000000..b6843424 --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/input3.txt @@ -0,0 +1,17 @@ +6 +9,10 +101,102,103,104,105,106,107,108,109,110 +get,9 +put,1,100 +put,2,200 +put,3,300 +get,10 +get,2 +put,4,400 +put,5,500 +put,6,600 +put,1,10000 +put,7,700 +get,3 +get,2 +end \ No newline at end of file diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/input4.txt b/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/input4.txt new file mode 100644 index 00000000..749d77ef --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/input4.txt @@ -0,0 +1,18 @@ +6 +1,2,3,4,5 +101,102,103,104,105 +get,9 +get,5 +get,3 +put,1,10000 +put,6,600 +put,7,700 +get,10 +get,7 +get,6 +get,5 +get,4 +get,3 +get,2 +get,1 +end \ No newline at end of file diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/input5.txt b/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/input5.txt new file mode 100644 index 00000000..eec3aeb9 --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/input5.txt @@ -0,0 +1,8 @@ +1 +9,10 +109,110 +get,1 +put,1,6 +put,3,5 +get,1 +end \ No newline at end of file diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/input6.txt b/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/input6.txt new file mode 100644 index 00000000..ea4628a7 --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/input6.txt @@ -0,0 +1,13 @@ +-1 +1,2,3,4,5,6,7,8,9,10 +101,102,103,104,105,106,107,108,109,110 +get,3 +get,6 +get,1 +get,100 +get,5 +put,100,1000 +put,200,2000 +put,300,3000 +get,2 +end \ No newline at end of file diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/lv3.py b/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/lv3.py new file mode 100644 index 00000000..3ebbe9df --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/lv3.py @@ -0,0 +1,193 @@ +# Assumptions: +# • 1 ≤ C ≤ 10000 or C = −1 +# • 1 ≤ Nk, Nv ≤ 10000 +# • Input keys can be converted to integers +# • Input keys are unique, no duplicates +# • Input values are non-null string +# • None of the values will be equal to “NULL” +# • Time constraint will be imposed on VPL and timeout is possible + +CACHE_LEN_UNLIMITED=-1 +KEY_VALUE_DIFFERENT_ERROR='Warning: number of keys and values are not the same' +NULL = None +MAX_OPER=1 + +cache = [] +IDX_KEY=0 +IDX_VALUE=1 +IDX_OPER=2 + +def GetOperFromList(list_cache): + output = [] + for i in range(0,len(list_cache)): + output.append(list_cache[i][IDX_OPER]) + return output + +def PrintKeyAndValueOnly(cache): + output = [] + for i in range(0,len(cache)): + output.append([cache[i][IDX_KEY], cache[i][IDX_VALUE]]) + return output + +def GETCommand(cache, key): + global MAX_OPER + # pos in cache = textual pos - 1 + # can key found ? + # FROM ASSUMPTIONS: Input keys are unique, no duplicates + + key_found = False + + for i in range(0,len(cache)): + if (cache[i][0] == int(key)): + MAX_OPER+=1 + cache[i][IDX_OPER] = MAX_OPER + print(cache[i][IDX_VALUE]) + key_found=True + break + + if not(key_found): + print("NULL") + + pass + +def PUTCommand(key, value): + global MAX_OPER + # FROM ASSUMPTION: Input keys can be converted to integers + + if LRU_CACHE_LEN == CACHE_LEN_UNLIMITED: + # try find key in cache, if found replace it + # if not append into cache + found = False + for i in range(0,len(cache)): + if (cache[i][IDX_KEY] == int(key)): + cache[i][IDX_VALUE] = value + cache[i][IDX_OPER] = MAX_OPER + MAX_OPER+=1 + found = True + break + + if not(found): + cache.append([int(key), value, MAX_OPER]) + + else: + # check if cache length already reach the max one + if (len(cache) < LRU_CACHE_LEN): + # try find key in cache, if found replace it + # if not append at the end of list + found = False + for i in range(0,len(cache)): + if (cache[i][IDX_KEY] == int(key)): + cache[i][IDX_VALUE] = value + cache[i][IDX_OPER] = MAX_OPER + MAX_OPER+=1 + found = True + break + + if not(found): + cache.append([int(key), value, MAX_OPER]) + + else: + # try find key in cache, if found replace it + # if not replace the lowest oper one + found = False + min_oper = min(GetOperFromList(cache)) + + for i in range(0,len(cache)): + if (cache[i][IDX_KEY] == int(key)): + cache[i][IDX_VALUE] = value + cache[i][IDX_OPER] = MAX_OPER + MAX_OPER+=1 + found = True + break + + if not(found): + for i in range(0,len(cache)): + if (cache[i][IDX_OPER] == min_oper): + MAX_OPER+=1 + cache[i] = [int(key), value, MAX_OPER] + + + MAX_OPER+=1 + return cache + +def EndCommand(): + # reformat for print + cache_temp = PrintKeyAndValueOnly(cache) + print(cache_temp) + +def ConvertToInt(input_list): + output = [] + for i in range(0,len(input_list)): + output.append(int(input_list[i])) + return output + +# first one = cache_len +LRU_CACHE_LEN = int(input()) +KEYS = input() +VALUES = input() + +# REQUIREMENTS: Keys must be stored as integers. +list_keys = ConvertToInt(KEYS.split(',')) +len_list_keys = len(list_keys) + +# REQUIREMENTS: Values must be stored as strings. +list_values = list(VALUES.split(',')) +len_list_values = len(list_values) + +# setup cache +# REQUIREMENTS: If the numbers of keys and values are different, prints "Warning: number of keys and values are not the same" and outputs an empty cache. +if (len_list_keys != len_list_values): + print(KEY_VALUE_DIFFERENT_ERROR) + +# REQUIREMENTS: If the cache capacity is larger than or equal to the number of data items +elif (LRU_CACHE_LEN == CACHE_LEN_UNLIMITED): + for i in range(0, len(list_keys)): + key = list_keys[i] + value = list_values[i] + cache.append([key, value, MAX_OPER]) + MAX_OPER+=1 + +# REQUIREMENTS: If the cache capacity is larger than or equal to the number of data items +elif (LRU_CACHE_LEN >= len_list_keys): + for i in range(0, len(list_keys)): + key = list_keys[i] + value = list_values[i] + if (len(cache) >= LRU_CACHE_LEN): + cache.pop(0) + cache.append([key,value, MAX_OPER]) + MAX_OPER+=1 + +# REQUIREMENTS: +# If the cache capacity is smaller than the number of data items, +# keeps only those that are near the end of the inputs (right) up to the capacity +elif (LRU_CACHE_LEN < len_list_keys): + for i in range(0, len(list_keys)): + key = list_keys[i] + value = list_values[i] + if (len(cache) >= LRU_CACHE_LEN): + cache.pop(0) + cache.append([key,value, MAX_OPER]) + MAX_OPER+=1 + +else: + pass + +loop_exit = False +while not(loop_exit): + command = input() + command_splitted = command.split(',') + command_with_para = len(command_splitted) > 1 + + if (command_splitted[0] == 'get'): + cache_pos = command_splitted[1] + GETCommand(cache, cache_pos) + + elif (command_splitted[0] == 'put'): + [put_key, put_value] = command_splitted[1:3] + cache = PUTCommand(put_key, put_value) + + elif command == 'end': + EndCommand() + loop_exit = True + else: + pass diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/lv3_lambda.py b/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/lv3_lambda.py new file mode 100644 index 00000000..718e48f0 --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/lv3_lambda.py @@ -0,0 +1,174 @@ +import os,sys +from pprint import pprint + +# Assumptions: +# • 1 ≤ C ≤ 10000 or C = −1 +# • 1 ≤ Nk, Nv ≤ 10000 +# • Input keys can be converted to integers +# • Input keys are unique, no duplicates +# • Input values are non-null string +# • None of the values will be equal to “NULL” +# • Time constraint will be imposed on VPL and timeout is possible + +CACHE_LEN_UNLIMITED=-1 +KEY_VALUE_DIFFERENT_ERROR='Warning: number of keys and values are not the same' +NULL = None +MAX_OPER=1 + +cache = [] +IDX_KEY=0 +IDX_VALUE=1 +IDX_OPER=2 + +def GETCommand(cache, key): + global MAX_OPER + # pos in cache = textual pos - 1 + # can key found ? + # FROM ASSUMPTIONS: Input keys are unique, no duplicates + + key_found = False + + for i in range(0,len(cache)): + if (cache[i][0] == int(key)): + MAX_OPER+=1 + cache[i][IDX_OPER] = MAX_OPER + print(cache[i][IDX_VALUE]) + key_found=True + break + + if not(key_found): + print("NULL") + + pass + +def PUTCommand(key, value): + global MAX_OPER + # FROM ASSUMPTION: Input keys can be converted to integers + + if LRU_CACHE_LEN == CACHE_LEN_UNLIMITED: + # try find key in cache, if found replace it + # if not append into cache + found = False + for i in range(0,len(cache)): + if (cache[i][IDX_KEY] == int(key)): + cache[i][IDX_VALUE] = value + cache[i][IDX_OPER] = MAX_OPER + MAX_OPER+=1 + found = True + break + + if not(found): + cache.append([int(key), value, MAX_OPER]) + + else: + # check if cache length already reach the max one + if (len(cache) < LRU_CACHE_LEN): + # try find key in cache, if found replace it + # if not append at the end of list + found = False + for i in range(0,len(cache)): + if (cache[i][IDX_KEY] == int(key)): + cache[i][IDX_VALUE] = value + cache[i][IDX_OPER] = MAX_OPER + MAX_OPER+=1 + found = True + break + + if not(found): + cache.append([int(key), value, MAX_OPER]) + + else: + # try find key in cache, if found replace it + # if not replace the lowest oper one + found = False + min_oper = min(map(lambda x: x[IDX_OPER], cache)) + + for i in range(0,len(cache)): + if (cache[i][IDX_KEY] == int(key)): + cache[i][IDX_VALUE] = value + cache[i][IDX_OPER] = MAX_OPER + MAX_OPER+=1 + found = True + break + + if not(found): + for i in range(0,len(cache)): + if (cache[i][IDX_OPER] == min_oper): + MAX_OPER+=1 + cache[i] = [int(key), value, MAX_OPER] + + + MAX_OPER+=1 + return cache + +def EndCommand(): + # reformat for print + cache_temp = list(map(lambda x: [x[IDX_KEY],x[IDX_VALUE]], cache)) + print(cache_temp) + sys.exit() + +# first one = cache_len +LRU_CACHE_LEN = int(input()) +KEYS = input() +VALUES = input() + +# REQUIREMENTS: Keys must be stored as integers. +list_keys = list(map(lambda x: int(x), KEYS.split(','))) +len_list_keys = len(list_keys) + +# REQUIREMENTS: Values must be stored as strings. +list_values = list(VALUES.split(',')) +len_list_values = len(list_values) + +# setup cache +# REQUIREMENTS: If the numbers of keys and values are different, prints "Warning: number of keys and values are not the same" and outputs an empty cache. +if (len_list_keys != len_list_values): + print(KEY_VALUE_DIFFERENT_ERROR) + +# REQUIREMENTS: If the cache capacity is larger than or equal to the number of data items +elif (LRU_CACHE_LEN == CACHE_LEN_UNLIMITED): + for key, value in zip(list_keys, list_values): + cache.append([key, value, MAX_OPER]) + MAX_OPER+=1 + # cache = list(map(lambda x: [x[0],x[1]], zip(list_keys, list_values))) + +# REQUIREMENTS: If the cache capacity is larger than or equal to the number of data items +elif (LRU_CACHE_LEN >= len_list_keys): + for key, value in zip(list_keys, list_values): + if (len(cache) >= LRU_CACHE_LEN): + cache.pop(0) + cache.append([key,value, MAX_OPER]) + MAX_OPER+=1 + # cache = list(map(lambda x: [x[0],x[1]], zip(list_keys, list_values))) + +# REQUIREMENTS: +# If the cache capacity is smaller than the number of data items, +# keeps only those that are near the end of the inputs (right) up to the capacity +elif (LRU_CACHE_LEN < len_list_keys): + for key, value in zip(list_keys, list_values): + if (len(cache) >= LRU_CACHE_LEN): + cache.pop(0) + cache.append([key,value, MAX_OPER]) + MAX_OPER+=1 + +else: + pass + +while True: + command = input() + command_splitted = command.split(',') + command_with_para = len(command_splitted) > 1 + + if (command_splitted[0] == 'get'): + cache_pos = command_splitted[1] + GETCommand(cache, cache_pos) + + elif (command_splitted[0] == 'put'): + [put_key, put_value] = command_splitted[1:3] + cache = PUTCommand(put_key, put_value) + + elif command == 'end': + EndCommand() + + else: + pass diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/lv3_readme.md b/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/lv3_readme.md new file mode 100644 index 00000000..9e8b5777 --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/lv3_readme.md @@ -0,0 +1,129 @@ +# ENGG1330-Computer-Programming-I + +## Level 3 + +After passing all the tests in Level 2, the interviewers proceed to ask a follow-up question to truly test your ability in programming and problem solving. They tell you that it is computationally expensive to move the most recently used item to the end of the list in order to conform to the description in the Introduction, i.e., the 1st (leftmost) item is the least recently used while the last (rightmost) item is the most recently used. It is because all the subsequent items need to be moved to the left by 1. For example, the steps of moving 2 in [1,2,3,4] to the end of the list is [1,2,3,4] à [1,3,3,4] à [1,3,4,4] à [1,3,4,2]. As a result, moving item to the end of a list should be avoided if possible. The follow-up question is whether you can implement a solution without the need of moving items in the cache once they are inserted. Specifically, when accessing an item, NO movement should be made to any item but you are allowed to modify the item. When adding a new item to the list, it should be added to the end of the list if the cache is not full. Otherwise, the least recently used item is REPLACED by the new item and NO movement of other items are allowed. For example, given a cache of capacity 4: `[[1,’100’], [2,’200’], [3,’300’]]`, the cache +contents will be updated as follows. + +1. get(2) -> `[[1,’100’], [2,’200’], [3,’300’]]` +1. put(4,’400’) -> `[[1,’100’], [2,’200’], [3,’300’], [4,’400’]]` +1. get(1) -> `[[1,’100’], [2,’200’], [3,’300’], [4,’400’]]` +1. put(5,’500’) -> `[[1,’100’], [2,’200’], [5,’500’], [4,’400’]]` + +As a result, there is NO limitation on how you are going to store the data. However, ONLY one list can be created and used for the cache and no other auxiliary list is allowed. + +### Note: +The test cases on VPL will be time limited. If you see timeout on VPL, it means your program is too slow and need further optimization. Nested loops are usually the most expensive operations and it is a good starting point for optimization. + +### Inputs: +1. Capacity of the cache � (integer). � = -1 means that the cache has unlimited capacity. +2. A string of integral keys K1, K2, …, KNk separated by “,” where �! is number of keys. +3. A string of values V1, V2, …, VNv separated by “,” where �" is number of values. +4. A series of commands consisting of either “get,KEY” or “put,KEY,VALUE” separated by +a newline character. +5. The input must be ended with “end”. + +### Outputs: +1. Warning message if �! ¹ �". +2. For every get operation, print the value of the key-value pair if the key exists, +otherwise print “NULL”. +3. Cache as a list with format ![�1, �1],[�2, �2], … [��, ��], where the ordering is no +longer based on recent usage but follows the specs listed in the question. + +### Assumptions: +- 1 ≤ � ≤ 10000 �� � = −1 +- 1 ≤ �!, �" ≤ 10000 +- Input keys can be converted to integers +- Input keys are unique, no duplicates +- Input values are non-null string +- None of the values will be equal to “NULL” +- Time constraint will be imposed on VPL and timeout is possible + +### Hints: +- You may want to change the structure of how you keep the data. For example, you can store extra information alongside with each data item if you find it useful. +- It is acceptable if put and/or other operations take more time to run as long as the total time is within the time constraint. Your program should be well within the time constraint unless it has multiple layers of loop + + + +### Examples: +- Case + - Sample input + - Sample output + + +- Case 1 + - Sample input + ``` + -1 + 1,2,3,4,5,6,7,8,9,10 + 101,102,103,104,105,106,107,108,109,110 + get,3 + get,6 + get,1 + get,100 + get,5 + end + ``` + - Sample output + ``` + 103 + 106 + 101 + NULL + 105 + [[1, '101'], [2, '102'], [3, '103'], [4, '104'], [5, '105'], [6, '106'], [7, '107'], [8, '108'], [9, '109'], [10, '110']] + ``` +- Case 2 + - Sample input + ``` + 3 + 1,2,3,4,5,6,7,8,9,10 + 101,102,103,104,105,106,107,108,109,110 + get,1 + get,2 + get,3 + get,10 + get,9 + end + ``` + - Sample output + ``` + NULL + NULL + NULL + 110 + 109 + [[8, '108'], [9, '109'], [10, '110']] + ``` + +- Case 3 + - Sample input + ``` + 6 + 9,10 + 101,102,103,104,105,106,107,108,109,110 + get,9 + put,1,100 + put,2,200 + put,3,300 + get,10 + get,2 + put,4,400 + put,5,500 + put,6,600 + put,1,10000 + put,7,700 + get,3 + get,2 + end + ``` + - Sample output + ``` + Warning: number of keys and values are not the same + NULL + NULL + 200 + NULL + 200 + [[1, '10000'], [2, '200'], [7, '700'], [4, '400'], [5, '500'], [6, '600']] + ``` diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/run.bat b/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/run.bat new file mode 100644 index 00000000..67bbadda --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/run.bat @@ -0,0 +1,17 @@ +python lv3.py < input1.txt +python lv3_lambda.py < input1.txt + +python lv3.py < input2.txt +python lv3_lambda.py < input2.txt + +python lv3.py < input3.txt +python lv3_lambda.py < input3.txt + +python lv3.py < input4.txt +python lv3_lambda.py < input4.txt + +python lv3.py < input5.txt +python lv3_lambda.py < input5.txt + +python lv3.py < input6.txt +python lv3_lambda.py < input6.txt diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/test.bat b/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/test.bat new file mode 100644 index 00000000..283f1ebb --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/lv3/test.bat @@ -0,0 +1 @@ +nodemon --ext "py, bat" --exec run.bat \ No newline at end of file diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/package.json b/siutinchu/ENGG1330-Computer-Programming-I/src/package.json new file mode 100644 index 00000000..2240bc23 --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/package.json @@ -0,0 +1,12 @@ +{ + "name": "src", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC" +} diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/upload/lv1.py b/siutinchu/ENGG1330-Computer-Programming-I/src/upload/lv1.py new file mode 100644 index 00000000..4a145faf --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/upload/lv1.py @@ -0,0 +1,72 @@ +cache = [] +IDX_KEY=0 +IDX_VALUE=1 + +CACHE_LEN_UNLIMITED=-1 +KEY_VALUE_DIFFERENT_ERROR='Warning: number of keys and values are not the same' + +### Assumptions:s +# - 1 ≤ C ≤ 1000 or C = −1 +# - 1 ≤ Nk,Nv ≤ 1000 +# - Input keys can be converted to integers +# - Input keys are unique, no duplicates +# - Input values are non-null string + +def negative(num): + return 0 - num + +# 1st input, Input keys can be converted to integers +LRU_CACHE_LEN = int(input()) +# 2nd input, keys +KEYS = input() +# 3rd input, values +VALUES = input() + +def convert_to_int(input_list): + output = [] + for i in range(0,len(input_list)): + output.append(int(input_list[i])) + return output + +def create_cache_element(list_keys, list_values): + output = [] + for i in range(0,len(list_keys)): + output.append([list_keys[i], list_values[i]]) + return output + +# REQUIREMENTS: Keys must be stored as integers. +# ASSUMPTIONS: Input keys are unique, no duplicates +# ASSUMPTIONS: Input keys can be converted to integers +list_keys = convert_to_int(KEYS.split(',')) +len_list_keys = len(list_keys) + +# REQUIREMENTS: Values must be stored as strings. +# ASSUMPTIONS: Input values are non-null string +list_values = list(VALUES.split(',')) +len_list_values = len(list_values) + +# HANDLE: If the numbers of keys and values are different, +# prints "Warning: number of keys and values are not the same" and outputs an empty cache. +if (len_list_keys != len_list_values): + print(KEY_VALUE_DIFFERENT_ERROR) + +# HANDLE: If the cache capacity is infinity +elif (LRU_CACHE_LEN == CACHE_LEN_UNLIMITED): + cache = create_cache_element(list_keys, list_values) + +# HANDLE: If the cache capacity is larger than or equal to the number of data items +elif (LRU_CACHE_LEN >= len_list_keys): + cache = create_cache_element(list_keys, list_values) + +# HANDLE: +# If the cache capacity is smaller than the number of data items, +# keeps only those that are near the end of the inputs (right) up to the capacity +elif (LRU_CACHE_LEN < len_list_keys): + temp = create_cache_element(list_keys, list_values) + slice_start = negative(LRU_CACHE_LEN) + cache = temp[slice_start:] + +else: + pass + +print(cache) diff --git a/siutinchu/ENGG1330-Computer-Programming-I/src/upload/lv2.py b/siutinchu/ENGG1330-Computer-Programming-I/src/upload/lv2.py new file mode 100644 index 00000000..6f22252c --- /dev/null +++ b/siutinchu/ENGG1330-Computer-Programming-I/src/upload/lv2.py @@ -0,0 +1,128 @@ +# Assumptions: +# - 1 ≤ C ≤ 1000 or C = −1 +# - 1 ≤ Nk, Nv ≤ 1000 +# - Input keys can be converted to integers +# - Input keys are unique, no duplicates +# - Input values are non-null string +# - None of the values will be equal to “NULL” + +CACHE_LEN_UNLIMITED=-1 +KEY_VALUE_DIFFERENT_ERROR='Warning: number of keys and values are not the same' +NULL = None +cache = [] +IDX_KEY=0 +IDX_VALUE=1 + +def GETCommand(cache, key): + # ASSUMPTIONS: Input keys are unique, no duplicates + # For every get operation, + # print the value of the key-value pair if the key exists, + # otherwise print “NULL” + + key_found = False + for i in range(0,len(cache)): + if (cache[i][IDX_KEY] == int(key)): + print(cache[i][IDX_VALUE]) + cache.append(cache.pop(i)) + key_found=True + break + + if not(key_found): + print("NULL") + + pass + +def PUTCommand(key, value): + # ASSUMPTION: Input keys can be converted to integers + if LRU_CACHE_LEN != CACHE_LEN_UNLIMITED: + if (len(cache) >= LRU_CACHE_LEN): + cache.pop(0) + cache.append([int(key), value]) + + return cache + +def EndCommand(): + print(cache) + +def ConvertToInt(input_list): + output = [] + for i in range(0,len(input_list)): + output.append(int(input_list[i])) + return output + + +# 1st input, Input keys can be converted to integers +LRU_CACHE_LEN = int(input()) +# 2nd input, keys +KEYS = input() +# 3rd input, values +VALUES = input() + +# REQUIREMENTS: Keys must be stored as integers. +# ASSUMPTIONS: Input keys are unique, no duplicates +# ASSUMPTIONS: Input keys can be converted to integers +list_keys = ConvertToInt(KEYS.split(',')) +len_list_keys = len(list_keys) + +# REQUIREMENTS: Values must be stored as strings. +# ASSUMPTIONS: Input values are non-null string +list_values = list(VALUES.split(',')) +len_list_values = len(list_values) + +# setup cache +# REQUIREMENTS: If the numbers of keys and values are different, prints "Warning: number of keys and values are not the same" and outputs an empty cache. +if (len_list_keys != len_list_values): + print(KEY_VALUE_DIFFERENT_ERROR) + +# REQUIREMENTS: If the cache capacity is larger than or equal to the number of data items +elif (LRU_CACHE_LEN == CACHE_LEN_UNLIMITED): + for i in range(0, len(list_keys)): + key = list_keys[i] + value = list_values[i] + + cache.append([key, value]) + +# REQUIREMENTS: If the cache capacity is larger than or equal to the number of data items +elif (LRU_CACHE_LEN >= len_list_keys): + for i in range(0, len(list_keys)): + key = list_keys[i] + value = list_values[i] + + if (len(cache) >= LRU_CACHE_LEN): + cache.pop(0) + cache.append([key,value]) + +# REQUIREMENTS: +# If the cache capacity is smaller than the number of data items, +# keeps only those that are near the end of the inputs (right) up to the capacity +elif (LRU_CACHE_LEN < len_list_keys): + for i in range(0, len(list_keys)): + key = list_keys[i] + value = list_values[i] + + if (len(cache) >= LRU_CACHE_LEN): + cache.pop(0) + cache.append([key,value]) + +else: + pass + +loop_exit = False +while not(loop_exit): + command = input() + command_splitted = command.split(',') + command_with_para = len(command_splitted) > 1 + + if (command_splitted[0] == 'get'): + cache_pos = command_splitted[1] + GETCommand(cache, cache_pos) + + elif (command_splitted[0] == 'put'): + [put_key, put_value] = command_splitted[1:3] + cache = PUTCommand(put_key, put_value) + + elif command == 'end': + EndCommand() + loop_exit = True + else: + pass \ No newline at end of file diff --git a/siutinchu/docker-share/Dockerfile b/siutinchu/docker-share/Dockerfile new file mode 100644 index 00000000..2aa0bbfc --- /dev/null +++ b/siutinchu/docker-share/Dockerfile @@ -0,0 +1,9 @@ +# CREDIT: https://github.com/shren207/nextjs-docker-compose +# Dockerfile +FROM node:18-buster + +RUN mkdir -p /app/node_modules +RUN chown 1000:1000 -R /app +WORKDIR /app + +USER 1000:1000 diff --git a/siutinchu/docker-share/app/entry.sh b/siutinchu/docker-share/app/entry.sh new file mode 100644 index 00000000..0d9919e5 --- /dev/null +++ b/siutinchu/docker-share/app/entry.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -ex + +npm i +npm run start diff --git a/siutinchu/docker-share/app/package-lock.json b/siutinchu/docker-share/app/package-lock.json new file mode 100644 index 00000000..edc2b06b --- /dev/null +++ b/siutinchu/docker-share/app/package-lock.json @@ -0,0 +1,2117 @@ +{ + "name": "app", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "app", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "http-server": "^14.1.1", + "serve": "^14.2.0" + } + }, + "node_modules/@zeit/schemas": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.29.0.tgz", + "integrity": "sha512-g5QiLIfbg3pLuYUJPlisNKY+epQJTcMDsOnVNkscrDP1oi7vmJnzOANYJI/1pZcVJ6umUkBv3aFtlg1UvUHGzA==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/boxen": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", + "integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.0", + "chalk": "^5.0.1", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk-template": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", + "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", + "dependencies": { + "chalk": "^4.1.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" + } + }, + "node_modules/chalk-template/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/chalk-template/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clipboardy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz", + "integrity": "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==", + "dependencies": { + "arch": "^2.2.0", + "execa": "^5.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/corser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", + "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", + "dependencies": { + "punycode": "^1.3.2" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-server": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", + "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", + "dependencies": { + "basic-auth": "^2.0.1", + "chalk": "^4.1.2", + "corser": "^2.0.1", + "he": "^1.2.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy": "^1.18.1", + "mime": "^1.6.0", + "minimist": "^1.2.6", + "opener": "^1.5.1", + "portfinder": "^1.0.28", + "secure-compare": "3.0.1", + "union": "~0.5.0", + "url-join": "^4.0.1" + }, + "bin": { + "http-server": "bin/http-server" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/http-server/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/http-server/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-port-reachable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-4.0.0.tgz", + "integrity": "sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-to-regexp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", + "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + }, + "node_modules/portfinder": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "dependencies": { + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/portfinder/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "dependencies": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", + "dependencies": { + "rc": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/secure-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", + "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==" + }, + "node_modules/serve": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/serve/-/serve-14.2.0.tgz", + "integrity": "sha512-+HOw/XK1bW8tw5iBilBz/mJLWRzM8XM6MPxL4J/dKzdxq1vfdEWSwhaR7/yS8EJp5wzvP92p1qirysJvnEtjXg==", + "dependencies": { + "@zeit/schemas": "2.29.0", + "ajv": "8.11.0", + "arg": "5.0.2", + "boxen": "7.0.0", + "chalk": "5.0.1", + "chalk-template": "0.4.0", + "clipboardy": "3.0.0", + "compression": "1.7.4", + "is-port-reachable": "4.0.0", + "serve-handler": "6.1.5", + "update-check": "1.5.4" + }, + "bin": { + "serve": "build/main.js" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/serve-handler": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", + "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "fast-url-parser": "1.1.3", + "mime-types": "2.1.18", + "minimatch": "3.1.2", + "path-is-inside": "1.0.2", + "path-to-regexp": "2.2.1", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/union": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", + "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", + "dependencies": { + "qs": "^6.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/update-check": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.4.tgz", + "integrity": "sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==", + "dependencies": { + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + } + }, + "dependencies": { + "@zeit/schemas": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.29.0.tgz", + "integrity": "sha512-g5QiLIfbg3pLuYUJPlisNKY+epQJTcMDsOnVNkscrDP1oi7vmJnzOANYJI/1pZcVJ6umUkBv3aFtlg1UvUHGzA==" + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "requires": { + "string-width": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" + }, + "arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==" + }, + "arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "requires": { + "lodash": "^4.17.14" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "boxen": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", + "integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==", + "requires": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.0", + "chalk": "^5.0.1", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==" + }, + "chalk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==" + }, + "chalk-template": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", + "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", + "requires": { + "chalk": "^4.1.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==" + }, + "clipboardy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz", + "integrity": "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==", + "requires": { + "arch": "^2.2.0", + "execa": "^5.1.1", + "is-wsl": "^2.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==" + }, + "corser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", + "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==" + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", + "requires": { + "punycode": "^1.3.2" + } + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "requires": { + "whatwg-encoding": "^2.0.0" + } + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-server": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", + "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", + "requires": { + "basic-auth": "^2.0.1", + "chalk": "^4.1.2", + "corser": "^2.0.1", + "he": "^1.2.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy": "^1.18.1", + "mime": "^1.6.0", + "minimist": "^1.2.6", + "opener": "^1.5.1", + "portfinder": "^1.0.28", + "secure-compare": "3.0.1", + "union": "~0.5.0", + "url-join": "^4.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-port-reachable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-4.0.0.tgz", + "integrity": "sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==" + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "requires": { + "is-docker": "^2.0.0" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "requires": { + "minimist": "^1.2.6" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-to-regexp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", + "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + }, + "portfinder": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "requires": { + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==" + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", + "requires": { + "rc": "^1.0.1" + } + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "secure-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", + "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==" + }, + "serve": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/serve/-/serve-14.2.0.tgz", + "integrity": "sha512-+HOw/XK1bW8tw5iBilBz/mJLWRzM8XM6MPxL4J/dKzdxq1vfdEWSwhaR7/yS8EJp5wzvP92p1qirysJvnEtjXg==", + "requires": { + "@zeit/schemas": "2.29.0", + "ajv": "8.11.0", + "arg": "5.0.2", + "boxen": "7.0.0", + "chalk": "5.0.1", + "chalk-template": "0.4.0", + "clipboardy": "3.0.0", + "compression": "1.7.4", + "is-port-reachable": "4.0.0", + "serve-handler": "6.1.5", + "update-check": "1.5.4" + } + }, + "serve-handler": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", + "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", + "requires": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "fast-url-parser": "1.1.3", + "mime-types": "2.1.18", + "minimatch": "3.1.2", + "path-is-inside": "1.0.2", + "path-to-regexp": "2.2.1", + "range-parser": "1.2.0" + }, + "dependencies": { + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "requires": { + "mime-db": "~1.33.0" + } + } + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==" + }, + "union": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", + "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", + "requires": { + "qs": "^6.4.0" + } + }, + "update-check": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.4.tgz", + "integrity": "sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==", + "requires": { + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" + } + } + }, + "url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "requires": { + "iconv-lite": "0.6.3" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "requires": { + "string-width": "^5.0.1" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + } + } +} diff --git a/siutinchu/docker-share/app/package.json b/siutinchu/docker-share/app/package.json new file mode 100644 index 00000000..26bf1025 --- /dev/null +++ b/siutinchu/docker-share/app/package.json @@ -0,0 +1,17 @@ +{ + "name": "app", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "http-server --cors ./public" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "http-server": "^14.1.1", + "serve": "^14.2.0" + } +} diff --git a/siutinchu/docker-share/app/public/index.html b/siutinchu/docker-share/app/public/index.html new file mode 100644 index 00000000..8931ea77 --- /dev/null +++ b/siutinchu/docker-share/app/public/index.html @@ -0,0 +1 @@ +helloworld siutinchu diff --git a/siutinchu/docker-share/docker-compose.yml b/siutinchu/docker-share/docker-compose.yml new file mode 100644 index 00000000..eef21c14 --- /dev/null +++ b/siutinchu/docker-share/docker-compose.yml @@ -0,0 +1,32 @@ +# CREDIT: https://github.com/shren207/nextjs-docker-compose +# CREATED: 03-15-2023 +services: + siutinchu_share: + container_name: siutinchu_share + build: . + restart: always + volumes: + - $PWD/app:/app + - siutinchu_node_modules:/app/node_modules + working_dir: /app + # command: sleep infinity + command: bash entry.sh + + labels: + - "traefik.enable=true" + - "traefik.http.routers.siutinchu-http.rule=Host(`siutinchu.louislabs.com`)" + - "traefik.http.routers.siutinchu-http.entrypoints=web" + - "traefik.http.routers.siutinchu-http.middlewares=siutinchu-https" + - "traefik.http.middlewares.siutinchu-https.redirectscheme.scheme=https" + - "traefik.http.routers.siutinchu.rule=Host(`siutinchu.louislabs.com`)" + - "traefik.http.routers.siutinchu.entrypoints=websecure" + - "traefik.http.routers.siutinchu.tls.certresolver=myresolver" + - "traefik.http.services.siutinchu.loadbalancer.server.port=8080" + +networks: + default: + external: + name: traefik-proxy-network + +volumes: + siutinchu_node_modules: diff --git a/siutinchu/docker-share/package.json b/siutinchu/docker-share/package.json new file mode 100644 index 00000000..ca7c18bb --- /dev/null +++ b/siutinchu/docker-share/package.json @@ -0,0 +1,13 @@ +{ + "name": "docker-helloworld", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "into_docker": "docker compose exec -it test bash" + }, + "keywords": [], + "author": "", + "license": "ISC" +} diff --git a/siutinchu/docker-share/up.sh b/siutinchu/docker-share/up.sh new file mode 100644 index 00000000..a688d77c --- /dev/null +++ b/siutinchu/docker-share/up.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +git pull + +docker compose pull +docker compose build +docker compose kill +docker compose down +docker compose up -d diff --git a/siutinchu/gitUpdate.bat b/siutinchu/gitUpdate.bat new file mode 100644 index 00000000..eeafae6d --- /dev/null +++ b/siutinchu/gitUpdate.bat @@ -0,0 +1,7 @@ +git status . + +@pause + +git add . +git commit -m"update siutinchu," +start git push \ No newline at end of file diff --git a/siutinchu/meta.md b/siutinchu/meta.md new file mode 100644 index 00000000..9a39cc7f --- /dev/null +++ b/siutinchu/meta.md @@ -0,0 +1,5 @@ +--- +tags: "python","ENGG1330" +--- + +# README.md diff --git a/siutinchu/package.json b/siutinchu/package.json new file mode 100644 index 00000000..25097028 --- /dev/null +++ b/siutinchu/package.json @@ -0,0 +1,22 @@ +{ + "name": "daniel_jo_assignment_student", + "version": "1.0.0", + "description": "", + "main": "index.js", + "directories": { + "doc": "docs" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "gitUpdate": "git add . && git commit -m\"update siutinchu,\" && git push" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@fortawesome/free-solid-svg-icons": "^6.2.1", + "@fortawesome/react-fontawesome": "^0.2.0", + "bootstrap": "^5.2.3", + "react-bootstrap": "^2.6.0" + } +}