/ components / permissions / WebFetchPermissionRequest / WebFetchPermissionRequest.tsx
WebFetchPermissionRequest.tsx
  1  import { c as _c } from "react/compiler-runtime";
  2  import React, { useMemo } from 'react';
  3  import { Box, Text, useTheme } from '../../../ink.js';
  4  import { WebFetchTool } from '../../../tools/WebFetchTool/WebFetchTool.js';
  5  import { shouldShowAlwaysAllowOptions } from '../../../utils/permissions/permissionsLoader.js';
  6  import { type OptionWithDescription, Select } from '../../CustomSelect/select.js';
  7  import { type UnaryEvent, usePermissionRequestLogging } from '../hooks.js';
  8  import { PermissionDialog } from '../PermissionDialog.js';
  9  import type { PermissionRequestProps } from '../PermissionRequest.js';
 10  import { PermissionRuleExplanation } from '../PermissionRuleExplanation.js';
 11  import { logUnaryPermissionEvent } from '../utils.js';
 12  function inputToPermissionRuleContent(input: {
 13    [k: string]: unknown;
 14  }): string {
 15    try {
 16      const parsedInput = WebFetchTool.inputSchema.safeParse(input);
 17      if (!parsedInput.success) {
 18        return `input:${input.toString()}`;
 19      }
 20      const {
 21        url
 22      } = parsedInput.data;
 23      const hostname = new URL(url).hostname;
 24      return `domain:${hostname}`;
 25    } catch {
 26      return `input:${input.toString()}`;
 27    }
 28  }
 29  export function WebFetchPermissionRequest(t0) {
 30    const $ = _c(41);
 31    const {
 32      toolUseConfirm,
 33      onDone,
 34      onReject,
 35      verbose,
 36      workerBadge
 37    } = t0;
 38    const [theme] = useTheme();
 39    const {
 40      url
 41    } = toolUseConfirm.input as {
 42      url: string;
 43    };
 44    let t1;
 45    if ($[0] !== url) {
 46      t1 = new URL(url);
 47      $[0] = url;
 48      $[1] = t1;
 49    } else {
 50      t1 = $[1];
 51    }
 52    const hostname = t1.hostname;
 53    let t2;
 54    if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
 55      t2 = {
 56        completion_type: "tool_use_single",
 57        language_name: "none"
 58      };
 59      $[2] = t2;
 60    } else {
 61      t2 = $[2];
 62    }
 63    const unaryEvent = t2;
 64    usePermissionRequestLogging(toolUseConfirm, unaryEvent);
 65    let t3;
 66    if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
 67      t3 = shouldShowAlwaysAllowOptions();
 68      $[3] = t3;
 69    } else {
 70      t3 = $[3];
 71    }
 72    const showAlwaysAllowOptions = t3;
 73    let t4;
 74    if ($[4] === Symbol.for("react.memo_cache_sentinel")) {
 75      t4 = {
 76        label: "Yes",
 77        value: "yes"
 78      };
 79      $[4] = t4;
 80    } else {
 81      t4 = $[4];
 82    }
 83    let result;
 84    if ($[5] !== hostname) {
 85      result = [t4];
 86      if (showAlwaysAllowOptions) {
 87        const t5 = <Text bold={true}>{hostname}</Text>;
 88        let t6;
 89        if ($[7] !== t5) {
 90          t6 = {
 91            label: <Text>Yes, and don't ask again for {t5}</Text>,
 92            value: "yes-dont-ask-again-domain"
 93          };
 94          $[7] = t5;
 95          $[8] = t6;
 96        } else {
 97          t6 = $[8];
 98        }
 99        result.push(t6);
100      }
101      let t5;
102      if ($[9] === Symbol.for("react.memo_cache_sentinel")) {
103        t5 = {
104          label: <Text>No, and tell Claude what to do differently <Text bold={true}>(esc)</Text></Text>,
105          value: "no"
106        };
107        $[9] = t5;
108      } else {
109        t5 = $[9];
110      }
111      result.push(t5);
112      $[5] = hostname;
113      $[6] = result;
114    } else {
115      result = $[6];
116    }
117    const options = result;
118    let t5;
119    if ($[10] !== onDone || $[11] !== onReject || $[12] !== toolUseConfirm) {
120      t5 = function onChange(newValue) {
121        bb8: switch (newValue) {
122          case "yes":
123            {
124              logUnaryPermissionEvent("tool_use_single", toolUseConfirm, "accept");
125              toolUseConfirm.onAllow(toolUseConfirm.input, []);
126              onDone();
127              break bb8;
128            }
129          case "yes-dont-ask-again-domain":
130            {
131              logUnaryPermissionEvent("tool_use_single", toolUseConfirm, "accept");
132              const ruleContent = inputToPermissionRuleContent(toolUseConfirm.input);
133              const ruleValue = {
134                toolName: toolUseConfirm.tool.name,
135                ruleContent
136              };
137              toolUseConfirm.onAllow(toolUseConfirm.input, [{
138                type: "addRules",
139                rules: [ruleValue],
140                behavior: "allow",
141                destination: "localSettings"
142              }]);
143              onDone();
144              break bb8;
145            }
146          case "no":
147            {
148              logUnaryPermissionEvent("tool_use_single", toolUseConfirm, "reject");
149              toolUseConfirm.onReject();
150              onReject();
151              onDone();
152            }
153        }
154      };
155      $[10] = onDone;
156      $[11] = onReject;
157      $[12] = toolUseConfirm;
158      $[13] = t5;
159    } else {
160      t5 = $[13];
161    }
162    const onChange = t5;
163    let t6;
164    if ($[14] !== theme || $[15] !== toolUseConfirm.input || $[16] !== verbose) {
165      t6 = WebFetchTool.renderToolUseMessage(toolUseConfirm.input as {
166        url: string;
167        prompt: string;
168      }, {
169        theme,
170        verbose
171      });
172      $[14] = theme;
173      $[15] = toolUseConfirm.input;
174      $[16] = verbose;
175      $[17] = t6;
176    } else {
177      t6 = $[17];
178    }
179    let t7;
180    if ($[18] !== t6) {
181      t7 = <Text>{t6}</Text>;
182      $[18] = t6;
183      $[19] = t7;
184    } else {
185      t7 = $[19];
186    }
187    let t8;
188    if ($[20] !== toolUseConfirm.description) {
189      t8 = <Text dimColor={true}>{toolUseConfirm.description}</Text>;
190      $[20] = toolUseConfirm.description;
191      $[21] = t8;
192    } else {
193      t8 = $[21];
194    }
195    let t9;
196    if ($[22] !== t7 || $[23] !== t8) {
197      t9 = <Box flexDirection="column" paddingX={2} paddingY={1}>{t7}{t8}</Box>;
198      $[22] = t7;
199      $[23] = t8;
200      $[24] = t9;
201    } else {
202      t9 = $[24];
203    }
204    let t10;
205    if ($[25] !== toolUseConfirm.permissionResult) {
206      t10 = <PermissionRuleExplanation permissionResult={toolUseConfirm.permissionResult} toolType="tool" />;
207      $[25] = toolUseConfirm.permissionResult;
208      $[26] = t10;
209    } else {
210      t10 = $[26];
211    }
212    let t11;
213    if ($[27] === Symbol.for("react.memo_cache_sentinel")) {
214      t11 = <Text>Do you want to allow Claude to fetch this content?</Text>;
215      $[27] = t11;
216    } else {
217      t11 = $[27];
218    }
219    let t12;
220    if ($[28] !== onChange) {
221      t12 = () => onChange("no");
222      $[28] = onChange;
223      $[29] = t12;
224    } else {
225      t12 = $[29];
226    }
227    let t13;
228    if ($[30] !== onChange || $[31] !== options || $[32] !== t12) {
229      t13 = <Select options={options} onChange={onChange} onCancel={t12} />;
230      $[30] = onChange;
231      $[31] = options;
232      $[32] = t12;
233      $[33] = t13;
234    } else {
235      t13 = $[33];
236    }
237    let t14;
238    if ($[34] !== t10 || $[35] !== t13) {
239      t14 = <Box flexDirection="column">{t10}{t11}{t13}</Box>;
240      $[34] = t10;
241      $[35] = t13;
242      $[36] = t14;
243    } else {
244      t14 = $[36];
245    }
246    let t15;
247    if ($[37] !== t14 || $[38] !== t9 || $[39] !== workerBadge) {
248      t15 = <PermissionDialog title="Fetch" workerBadge={workerBadge}>{t9}{t14}</PermissionDialog>;
249      $[37] = t14;
250      $[38] = t9;
251      $[39] = workerBadge;
252      $[40] = t15;
253    } else {
254      t15 = $[40];
255    }
256    return t15;
257  }
258  //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZU1lbW8iLCJCb3giLCJUZXh0IiwidXNlVGhlbWUiLCJXZWJGZXRjaFRvb2wiLCJzaG91bGRTaG93QWx3YXlzQWxsb3dPcHRpb25zIiwiT3B0aW9uV2l0aERlc2NyaXB0aW9uIiwiU2VsZWN0IiwiVW5hcnlFdmVudCIsInVzZVBlcm1pc3Npb25SZXF1ZXN0TG9nZ2luZyIsIlBlcm1pc3Npb25EaWFsb2ciLCJQZXJtaXNzaW9uUmVxdWVzdFByb3BzIiwiUGVybWlzc2lvblJ1bGVFeHBsYW5hdGlvbiIsImxvZ1VuYXJ5UGVybWlzc2lvbkV2ZW50IiwiaW5wdXRUb1Blcm1pc3Npb25SdWxlQ29udGVudCIsImlucHV0IiwiayIsInBhcnNlZElucHV0IiwiaW5wdXRTY2hlbWEiLCJzYWZlUGFyc2UiLCJzdWNjZXNzIiwidG9TdHJpbmciLCJ1cmwiLCJkYXRhIiwiaG9zdG5hbWUiLCJVUkwiLCJXZWJGZXRjaFBlcm1pc3Npb25SZXF1ZXN0IiwidDAiLCIkIiwiX2MiLCJ0b29sVXNlQ29uZmlybSIsIm9uRG9uZSIsIm9uUmVqZWN0IiwidmVyYm9zZSIsIndvcmtlckJhZGdlIiwidGhlbWUiLCJ0MSIsInQyIiwiU3ltYm9sIiwiZm9yIiwiY29tcGxldGlvbl90eXBlIiwibGFuZ3VhZ2VfbmFtZSIsInVuYXJ5RXZlbnQiLCJ0MyIsInNob3dBbHdheXNBbGxvd09wdGlvbnMiLCJ0NCIsImxhYmVsIiwidmFsdWUiLCJyZXN1bHQiLCJ0NSIsInQ2IiwicHVzaCIsIm9wdGlvbnMiLCJvbkNoYW5nZSIsIm5ld1ZhbHVlIiwiYmI4Iiwib25BbGxvdyIsInJ1bGVDb250ZW50IiwicnVsZVZhbHVlIiwidG9vbE5hbWUiLCJ0b29sIiwibmFtZSIsInR5cGUiLCJydWxlcyIsImJlaGF2aW9yIiwiZGVzdGluYXRpb24iLCJyZW5kZXJUb29sVXNlTWVzc2FnZSIsInByb21wdCIsInQ3IiwidDgiLCJkZXNjcmlwdGlvbiIsInQ5IiwidDEwIiwicGVybWlzc2lvblJlc3VsdCIsInQxMSIsInQxMiIsInQxMyIsInQxNCIsInQxNSJdLCJzb3VyY2VzIjpbIldlYkZldGNoUGVybWlzc2lvblJlcXVlc3QudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBCb3gsIFRleHQsIHVzZVRoZW1lIH0gZnJvbSAnLi4vLi4vLi4vaW5rLmpzJ1xuaW1wb3J0IHsgV2ViRmV0Y2hUb29sIH0gZnJvbSAnLi4vLi4vLi4vdG9vbHMvV2ViRmV0Y2hUb29sL1dlYkZldGNoVG9vbC5qcydcbmltcG9ydCB7IHNob3VsZFNob3dBbHdheXNBbGxvd09wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi91dGlscy9wZXJtaXNzaW9ucy9wZXJtaXNzaW9uc0xvYWRlci5qcydcbmltcG9ydCB7XG4gIHR5cGUgT3B0aW9uV2l0aERlc2NyaXB0aW9uLFxuICBTZWxlY3QsXG59IGZyb20gJy4uLy4uL0N1c3RvbVNlbGVjdC9zZWxlY3QuanMnXG5pbXBvcnQgeyB0eXBlIFVuYXJ5RXZlbnQsIHVzZVBlcm1pc3Npb25SZXF1ZXN0TG9nZ2luZyB9IGZyb20gJy4uL2hvb2tzLmpzJ1xuaW1wb3J0IHsgUGVybWlzc2lvbkRpYWxvZyB9IGZyb20gJy4uL1Blcm1pc3Npb25EaWFsb2cuanMnXG5pbXBvcnQgdHlwZSB7IFBlcm1pc3Npb25SZXF1ZXN0UHJvcHMgfSBmcm9tICcuLi9QZXJtaXNzaW9uUmVxdWVzdC5qcydcbmltcG9ydCB7IFBlcm1pc3Npb25SdWxlRXhwbGFuYXRpb24gfSBmcm9tICcuLi9QZXJtaXNzaW9uUnVsZUV4cGxhbmF0aW9uLmpzJ1xuaW1wb3J0IHsgbG9nVW5hcnlQZXJtaXNzaW9uRXZlbnQgfSBmcm9tICcuLi91dGlscy5qcydcblxuZnVuY3Rpb24gaW5wdXRUb1Blcm1pc3Npb25SdWxlQ29udGVudChpbnB1dDogeyBbazogc3RyaW5nXTogdW5rbm93biB9KTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWRJbnB1dCA9IFdlYkZldGNoVG9vbC5pbnB1dFNjaGVtYS5zYWZlUGFyc2UoaW5wdXQpXG4gICAgaWYgKCFwYXJzZWRJbnB1dC5zdWNjZXNzKSB7XG4gICAgICByZXR1cm4gYGlucHV0OiR7aW5wdXQudG9TdHJpbmcoKX1gXG4gICAgfVxuICAgIGNvbnN0IHsgdXJsIH0gPSBwYXJzZWRJbnB1dC5kYXRhXG4gICAgY29uc3QgaG9zdG5hbWUgPSBuZXcgVVJMKHVybCkuaG9zdG5hbWVcbiAgICByZXR1cm4gYGRvbWFpbjoke2hvc3RuYW1lfWBcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGBpbnB1dDoke2lucHV0LnRvU3RyaW5nKCl9YFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBXZWJGZXRjaFBlcm1pc3Npb25SZXF1ZXN0KHtcbiAgdG9vbFVzZUNvbmZpcm0sXG4gIG9uRG9uZSxcbiAgb25SZWplY3QsXG4gIHZlcmJvc2UsXG4gIHdvcmtlckJhZGdlLFxufTogUGVybWlzc2lvblJlcXVlc3RQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IFt0aGVtZV0gPSB1c2VUaGVtZSgpXG4gIC8vIHVybCBpcyBhbHJlYWR5IHZhbGlkYXRlZCBieSB0aGUgaW5wdXQgc2NoZW1hXG4gIGNvbnN0IHsgdXJsIH0gPSB0b29sVXNlQ29uZmlybS5pbnB1dCBhcyB7IHVybDogc3RyaW5nIH1cblxuICAvLyBFeHRyYWN0IGhvc3RuYW1lIGZyb20gVVJMXG4gIGNvbnN0IGhvc3RuYW1lID0gbmV3IFVSTCh1cmwpLmhvc3RuYW1lXG5cbiAgY29uc3QgdW5hcnlFdmVudCA9IHVzZU1lbW88VW5hcnlFdmVudD4oXG4gICAgKCkgPT4gKHsgY29tcGxldGlvbl90eXBlOiAndG9vbF91c2Vfc2luZ2xlJywgbGFuZ3VhZ2VfbmFtZTogJ25vbmUnIH0pLFxuICAgIFtdLFxuICApXG5cbiAgdXNlUGVybWlzc2lvblJlcXVlc3RMb2dnaW5nKHRvb2xVc2VDb25maXJtLCB1bmFyeUV2ZW50KVxuXG4gIC8vIEdlbmVyYXRlIHBlcm1pc3Npb24gb3B0aW9ucyBzcGVjaWZpYyB0byBkb21haW5zXG4gIGNvbnN0IHNob3dBbHdheXNBbGxvd09wdGlvbnMgPSBzaG91bGRTaG93QWx3YXlzQWxsb3dPcHRpb25zKClcbiAgY29uc3Qgb3B0aW9ucyA9IHVzZU1lbW8oKCk6IE9wdGlvbldpdGhEZXNjcmlwdGlvbjxzdHJpbmc+W10gPT4ge1xuICAgIGNvbnN0IHJlc3VsdDogT3B0aW9uV2l0aERlc2NyaXB0aW9uPHN0cmluZz5bXSA9IFtcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdZZXMnLFxuICAgICAgICB2YWx1ZTogJ3llcycsXG4gICAgICB9LFxuICAgIF1cblxuICAgIGlmIChzaG93QWx3YXlzQWxsb3dPcHRpb25zKSB7XG4gICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgIGxhYmVsOiAoXG4gICAgICAgICAgPFRleHQ+XG4gICAgICAgICAgICBZZXMsIGFuZCBkb24mYXBvczt0IGFzayBhZ2FpbiBmb3IgPFRleHQgYm9sZD57aG9zdG5hbWV9PC9UZXh0PlxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgKSxcbiAgICAgICAgdmFsdWU6ICd5ZXMtZG9udC1hc2stYWdhaW4tZG9tYWluJyxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmVzdWx0LnB1c2goe1xuICAgICAgbGFiZWw6IChcbiAgICAgICAgPFRleHQ+XG4gICAgICAgICAgTm8sIGFuZCB0ZWxsIENsYXVkZSB3aGF0IHRvIGRvIGRpZmZlcmVudGx5IDxUZXh0IGJvbGQ+KGVzYyk8L1RleHQ+XG4gICAgICAgIDwvVGV4dD5cbiAgICAgICksXG4gICAgICB2YWx1ZTogJ25vJyxcbiAgICB9KVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9LCBbaG9zdG5hbWUsIHNob3dBbHdheXNBbGxvd09wdGlvbnNdKVxuXG4gIGZ1bmN0aW9uIG9uQ2hhbmdlKG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICBzd2l0Y2ggKG5ld1ZhbHVlKSB7XG4gICAgICBjYXNlICd5ZXMnOlxuICAgICAgICBsb2dVbmFyeVBlcm1pc3Npb25FdmVudCgndG9vbF91c2Vfc2luZ2xlJywgdG9vbFVzZUNvbmZpcm0sICdhY2NlcHQnKVxuICAgICAgICB0b29sVXNlQ29uZmlybS5vbkFsbG93KHRvb2xVc2VDb25maXJtLmlucHV0LCBbXSlcbiAgICAgICAgb25Eb25lKClcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3llcy1kb250LWFzay1hZ2Fpbi1kb21haW4nOiB7XG4gICAgICAgIGxvZ1VuYXJ5UGVybWlzc2lvbkV2ZW50KCd0b29sX3VzZV9zaW5nbGUnLCB0b29sVXNlQ29uZmlybSwgJ2FjY2VwdCcpXG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZW50ID0gaW5wdXRUb1Blcm1pc3Npb25SdWxlQ29udGVudCh0b29sVXNlQ29uZmlybS5pbnB1dClcbiAgICAgICAgY29uc3QgcnVsZVZhbHVlID0ge1xuICAgICAgICAgIHRvb2xOYW1lOiB0b29sVXNlQ29uZmlybS50b29sLm5hbWUsXG4gICAgICAgICAgcnVsZUNvbnRlbnQsXG4gICAgICAgIH1cblxuICAgICAgICAvLyBQYXNzIHBlcm1pc3Npb24gdXBkYXRlIGRpcmVjdGx5IHRvIG9uQWxsb3dcbiAgICAgICAgdG9vbFVzZUNvbmZpcm0ub25BbGxvdyh0b29sVXNlQ29uZmlybS5pbnB1dCwgW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICdhZGRSdWxlcycsXG4gICAgICAgICAgICBydWxlczogW3J1bGVWYWx1ZV0sXG4gICAgICAgICAgICBiZWhhdmlvcjogJ2FsbG93JyxcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uOiAnbG9jYWxTZXR0aW5ncycsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSlcbiAgICAgICAgb25Eb25lKClcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ25vJzpcbiAgICAgICAgbG9nVW5hcnlQZXJtaXNzaW9uRXZlbnQoJ3Rvb2xfdXNlX3NpbmdsZScsIHRvb2xVc2VDb25maXJtLCAncmVqZWN0JylcbiAgICAgICAgdG9vbFVzZUNvbmZpcm0ub25SZWplY3QoKVxuICAgICAgICBvblJlamVjdCgpXG4gICAgICAgIG9uRG9uZSgpXG4gICAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8UGVybWlzc2lvbkRpYWxvZyB0aXRsZT1cIkZldGNoXCIgd29ya2VyQmFkZ2U9e3dvcmtlckJhZGdlfT5cbiAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiIHBhZGRpbmdYPXsyfSBwYWRkaW5nWT17MX0+XG4gICAgICAgIDxUZXh0PlxuICAgICAgICAgIHtXZWJGZXRjaFRvb2wucmVuZGVyVG9vbFVzZU1lc3NhZ2UoXG4gICAgICAgICAgICB0b29sVXNlQ29uZmlybS5pbnB1dCBhcyB7IHVybDogc3RyaW5nOyBwcm9tcHQ6IHN0cmluZyB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0aGVtZSxcbiAgICAgICAgICAgICAgdmVyYm9zZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKX1cbiAgICAgICAgPC9UZXh0PlxuICAgICAgICA8VGV4dCBkaW1Db2xvcj57dG9vbFVzZUNvbmZpcm0uZGVzY3JpcHRpb259PC9UZXh0PlxuICAgICAgPC9Cb3g+XG5cbiAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgICA8UGVybWlzc2lvblJ1bGVFeHBsYW5hdGlvblxuICAgICAgICAgIHBlcm1pc3Npb25SZXN1bHQ9e3Rvb2xVc2VDb25maXJtLnBlcm1pc3Npb25SZXN1bHR9XG4gICAgICAgICAgdG9vbFR5cGU9XCJ0b29sXCJcbiAgICAgICAgLz5cbiAgICAgICAgPFRleHQ+RG8geW91IHdhbnQgdG8gYWxsb3cgQ2xhdWRlIHRvIGZldGNoIHRoaXMgY29udGVudD88L1RleHQ+XG4gICAgICAgIDxTZWxlY3RcbiAgICAgICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgICAgIG9uQ2hhbmdlPXtvbkNoYW5nZX1cbiAgICAgICAgICBvbkNhbmNlbD17KCkgPT4gb25DaGFuZ2UoJ25vJyl9XG4gICAgICAgIC8+XG4gICAgICA8L0JveD5cbiAgICA8L1Blcm1pc3Npb25EaWFsb2c+XG4gIClcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU9BLEtBQUssSUFBSUMsT0FBTyxRQUFRLE9BQU87QUFDdEMsU0FBU0MsR0FBRyxFQUFFQyxJQUFJLEVBQUVDLFFBQVEsUUFBUSxpQkFBaUI7QUFDckQsU0FBU0MsWUFBWSxRQUFRLDZDQUE2QztBQUMxRSxTQUFTQyw0QkFBNEIsUUFBUSxpREFBaUQ7QUFDOUYsU0FDRSxLQUFLQyxxQkFBcUIsRUFDMUJDLE1BQU0sUUFDRCw4QkFBOEI7QUFDckMsU0FBUyxLQUFLQyxVQUFVLEVBQUVDLDJCQUEyQixRQUFRLGFBQWE7QUFDMUUsU0FBU0MsZ0JBQWdCLFFBQVEsd0JBQXdCO0FBQ3pELGNBQWNDLHNCQUFzQixRQUFRLHlCQUF5QjtBQUNyRSxTQUFTQyx5QkFBeUIsUUFBUSxpQ0FBaUM7QUFDM0UsU0FBU0MsdUJBQXVCLFFBQVEsYUFBYTtBQUVyRCxTQUFTQyw0QkFBNEJBLENBQUNDLEtBQUssRUFBRTtFQUFFLENBQUNDLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxPQUFPO0FBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDO0VBQzdFLElBQUk7SUFDRixNQUFNQyxXQUFXLEdBQUdiLFlBQVksQ0FBQ2MsV0FBVyxDQUFDQyxTQUFTLENBQUNKLEtBQUssQ0FBQztJQUM3RCxJQUFJLENBQUNFLFdBQVcsQ0FBQ0csT0FBTyxFQUFFO01BQ3hCLE9BQU8sU0FBU0wsS0FBSyxDQUFDTSxRQUFRLENBQUMsQ0FBQyxFQUFFO0lBQ3BDO0lBQ0EsTUFBTTtNQUFFQztJQUFJLENBQUMsR0FBR0wsV0FBVyxDQUFDTSxJQUFJO0lBQ2hDLE1BQU1DLFFBQVEsR0FBRyxJQUFJQyxHQUFHLENBQUNILEdBQUcsQ0FBQyxDQUFDRSxRQUFRO0lBQ3RDLE9BQU8sVUFBVUEsUUFBUSxFQUFFO0VBQzdCLENBQUMsQ0FBQyxNQUFNO0lBQ04sT0FBTyxTQUFTVCxLQUFLLENBQUNNLFFBQVEsQ0FBQyxDQUFDLEVBQUU7RUFDcEM7QUFDRjtBQUVBLE9BQU8sU0FBQUssMEJBQUFDLEVBQUE7RUFBQSxNQUFBQyxDQUFBLEdBQUFDLEVBQUE7RUFBbUM7SUFBQUMsY0FBQTtJQUFBQyxNQUFBO0lBQUFDLFFBQUE7SUFBQUMsT0FBQTtJQUFBQztFQUFBLElBQUFQLEVBTWpCO0VBQ3ZCLE9BQUFRLEtBQUEsSUFBZ0JoQyxRQUFRLENBQUMsQ0FBQztFQUUxQjtJQUFBbUI7RUFBQSxJQUFnQlEsY0FBYyxDQUFBZixLQUFNLElBQUk7SUFBRU8sR0FBRyxFQUFFLE1BQU07RUFBQyxDQUFDO0VBQUEsSUFBQWMsRUFBQTtFQUFBLElBQUFSLENBQUEsUUFBQU4sR0FBQTtJQUd0Q2MsRUFBQSxPQUFJWCxHQUFHLENBQUNILEdBQUcsQ0FBQztJQUFBTSxDQUFBLE1BQUFOLEdBQUE7SUFBQU0sQ0FBQSxNQUFBUSxFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBUixDQUFBO0VBQUE7RUFBN0IsTUFBQUosUUFBQSxHQUFpQlksRUFBWSxDQUFBWixRQUFTO0VBQUEsSUFBQWEsRUFBQTtFQUFBLElBQUFULENBQUEsUUFBQVUsTUFBQSxDQUFBQyxHQUFBO0lBRzdCRixFQUFBO01BQUFHLGVBQUEsRUFBbUIsaUJBQWlCO01BQUFDLGFBQUEsRUFBaUI7SUFBTyxDQUFDO0lBQUFiLENBQUEsTUFBQVMsRUFBQTtFQUFBO0lBQUFBLEVBQUEsR0FBQVQsQ0FBQTtFQUFBO0VBRHRFLE1BQUFjLFVBQUEsR0FDU0wsRUFBNkQ7RUFJdEU1QiwyQkFBMkIsQ0FBQ3FCLGNBQWMsRUFBRVksVUFBVSxDQUFDO0VBQUEsSUFBQUMsRUFBQTtFQUFBLElBQUFmLENBQUEsUUFBQVUsTUFBQSxDQUFBQyxHQUFBO0lBR3hCSSxFQUFBLEdBQUF0Qyw0QkFBNEIsQ0FBQyxDQUFDO0lBQUF1QixDQUFBLE1BQUFlLEVBQUE7RUFBQTtJQUFBQSxFQUFBLEdBQUFmLENBQUE7RUFBQTtFQUE3RCxNQUFBZ0Isc0JBQUEsR0FBK0JELEVBQThCO0VBQUEsSUFBQUUsRUFBQTtFQUFBLElBQUFqQixDQUFBLFFBQUFVLE1BQUEsQ0FBQUMsR0FBQTtJQUd6RE0sRUFBQTtNQUFBQyxLQUFBLEVBQ1MsS0FBSztNQUFBQyxLQUFBLEVBQ0w7SUFDVCxDQUFDO0lBQUFuQixDQUFBLE1BQUFpQixFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBakIsQ0FBQTtFQUFBO0VBQUEsSUFBQW9CLE1BQUE7RUFBQSxJQUFBcEIsQ0FBQSxRQUFBSixRQUFBO0lBSkh3QixNQUFBLEdBQWdELENBQzlDSCxFQUdDLENBQ0Y7SUFFRCxJQUFJRCxzQkFBc0I7TUFJZ0IsTUFBQUssRUFBQSxJQUFDLElBQUksQ0FBQyxJQUFJLENBQUosS0FBRyxDQUFDLENBQUV6QixTQUFPLENBQUUsRUFBcEIsSUFBSSxDQUF1QjtNQUFBLElBQUEwQixFQUFBO01BQUEsSUFBQXRCLENBQUEsUUFBQXFCLEVBQUE7UUFIeERDLEVBQUE7VUFBQUosS0FBQSxFQUVSLENBQUMsSUFBSSxDQUFDLDZCQUM4QixDQUFBRyxFQUEyQixDQUMvRCxFQUZDLElBQUksQ0FFRTtVQUFBRixLQUFBLEVBRUY7UUFDVCxDQUFDO1FBQUFuQixDQUFBLE1BQUFxQixFQUFBO1FBQUFyQixDQUFBLE1BQUFzQixFQUFBO01BQUE7UUFBQUEsRUFBQSxHQUFBdEIsQ0FBQTtNQUFBO01BUERvQixNQUFNLENBQUFHLElBQUssQ0FBQ0QsRUFPWCxDQUFDO0lBQUE7SUFDSCxJQUFBRCxFQUFBO0lBQUEsSUFBQXJCLENBQUEsUUFBQVUsTUFBQSxDQUFBQyxHQUFBO01BRVdVLEVBQUE7UUFBQUgsS0FBQSxFQUVSLENBQUMsSUFBSSxDQUFDLDJDQUN1QyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUosS0FBRyxDQUFDLENBQUMsS0FBSyxFQUFmLElBQUksQ0FDbEQsRUFGQyxJQUFJLENBRUU7UUFBQUMsS0FBQSxFQUVGO01BQ1QsQ0FBQztNQUFBbkIsQ0FBQSxNQUFBcUIsRUFBQTtJQUFBO01BQUFBLEVBQUEsR0FBQXJCLENBQUE7SUFBQTtJQVBEb0IsTUFBTSxDQUFBRyxJQUFLLENBQUNGLEVBT1gsQ0FBQztJQUFBckIsQ0FBQSxNQUFBSixRQUFBO0lBQUFJLENBQUEsTUFBQW9CLE1BQUE7RUFBQTtJQUFBQSxNQUFBLEdBQUFwQixDQUFBO0VBQUE7RUExQkosTUFBQXdCLE9BQUEsR0E0QkVKLE1BQWE7RUFDdUIsSUFBQUMsRUFBQTtFQUFBLElBQUFyQixDQUFBLFNBQUFHLE1BQUEsSUFBQUgsQ0FBQSxTQUFBSSxRQUFBLElBQUFKLENBQUEsU0FBQUUsY0FBQTtJQUV0Q21CLEVBQUEsWUFBQUksU0FBQUMsUUFBQTtNQUFBQyxHQUFBLEVBQ0UsUUFBUUQsUUFBUTtRQUFBLEtBQ1QsS0FBSztVQUFBO1lBQ1J6Qyx1QkFBdUIsQ0FBQyxpQkFBaUIsRUFBRWlCLGNBQWMsRUFBRSxRQUFRLENBQUM7WUFDcEVBLGNBQWMsQ0FBQTBCLE9BQVEsQ0FBQzFCLGNBQWMsQ0FBQWYsS0FBTSxFQUFFLEVBQUUsQ0FBQztZQUNoRGdCLE1BQU0sQ0FBQyxDQUFDO1lBQ1IsTUFBQXdCLEdBQUE7VUFBSztRQUFBLEtBQ0YsMkJBQTJCO1VBQUE7WUFDOUIxQyx1QkFBdUIsQ0FBQyxpQkFBaUIsRUFBRWlCLGNBQWMsRUFBRSxRQUFRLENBQUM7WUFDcEUsTUFBQTJCLFdBQUEsR0FBb0IzQyw0QkFBNEIsQ0FBQ2dCLGNBQWMsQ0FBQWYsS0FBTSxDQUFDO1lBQ3RFLE1BQUEyQyxTQUFBLEdBQWtCO2NBQUFDLFFBQUEsRUFDTjdCLGNBQWMsQ0FBQThCLElBQUssQ0FBQUMsSUFBSztjQUFBSjtZQUVwQyxDQUFDO1lBR0QzQixjQUFjLENBQUEwQixPQUFRLENBQUMxQixjQUFjLENBQUFmLEtBQU0sRUFBRSxDQUMzQztjQUFBK0MsSUFBQSxFQUNRLFVBQVU7Y0FBQUMsS0FBQSxFQUNULENBQUNMLFNBQVMsQ0FBQztjQUFBTSxRQUFBLEVBQ1IsT0FBTztjQUFBQyxXQUFBLEVBQ0o7WUFDZixDQUFDLENBQ0YsQ0FBQztZQUNGbEMsTUFBTSxDQUFDLENBQUM7WUFDUixNQUFBd0IsR0FBQTtVQUFLO1FBQUEsS0FFRixJQUFJO1VBQUE7WUFDUDFDLHVCQUF1QixDQUFDLGlCQUFpQixFQUFFaUIsY0FBYyxFQUFFLFFBQVEsQ0FBQztZQUNwRUEsY0FBYyxDQUFBRSxRQUFTLENBQUMsQ0FBQztZQUN6QkEsUUFBUSxDQUFDLENBQUM7WUFDVkQsTUFBTSxDQUFDLENBQUM7VUFBQTtNQUVaO0lBQUMsQ0FDRjtJQUFBSCxDQUFBLE9BQUFHLE1BQUE7SUFBQUgsQ0FBQSxPQUFBSSxRQUFBO0lBQUFKLENBQUEsT0FBQUUsY0FBQTtJQUFBRixDQUFBLE9BQUFxQixFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBckIsQ0FBQTtFQUFBO0VBbENELE1BQUF5QixRQUFBLEdBQUFKLEVBa0NDO0VBQUEsSUFBQUMsRUFBQTtFQUFBLElBQUF0QixDQUFBLFNBQUFPLEtBQUEsSUFBQVAsQ0FBQSxTQUFBRSxjQUFBLENBQUFmLEtBQUEsSUFBQWEsQ0FBQSxTQUFBSyxPQUFBO0lBTVFpQixFQUFBLEdBQUE5QyxZQUFZLENBQUE4RCxvQkFBcUIsQ0FDaENwQyxjQUFjLENBQUFmLEtBQU0sSUFBSTtNQUFFTyxHQUFHLEVBQUUsTUFBTTtNQUFFNkMsTUFBTSxFQUFFLE1BQU07SUFBQyxDQUFDLEVBQ3ZEO01BQUFoQyxLQUFBO01BQUFGO0lBR0EsQ0FDRixDQUFDO0lBQUFMLENBQUEsT0FBQU8sS0FBQTtJQUFBUCxDQUFBLE9BQUFFLGNBQUEsQ0FBQWYsS0FBQTtJQUFBYSxDQUFBLE9BQUFLLE9BQUE7SUFBQUwsQ0FBQSxPQUFBc0IsRUFBQTtFQUFBO0lBQUFBLEVBQUEsR0FBQXRCLENBQUE7RUFBQTtFQUFBLElBQUF3QyxFQUFBO0VBQUEsSUFBQXhDLENBQUEsU0FBQXNCLEVBQUE7SUFQSGtCLEVBQUEsSUFBQyxJQUFJLENBQ0YsQ0FBQWxCLEVBTUQsQ0FDRixFQVJDLElBQUksQ0FRRTtJQUFBdEIsQ0FBQSxPQUFBc0IsRUFBQTtJQUFBdEIsQ0FBQSxPQUFBd0MsRUFBQTtFQUFBO0lBQUFBLEVBQUEsR0FBQXhDLENBQUE7RUFBQTtFQUFBLElBQUF5QyxFQUFBO0VBQUEsSUFBQXpDLENBQUEsU0FBQUUsY0FBQSxDQUFBd0MsV0FBQTtJQUNQRCxFQUFBLElBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBUixLQUFPLENBQUMsQ0FBRSxDQUFBdkMsY0FBYyxDQUFBd0MsV0FBVyxDQUFFLEVBQTFDLElBQUksQ0FBNkM7SUFBQTFDLENBQUEsT0FBQUUsY0FBQSxDQUFBd0MsV0FBQTtJQUFBMUMsQ0FBQSxPQUFBeUMsRUFBQTtFQUFBO0lBQUFBLEVBQUEsR0FBQXpDLENBQUE7RUFBQTtFQUFBLElBQUEyQyxFQUFBO0VBQUEsSUFBQTNDLENBQUEsU0FBQXdDLEVBQUEsSUFBQXhDLENBQUEsU0FBQXlDLEVBQUE7SUFWcERFLEVBQUEsSUFBQyxHQUFHLENBQWUsYUFBUSxDQUFSLFFBQVEsQ0FBVyxRQUFDLENBQUQsR0FBQyxDQUFZLFFBQUMsQ0FBRCxHQUFDLENBQ2xELENBQUFILEVBUU0sQ0FDTixDQUFBQyxFQUFpRCxDQUNuRCxFQVhDLEdBQUcsQ0FXRTtJQUFBekMsQ0FBQSxPQUFBd0MsRUFBQTtJQUFBeEMsQ0FBQSxPQUFBeUMsRUFBQTtJQUFBekMsQ0FBQSxPQUFBMkMsRUFBQTtFQUFBO0lBQUFBLEVBQUEsR0FBQTNDLENBQUE7RUFBQTtFQUFBLElBQUE0QyxHQUFBO0VBQUEsSUFBQTVDLENBQUEsU0FBQUUsY0FBQSxDQUFBMkMsZ0JBQUE7SUFHSkQsR0FBQSxJQUFDLHlCQUF5QixDQUNOLGdCQUErQixDQUEvQixDQUFBMUMsY0FBYyxDQUFBMkMsZ0JBQWdCLENBQUMsQ0FDeEMsUUFBTSxDQUFOLE1BQU0sR0FDZjtJQUFBN0MsQ0FBQSxPQUFBRSxjQUFBLENBQUEyQyxnQkFBQTtJQUFBN0MsQ0FBQSxPQUFBNEMsR0FBQTtFQUFBO0lBQUFBLEdBQUEsR0FBQTVDLENBQUE7RUFBQTtFQUFBLElBQUE4QyxHQUFBO0VBQUEsSUFBQTlDLENBQUEsU0FBQVUsTUFBQSxDQUFBQyxHQUFBO0lBQ0ZtQyxHQUFBLElBQUMsSUFBSSxDQUFDLGtEQUFrRCxFQUF2RCxJQUFJLENBQTBEO0lBQUE5QyxDQUFBLE9BQUE4QyxHQUFBO0VBQUE7SUFBQUEsR0FBQSxHQUFBOUMsQ0FBQTtFQUFBO0VBQUEsSUFBQStDLEdBQUE7RUFBQSxJQUFBL0MsQ0FBQSxTQUFBeUIsUUFBQTtJQUluRHNCLEdBQUEsR0FBQUEsQ0FBQSxLQUFNdEIsUUFBUSxDQUFDLElBQUksQ0FBQztJQUFBekIsQ0FBQSxPQUFBeUIsUUFBQTtJQUFBekIsQ0FBQSxPQUFBK0MsR0FBQTtFQUFBO0lBQUFBLEdBQUEsR0FBQS9DLENBQUE7RUFBQTtFQUFBLElBQUFnRCxHQUFBO0VBQUEsSUFBQWhELENBQUEsU0FBQXlCLFFBQUEsSUFBQXpCLENBQUEsU0FBQXdCLE9BQUEsSUFBQXhCLENBQUEsU0FBQStDLEdBQUE7SUFIaENDLEdBQUEsSUFBQyxNQUFNLENBQ0l4QixPQUFPLENBQVBBLFFBQU0sQ0FBQyxDQUNOQyxRQUFRLENBQVJBLFNBQU8sQ0FBQyxDQUNSLFFBQW9CLENBQXBCLENBQUFzQixHQUFtQixDQUFDLEdBQzlCO0lBQUEvQyxDQUFBLE9BQUF5QixRQUFBO0lBQUF6QixDQUFBLE9BQUF3QixPQUFBO0lBQUF4QixDQUFBLE9BQUErQyxHQUFBO0lBQUEvQyxDQUFBLE9BQUFnRCxHQUFBO0VBQUE7SUFBQUEsR0FBQSxHQUFBaEQsQ0FBQTtFQUFBO0VBQUEsSUFBQWlELEdBQUE7RUFBQSxJQUFBakQsQ0FBQSxTQUFBNEMsR0FBQSxJQUFBNUMsQ0FBQSxTQUFBZ0QsR0FBQTtJQVZKQyxHQUFBLElBQUMsR0FBRyxDQUFlLGFBQVEsQ0FBUixRQUFRLENBQ3pCLENBQUFMLEdBR0MsQ0FDRCxDQUFBRSxHQUE4RCxDQUM5RCxDQUFBRSxHQUlDLENBQ0gsRUFYQyxHQUFHLENBV0U7SUFBQWhELENBQUEsT0FBQTRDLEdBQUE7SUFBQTVDLENBQUEsT0FBQWdELEdBQUE7SUFBQWhELENBQUEsT0FBQWlELEdBQUE7RUFBQTtJQUFBQSxHQUFBLEdBQUFqRCxDQUFBO0VBQUE7RUFBQSxJQUFBa0QsR0FBQTtFQUFBLElBQUFsRCxDQUFBLFNBQUFpRCxHQUFBLElBQUFqRCxDQUFBLFNBQUEyQyxFQUFBLElBQUEzQyxDQUFBLFNBQUFNLFdBQUE7SUF6QlI0QyxHQUFBLElBQUMsZ0JBQWdCLENBQU8sS0FBTyxDQUFQLE9BQU8sQ0FBYzVDLFdBQVcsQ0FBWEEsWUFBVSxDQUFDLENBQ3RELENBQUFxQyxFQVdLLENBRUwsQ0FBQU0sR0FXSyxDQUNQLEVBMUJDLGdCQUFnQixDQTBCRTtJQUFBakQsQ0FBQSxPQUFBaUQsR0FBQTtJQUFBakQsQ0FBQSxPQUFBMkMsRUFBQTtJQUFBM0MsQ0FBQSxPQUFBTSxXQUFBO0lBQUFOLENBQUEsT0FBQWtELEdBQUE7RUFBQTtJQUFBQSxHQUFBLEdBQUFsRCxDQUFBO0VBQUE7RUFBQSxPQTFCbkJrRCxHQTBCbUI7QUFBQSIsImlnbm9yZUxpc3QiOltdfQ==