diff --git a/api/api-rules/violation_exceptions.list b/api/api-rules/violation_exceptions.list index 385e26aeb..952ee81e9 100644 --- a/api/api-rules/violation_exceptions.list +++ b/api/api-rules/violation_exceptions.list @@ -187,11 +187,11 @@ API rule violation: list_type_missing,kmodules.xyz/prober/api/v1,FormEntry,Value API rule violation: list_type_missing,kmodules.xyz/prober/api/v1,HTTPPostAction,Form API rule violation: list_type_missing,kmodules.xyz/prober/api/v1,HTTPPostAction,HTTPHeaders API rule violation: list_type_missing,stash.appscode.dev/stash/apis/stash/v1beta1,BackupBatchList,Items -API rule violation: list_type_missing,stash.appscode.dev/stash/apis/stash/v1beta1,BackupBatchSpec,BackupConfigurationTemplates +API rule violation: list_type_missing,stash.appscode.dev/stash/apis/stash/v1beta1,BackupBatchSpec,Members API rule violation: list_type_missing,stash.appscode.dev/stash/apis/stash/v1beta1,BackupBlueprintList,Items API rule violation: list_type_missing,stash.appscode.dev/stash/apis/stash/v1beta1,BackupConfigurationList,Items API rule violation: list_type_missing,stash.appscode.dev/stash/apis/stash/v1beta1,BackupSessionList,Items -API rule violation: list_type_missing,stash.appscode.dev/stash/apis/stash/v1beta1,BackupSessionStatus,Stats +API rule violation: list_type_missing,stash.appscode.dev/stash/apis/stash/v1beta1,BackupSessionStatus,Targets API rule violation: list_type_missing,stash.appscode.dev/stash/apis/stash/v1beta1,BackupTarget,Paths API rule violation: list_type_missing,stash.appscode.dev/stash/apis/stash/v1beta1,BackupTarget,VolumeMounts API rule violation: list_type_missing,stash.appscode.dev/stash/apis/stash/v1beta1,FunctionList,Items @@ -210,6 +210,7 @@ API rule violation: list_type_missing,stash.appscode.dev/stash/apis/stash/v1beta API rule violation: list_type_missing,stash.appscode.dev/stash/apis/stash/v1beta1,Rule,Paths API rule violation: list_type_missing,stash.appscode.dev/stash/apis/stash/v1beta1,Rule,Snapshots API rule violation: list_type_missing,stash.appscode.dev/stash/apis/stash/v1beta1,Rule,TargetHosts +API rule violation: list_type_missing,stash.appscode.dev/stash/apis/stash/v1beta1,Target,Stats API rule violation: list_type_missing,stash.appscode.dev/stash/apis/stash/v1beta1,TaskList,Items API rule violation: list_type_missing,stash.appscode.dev/stash/apis/stash/v1beta1,TaskRef,Params API rule violation: list_type_missing,stash.appscode.dev/stash/apis/stash/v1beta1,TaskSpec,Steps diff --git a/api/crds/bindata.go b/api/crds/bindata.go index a9c54a5e4..1e7ba6216 100644 --- a/api/crds/bindata.go +++ b/api/crds/bindata.go @@ -86,7 +86,7 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _stashAppscodeCom_backupbatchesYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\xfd\x73\x1b\xb9\x91\x30\xfc\xfb\xfe\x15\x28\x25\x4f\xc9\xae\x12\x29\x7b\x37\x9b\xf7\x79\x7c\x57\x77\xa5\x95\xbd\x5e\xbd\xb1\x65\x95\xa5\x75\xde\xbc\x75\x55\x7b\xe0\x0c\x48\x22\x9a\x01\x26\x00\x86\x32\x73\x77\xff\xfb\x53\x68\x00\xf3\xc5\x8f\x69\x0c\x49\xaf\x37\x19\x54\x2a\x6b\x91\x9c\x1e\xa0\xd1\x68\xf4\x77\xd3\x82\x7f\x62\x4a\x73\x29\x5e\x11\x5a\x70\xf6\xd9\x30\x61\xff\xd2\xd3\xc7\xff\xad\xa7\x5c\x5e\xae\x5e\xce\x98\xa1\x2f\xbf\x79\xe4\x22\x7d\x45\xae\x4b\x6d\x64\xfe\x91\x69\x59\xaa\x84\xbd\x66\x73\x2e\xb8\xe1\x52\x7c\x93\x33\x43\x53\x6a\xe8\xab\x6f\x08\x49\x14\xa3\xf6\xc3\x07\x9e\x33\x6d\x68\x5e\xbc\x22\xa2\xcc\xb2\x6f\x08\xc9\xe8\x8c\x65\xda\xfe\x86\x10\x5a\x14\xaf\x88\x36\x54\x2f\xbf\x21\x44\xd0\x9c\xbd\x22\x33\x9a\x3c\x96\xc5\x8c\x9a\x64\xc9\xf4\x14\xbe\x9b\xd2\xa2\xd0\x89\x4c\xd9\x34\x91\xf9\x37\xba\x60\x89\x7d\x9a\xa6\x29\xbc\x96\x66\x77\x8a\x0b\xc3\xd4\xb5\xcc\xca\x5c\x00\xe4\x09\xf9\x7f\xef\x3f\xdc\xde\x51\xb3\x7c\x45\xa6\xf6\x81\xa9\x4e\x96\x2c\x2d\x33\x06\xaf\x75\x6f\xba\x6f\x7e\x64\xd6\x05\xb3\x53\x51\x5c\x2c\xb6\x02\x28\x68\xa9\x59\xda\x78\xfc\xae\xfe\xc0\x3d\x3c\x93\x32\x63\x54\x74\x9f\x0e\x58\x99\x6e\xa0\xa4\x01\xec\x6a\xd1\x9c\x46\x4a\x8d\xfd\x73\xa1\x64\x19\xf0\xd3\xc6\x81\x7b\xcc\x23\x31\xa1\x86\x2d\xa4\xe2\xe1\xef\x49\x85\x51\xfb\xef\xf0\x5c\xf8\x13\xf6\x80\x10\xb7\x95\x3f\x00\xb2\x7f\xb0\xc8\x86\x4f\x33\xae\xcd\x9f\xba\xdf\xbc\xe3\xda\xc0\xb7\x45\x56\x2a\x9a\x75\xb6\x08\xbe\xd1\x5c\x2c\xca\x8c\xaa\xd6\x77\xdf\x10\x52\x28\xa6\x99\x5a\xb1\x9f\xc5\xa3\x90\x4f\xe2\x47\xce\xb2\x54\xbf\x22\x73\x9a\x69\x3b\x21\x9d\x48\xbb\xdc\x5b\xbb\x96\x82\x26\x80\x4d\x5d\xce\x94\x27\x2d\xbf\x1e\x6d\xa8\x29\xf5\x2b\xf2\x5f\xff\xf3\x0d\x21\x2b\x9a\xf1\x14\xd0\xe8\xbe\x94\x05\x13\x57\x77\x37\x9f\xbe\xb3\xbb\x99\x53\xf7\xa1\x7d\xb1\x2c\x98\x32\x15\x4e\x1c\xb1\x55\x64\x5e\x7d\x46\x48\xca\x74\xa2\x78\x01\x10\xc9\xb9\x05\xe5\x7e\x43\x52\x4b\xd8\x4c\x13\xb3\x64\x64\xe5\x3e\x63\x29\xd1\xf0\x1a\x22\xe7\xc4\x2c\xb9\x26\x8a\xc1\x12\x85\x81\x29\x35\xc0\x12\xfb\x13\x2a\x88\x9c\xfd\x95\x25\x66\x4a\xee\x2d\x1a\x94\x26\x7a\x29\xcb\x2c\x25\x89\x14\x2b\xa6\x0c\x51\x2c\x91\x0b\xc1\xff\x5e\x41\xd6\xc4\x48\x78\x65\x46\x0d\xf3\x78\x0f\x03\xa8\x5c\xd0\xcc\x22\xa1\x64\x17\x84\x8a\x94\xe4\x74\x4d\x14\xb3\xef\x20\xa5\x68\x40\x83\x9f\xe8\x29\x79\x2f\x15\x23\x5c\xcc\xe5\x2b\xb2\x34\xa6\xd0\xaf\x2e\x2f\x17\xdc\x84\x83\x9d\xc8\x3c\x2f\x05\x37\xeb\xcb\x44\x0a\xa3\xf8\xac\x34\x52\xe9\xcb\x94\xad\x58\x76\xa9\xf9\x62\x42\x55\xb2\xe4\x86\x25\xa6\x54\xec\x92\x16\x7c\x02\x13\x17\x06\xb8\x43\x9e\xfe\xae\xda\xaa\xf3\xc6\x4c\x3b\x67\xc9\x0d\x20\xb8\x9d\x78\xb7\x44\x47\xb8\x26\xd4\x3f\xe6\xe6\x5f\xa3\xd7\x7e\x64\xb1\xf2\xf1\xcd\xfd\x03\x09\x2f\x85\x2d\x68\xe3\x1c\xb0\x5d\x3f\xa6\x6b\xc4\x5b\x44\x71\x31\x67\xca\x6d\xdc\x5c\xc9\x1c\x20\x32\x91\x16\x92\x0b\x03\x7f\x24\x19\x67\xa2\x8d\x74\x5d\xce\x72\x6e\xec\x4e\xff\xad\x64\xda\xd8\xfd\x99\x92\x6b\x2a\x84\x34\x64\xc6\x48\x59\xd8\xc3\x9a\x4e\xc9\x8d\x20\xd7\x34\x67\xd9\x35\xd5\xec\xe4\x68\xb7\x18\xd6\x13\x8b\xd2\x7e\xc4\x37\xb9\x72\xfb\x87\x0e\x5b\xd5\xc7\x81\xb1\x86\xb1\xed\x0c\xd9\xe1\x8e\xf8\xb5\x14\x73\xbe\x28\x95\x63\x69\x2c\x2f\x80\x60\xdb\xbf\xec\xec\xf2\xbe\x07\xdd\xe6\x5b\xfe\x63\x0f\x8e\xfb\xa5\x3d\x25\xf5\x4f\x75\x07\x34\x21\x66\x49\x0d\xa1\x8a\x91\x82\x2a\x53\x1d\xc9\x59\xc5\xcd\x1a\x27\xc7\xb0\x7c\x63\x6e\xbb\x57\xe8\xc6\x76\x7e\xb1\x63\x6d\xb1\x9c\x63\x2b\x44\xd2\xe1\x27\xb1\x3c\x64\x07\xd0\xad\x9c\x25\x86\x9b\xec\x80\xfb\x6b\xf2\x98\x7a\x6c\x25\xfa\x7a\x74\xf9\xce\xae\xfd\x1b\xc4\x81\x76\x20\x06\xe8\xf0\x00\x5e\xb4\x13\x6c\xe0\x50\xc3\xb8\xd2\x0e\xb0\xbf\x0e\xaf\x42\x6f\xe0\x36\xfe\xb5\x63\x13\x3f\x00\xca\xdf\x33\x43\xed\x4e\x86\x07\x3d\x9f\xc8\x32\x52\xd8\xc3\xa8\x0d\x4b\xab\x0d\xdc\x75\x0e\xf3\x52\x1b\xb2\xa4\x2b\x76\x41\x9e\x96\x3c\x59\x12\x2e\x92\xac\x4c\x99\x06\x38\x6e\x6b\x35\x29\x35\xec\xa6\xfd\x2d\x08\x77\x3b\x50\xbc\x9f\xcd\xd8\x01\x1b\xe7\xb8\xdc\xae\x9f\xb4\x05\xde\x3e\x80\xa4\x1f\xaf\x5b\xf0\x77\x7e\x55\xcf\x03\xce\x82\x20\xa5\xd0\x46\x95\xb0\xb9\x29\x79\x64\x6b\x7f\x2c\x72\x5a\xec\x79\xb3\x36\xd2\xfe\xfc\x89\x9b\x25\xa1\xcd\xeb\x9a\x1a\xa0\xfd\x19\x23\x9a\x19\x32\x5b\x13\xab\x6b\x00\x13\x32\x52\x66\xbb\x36\x03\x16\x23\x1d\x54\x60\x53\x8a\x19\xc5\xd9\x8a\x11\xaa\x66\xdc\x28\xaa\xd6\xd5\x66\x4f\xc9\xc3\x92\xad\xe1\x56\xb0\x67\xe1\x6f\x25\x53\x6b\x3a\xcb\x76\x9d\x54\xc0\xab\x48\x03\x4b\x9d\xb1\x4a\x64\x4d\xc9\xd3\x92\x09\x92\xcb\x94\xcf\xd7\xf6\xf0\xfb\x4d\x6f\xb2\xbb\x3d\x40\xed\x49\x7a\x75\x79\xf9\x58\xce\x98\x12\xcc\x30\x38\x4b\xa9\x4c\xf4\xa5\x25\x9a\xc9\xa2\xe4\x29\xbb\x6c\x6c\xfb\xf6\xa3\x41\x76\xdd\xd5\xed\xb1\xa9\x6c\xe1\xf6\xfb\xec\xba\xfb\xa0\xe3\x80\xa6\xfa\xb3\xc9\xfe\xf6\xed\xce\xd2\xee\xa8\x65\x6e\xf0\xac\x43\x5d\x93\x0b\x3e\x51\xed\x8f\x88\x65\x4a\xc6\xbe\x46\xc8\x5d\xcb\xb1\x63\x51\x52\x45\x85\x61\x2c\xb5\x5b\xef\x09\x86\x0b\xb2\xa4\x45\xc1\x84\x9e\xcc\xd8\xdc\x6e\x83\x54\x29\x53\x84\x26\x4a\x6a\x4d\x34\x2b\xa8\x72\xaa\xd3\xae\x61\xcf\x8d\x43\xf8\x94\x5c\x03\x2b\x75\xdc\xd8\xd2\x8a\x7d\x03\xcc\x19\x48\x3c\x4c\xb3\xc2\xc0\xce\x6b\x90\x80\x68\x4e\x3e\xfe\x78\xfd\xdd\x77\xdf\xfd\x1f\x32\x97\x2a\x07\x9a\xe2\xda\x7e\xfc\xf3\xc3\xf5\x94\xfc\x87\x20\x77\xb2\x28\xed\xcd\x9b\x5a\xb2\x07\x7c\xad\xb5\x61\xf9\x2e\xa6\x6c\xc7\x47\x46\xd3\x89\x14\xd9\x7a\x4a\x6e\xcb\x2c\xb3\x90\x41\x42\x3a\xfd\x95\x1b\x4e\xd3\xd9\xce\xd9\xd9\x55\x52\xe3\x54\xd5\x89\xdd\xf3\x1e\xfa\xdd\xcb\x86\x16\x4c\xd8\x6d\x61\x56\x11\xc4\x92\xee\xdb\xc6\x33\x9e\x57\xc9\xc2\xb1\x47\x7b\x86\xe7\xfc\xf3\x85\xe5\xcf\x16\xdd\x28\xc2\xbd\xb0\x74\x16\x26\x42\x28\x29\x05\xff\x5b\xc9\x40\xcf\x26\x1f\x6e\xdf\xfd\x85\xdc\xfc\x08\xbf\x86\xf7\xcd\xad\x22\xbb\xef\xf4\x53\xa0\x6f\x32\x63\x4c\x58\xf6\xbf\xe2\x29\x10\xbe\x17\x51\xe1\x71\x3b\x69\x3b\xc1\x0b\x00\x0b\xef\x51\xcc\x94\x4a\xec\x25\x34\x2f\xc3\x79\x31\xe0\x89\x67\x99\x3d\x1c\x29\x9f\xcf\x99\x62\xa0\xc5\x50\x51\x03\x2c\xa8\xd6\xf6\xc5\x0f\xbb\x25\x4e\x12\x04\x39\x07\x8c\x66\x1a\x8e\x5b\x22\xf3\x19\x17\x35\x13\xf7\xe8\xd0\xe5\x7c\xce\x3f\x03\x93\xad\xd6\xd5\x0b\xd8\x62\x03\x10\x6d\xa7\x54\x2b\xf0\x44\x95\x99\xbd\x50\x75\x07\xaf\x20\x8a\xee\x01\xea\x6f\x10\xa3\x4a\x91\x34\x0f\x54\xc6\xc4\xc2\x2c\x9d\x80\x1d\x66\x0a\x02\x12\x57\xc0\x45\xf6\x82\x7c\x64\x4e\x5c\x87\x09\xfb\xc5\x4a\xd1\xa0\x0f\x38\xc4\xdd\x0d\xdc\x77\x07\x16\x2c\xe1\x73\xce\x52\xe0\x05\x16\x4e\x20\xae\xd4\xed\x0d\xfb\x6c\x8f\xf2\x45\x93\x77\xda\x1d\xd8\x03\xf2\xf6\xc3\x83\x27\x11\x42\xc9\x1f\x5e\xfc\x1f\x32\x21\x5c\x68\xc3\x68\x7a\x41\xb8\x27\x06\xc6\xcd\x92\xa9\xf0\xb3\x6f\x5f\xbc\x24\xd7\x8e\xed\xee\x63\x8a\x8a\x7c\xff\xe2\x85\xdb\xe9\x8f\x8c\x6a\x29\xbc\xa4\x6a\xaf\x05\x59\x5a\xbe\x9b\xf2\x84\x82\x08\xdc\x3a\x18\x7b\x60\x26\x70\x9f\x7a\x71\x74\x2e\x4b\xcb\x0f\x1d\x3a\xe1\x82\xa0\x59\x26\x8d\x61\x6e\xaf\x77\xa9\xde\x1d\x84\xba\x2b\xda\xde\xfd\x6b\xf2\x2c\x9c\xf5\x6c\x4d\xe8\xdc\x80\x24\xed\x41\xfb\xc9\xb2\xf0\xc2\xbd\x0c\xd6\xa8\xf5\xe4\x0a\x9e\x5f\x32\x9a\x32\xf5\x1c\xb6\xf9\xaa\x28\x32\xbb\x73\x96\xf7\x12\x3e\x27\x81\xc7\xc0\x2d\x11\xf6\x75\x1f\xe7\x3e\x31\x7b\xe6\x29\xcb\x0b\x69\x98\x48\xd6\xbb\x39\x34\x82\xef\x36\x4d\xb1\xdb\xc6\x17\x90\x38\xdf\xd3\xc2\x9e\x58\xaf\x73\x3d\xb2\xb5\x06\x8a\x70\xaa\xa5\x93\x18\x13\x2a\x40\xa7\xd1\x7d\x8c\x51\xaa\x05\xb5\xfa\x2a\x40\x08\x56\xd1\xbf\x33\xf2\x0c\xec\x8c\x4e\xce\x63\x19\x4b\xcc\xf3\x86\x30\x47\xf7\x5d\x0f\x39\x35\xc9\xd2\x3f\x24\x95\xb6\x33\x55\xac\xc8\xe0\x30\x48\x41\x60\xfb\x64\x96\x59\x2d\xc0\x41\x57\x2b\x9e\x30\x1d\x41\x1a\xbd\x32\xa2\xdb\xa3\x83\xc4\x43\x81\xbf\x56\xcf\x81\xd4\x41\xa3\x99\x55\x7c\xd0\x32\x06\x6e\x79\x8e\x08\x86\xda\x29\xb9\xd1\x15\x6b\xdd\xb3\x58\x90\x03\x9d\x74\x2a\x16\xb5\xd2\x75\x41\x68\x66\x96\xb2\x5c\x2c\x89\x96\x70\xef\xf9\x2f\x80\xb7\x5b\xde\xf0\xb4\x4f\x5e\x0f\xb7\x9f\x91\x41\xff\x6d\xf2\xd7\xda\x6e\x42\x0b\xab\x79\x29\x6e\x2f\xf4\x1e\x76\x45\x4b\x23\x73\x6a\x78\x62\x39\xca\xb4\x3a\xf0\x85\xe2\x39\x55\xdc\x72\x01\x61\x98\x48\x59\x0a\x42\x58\x90\xb7\x49\x7d\x10\xfb\x14\x8c\x96\x29\xcb\x59\x88\xe0\x68\x6d\xd5\xda\x8f\xa7\x61\xf0\xd4\xb2\x8d\x39\x67\x4a\xff\x0e\x76\xaf\x8f\x90\xf6\x1e\xde\x6a\xff\xb1\x42\x5a\x65\xd9\x6f\xd9\xc4\xdc\x27\x9e\xaa\x18\x4d\x96\x7d\xbb\xd3\xa6\xc7\x29\xb9\x12\x84\xe5\x85\x59\xd7\x13\xb2\x9b\x65\xc9\x71\x45\x33\x4f\x19\xfb\x39\xff\x7f\x9c\xa5\x6c\x4e\xcb\xcc\xfc\xc7\x59\x0d\xe4\x82\xcc\x4a\xd3\xfa\x8a\xbb\x09\x27\x54\x48\x61\x69\x63\x0f\xc4\xb6\xe5\x6e\x4a\x6e\xa5\x69\xd9\x0a\xac\x46\xda\x10\x46\x40\xa5\xb1\x6c\xa9\x87\xa7\x35\x0e\x1d\x99\x34\x44\x14\xd9\x92\x44\x2c\x51\x9a\xa5\xd4\x2c\xbc\x6e\xdf\x99\xf4\x32\x23\x60\x10\xae\xbb\xf7\x1e\xbd\x94\xbc\xbe\xbd\xff\xe5\xdd\xd5\x0f\x6f\xde\x6d\x23\xcb\x23\x32\xb5\x6a\x4d\xfa\xa0\xfb\x4b\x3e\x09\xa6\x3e\x32\x10\x7d\x93\x7d\x57\x53\x8b\x2a\xdf\x79\x23\x73\xd8\x99\x94\x15\xee\x68\x83\x1c\x59\xe9\xac\x20\xae\x5f\xbd\x7b\xb7\x4f\x70\xf2\x10\xbc\x64\x03\xd6\xeb\x25\x5d\x31\x27\xf7\xa7\x2c\x63\xc6\xc9\xf7\x0d\x45\x78\xbf\x88\x37\x63\x64\x41\xd5\x8c\x2e\xac\x04\x9e\xd9\x6b\xa7\xa9\x37\x78\x18\xdc\xf2\x49\x41\x17\x6e\xca\xb4\x71\x0d\x5d\xec\x57\x75\x84\xe5\x8a\x4c\x58\x01\x8a\x7b\xfd\x1c\xe6\x0c\x24\xe1\xbd\x20\xd2\x7d\x8e\x83\x09\x22\x23\x9c\x90\xea\xe7\x9e\x22\x41\x99\x96\x56\x48\x67\xa0\x2d\x28\x38\x45\x9e\xa2\x72\xa9\xf6\x1d\x4e\xd0\x61\xa4\x60\x6e\x95\xf6\xe6\xa8\xc1\xef\xa6\xc2\x1d\x36\xfe\x7a\xb4\x4d\x85\x2d\xd2\x81\x17\x50\x2e\x34\x61\x02\xae\x25\x4b\xcb\x56\xc1\xed\x3a\xf5\x36\xa6\x2a\x49\xc6\x0c\x59\xcb\x92\x78\x56\xbb\x06\x4d\xf4\x49\xd4\x26\x23\xe0\x57\xad\x4f\xf6\x82\x0c\xcc\xce\x13\x15\x28\x4d\x35\x0f\xf0\xda\x92\xa7\x59\x61\x2e\xac\xf4\x3e\xdb\x87\x4d\x42\x92\xac\xd4\x86\xa9\x89\xe3\x37\x17\x44\x03\x77\x54\x5e\xa4\x6d\x00\x87\xad\xdb\x77\xce\xfb\x2d\x99\x6e\xf4\xb9\x4e\xea\xd1\xda\x94\xab\xbb\x9b\xe0\x30\x09\x6a\x9c\x72\x5b\x64\xf6\xcd\x8a\x60\x45\x4f\x3b\x66\x99\x4c\x1e\x61\xf7\x5f\xdb\xf3\x19\x3b\x45\x7b\x14\x55\xc9\x2e\xc8\xd5\xed\x6b\xab\x1a\xd8\x39\x02\x1b\xaa\xb4\xdc\xb3\xb9\x54\x6c\xa1\xac\xca\x13\xde\xb0\x9b\xc9\x85\x31\xe7\x82\x66\xfc\xef\x60\x86\x70\xb6\xb3\x00\xb6\x3e\x35\x9e\x9f\x54\xee\x82\x5e\xa0\x8f\x6c\x3d\x71\xb7\x85\x33\x9d\x96\xc2\xf0\x2c\xf8\xad\x03\xe5\xc3\x1f\xb9\x5c\x59\x3e\xf3\xda\x5d\x7c\xfb\x6e\x0f\x37\x8c\x74\x3e\xfc\x29\x79\x90\xb5\xdd\x2c\x68\xef\x60\x17\x27\x82\xb1\x54\x93\x33\x37\xeb\x7e\x0c\x14\x4c\xe5\x5c\x37\xb7\x1e\xd6\x7f\x41\xa4\xa5\xd5\x27\xae\x19\xf9\xc3\xb7\xdf\x92\x67\x3f\x8b\x42\xc9\x84\x69\xdd\x63\xd5\x75\xe3\x8d\x30\xdc\xac\x9f\x57\x97\x5e\xb0\xb0\xe0\xc8\xa9\x8e\xe8\xd8\x3d\x6a\xd6\x34\x8c\x8e\x3a\xdb\x01\x5c\xb8\x72\xd5\x05\x06\xd8\xbb\x4e\x0c\x83\x8c\x5d\xd9\x6e\xcf\xd9\x8e\x35\x39\x1f\x5a\xf7\xe0\xfe\xea\xfe\xa5\xee\xda\x11\x4c\x62\xbf\xc6\xb4\x6d\xe9\xa0\x31\xf4\x2d\xfd\x98\xe2\x7a\xe4\x8a\x4a\x1e\xb9\x97\x3f\xdf\xbc\x3e\xee\x7a\x4a\x7e\xb4\x0d\x0a\x72\xf4\xbe\x15\x4d\x1a\x97\xd0\xde\x9f\x59\xca\xd9\xfb\x83\x1e\xe5\x64\x62\x71\xdb\x6b\x14\xe9\xb9\xf8\xdd\x8f\xa8\x52\x3b\xcc\x11\x3d\x40\xba\xa1\x1b\xf5\xe8\xbf\xb1\x97\x52\x3e\x62\x45\xe7\xab\xc4\xf9\x06\xc1\x2e\x73\x6f\xa8\x5e\x06\xb3\x9c\xa1\x8f\x20\xb2\x28\xa6\x0b\x29\x34\xdb\x6f\x6f\xf5\xf1\x1d\x9a\x69\x17\x67\xb8\xf3\xa7\x38\x81\xa3\x90\xda\xb8\x80\xb5\xfd\x34\xde\x5a\xcb\x5d\xf5\x90\xbd\x03\xad\xe2\xcf\x52\xc2\xf3\x9c\xa5\x9c\x1a\x56\xd9\x15\x69\x0f\xc9\xb6\x97\x02\xa0\x64\x5e\xd8\x3b\x6f\x3f\x27\xc6\x8a\x52\x24\xc8\xa6\x4c\xed\x77\x8f\x6c\x5d\xe4\x75\xf3\xd9\xca\x76\xa9\x6b\x0f\x81\x3b\xe2\xbd\x40\x1b\xb3\x20\x4f\x20\x3b\x1a\x49\xd8\x67\x96\x94\x86\x79\x05\x20\xcf\xa9\x48\x35\xa8\xa2\x6f\x3e\xb3\x04\x01\xb2\x50\x72\xc6\xac\xfc\x5a\x41\x9c\x73\x6f\x0d\x2e\xa4\x32\x00\xea\xa7\x87\x87\x3b\xfb\x93\x87\xeb\x3b\x2c\xc4\x7e\xe9\x05\xcb\x34\x09\x2c\x31\x12\xe5\x1f\x84\x33\x35\x82\xf1\xd8\x6a\x31\x9e\x8b\xce\x65\x96\xc9\x27\xab\x04\xb8\x23\x83\x58\xce\x8c\x35\xcc\xcd\x80\xd5\xce\x16\x52\x38\x8f\x20\x2d\xd0\xc7\x1e\x82\x23\x51\x44\x47\x60\xcb\x61\x4f\x31\x3f\xdd\x20\x3b\x78\xb2\xb2\x9f\xf8\x3f\x33\x2e\x9a\x84\x83\x82\x4b\x08\x17\x9a\xa7\xac\x52\x33\x81\x08\x9d\xdb\xe4\x49\xaa\x47\x8b\xd0\x94\x2b\x30\xd0\xee\x33\xe5\x36\x87\x33\x97\xd4\xf3\x02\x21\x58\x4a\x43\x9e\x9d\x5f\x9e\x3f\x0f\x9a\x57\xf5\xb2\xf3\x7e\x81\xd8\xc3\xe5\x19\xf3\x6e\x5d\xf0\x90\x25\x35\x1a\x34\xcf\x8b\x6c\x0d\x2b\x3f\x07\x77\x0d\x76\xf1\xce\xeb\xa0\x4a\x11\xf0\x40\x89\x5e\xb2\x2c\x73\x6a\x9c\xa2\xc1\x42\xef\x3e\xc5\xa3\x14\xa2\x3a\x80\x99\x3f\x3b\xff\xef\xf3\x0b\xc2\x4c\xf2\x9c\x3c\x49\x71\x6e\x00\xad\x20\xd9\x97\x9a\xf5\xf2\xbf\x30\xfc\xa4\xac\x26\x2c\xbc\xd7\x9e\x7d\x2e\x32\x9e\x70\x93\xad\x81\xbd\x12\x59\x7a\xfb\x02\xc5\xae\x1e\x80\x5a\xca\xe7\xc6\x87\x01\xdb\xd3\xf4\x02\xe8\xca\xb9\xb5\xac\x42\x9c\xf1\x15\xbb\x5c\x32\x9a\x99\x25\x96\x02\xec\xae\x08\x29\x26\x7f\x67\x4a\x82\x23\x56\xf8\xe7\xfb\xcf\x10\xc1\xd8\x1a\x9a\x23\x82\xdd\x34\x1f\xd8\x2d\x0c\x6c\xfe\x16\x61\x56\x70\x06\xe3\xb7\xcc\x44\xb2\x33\xcb\x80\xdf\x32\xd3\x61\x3c\x16\x16\xb1\x1f\x7b\x03\x3c\x62\x5d\x46\x5a\x1d\x6f\x2e\xd5\xde\x98\x07\x37\xe2\xf8\xd4\x52\x6a\xc4\xaa\x36\x57\x26\xb5\x71\x97\xa0\x91\xf6\xb0\x0b\x96\x58\xfa\xbc\x20\x29\x56\x0d\xae\x16\xe6\xae\xac\x94\xdc\xdc\x4d\xc9\x5f\x64\x09\xf7\x10\x9d\x65\x6b\xf2\x44\x9d\x4d\xcd\xea\xc8\x67\xf6\x85\xfd\x8a\xb0\x1b\x5c\x00\x8e\x7f\x02\xaf\xa4\x0e\x7e\x5e\x1c\x75\x46\x12\x5c\xe3\x3d\x43\x58\x3d\x64\x83\x78\xf7\xa9\x0e\x6b\xf5\x2c\xd4\x53\x07\x6e\xda\xc4\x5d\xf6\xe0\xfe\x81\xb8\x1b\x77\xc0\x3d\xe4\x13\x1c\xcc\x0d\x3a\x77\x58\xf0\x9f\xcf\x98\x26\x94\x24\xcd\xe5\x21\xe1\x12\x6f\xdf\x87\xf0\x13\x2e\xdc\xb2\x40\x34\xc1\x92\x54\x1c\xfd\xbb\x81\xd1\x59\x9b\xa3\xb5\x7a\x7b\x5b\xb9\x35\x7a\xfb\x6d\x8f\xd2\xd3\x1d\xd1\x3c\x8e\x84\xe8\x90\xe3\x4d\x19\xc0\x9d\x76\xce\x18\xc5\xb3\x39\x7a\x95\xc7\xf6\x8f\x63\x56\x10\xc1\xf8\x9b\x0f\xe0\x6e\x15\x42\x0a\x6a\x96\x03\xb8\xc1\x1d\x35\x4b\x70\x5b\x25\x09\xd3\x3a\x44\xd0\xc0\x01\xf0\x61\x34\xa7\xe0\x60\x56\x5b\xc0\x4d\x96\x8a\xf5\x87\x39\xee\xa7\x13\x3f\x0b\x2e\x0c\x5b\x20\xcf\xfe\x24\x9e\xa8\x5a\xe8\x73\x56\x24\x45\x44\x99\xcf\x98\x0a\x9a\x03\x28\x43\x15\x52\x91\xf4\x21\x3b\x42\xec\x94\xdc\x3a\xa0\x1d\xff\x82\xa2\x62\x81\xa5\xb9\x97\x76\x16\x7f\xfc\xfe\xfb\xef\xbe\xf7\x2e\xf2\x00\x8b\x0a\x72\x73\x75\x7b\xf5\xcb\xfd\xa7\xeb\x5f\x6e\xaf\xde\xbf\xc1\xed\xf2\xe7\x49\x6d\x3d\x9a\x70\x61\x26\x52\x4d\x1c\xe6\x5e\x81\x71\x14\x01\x04\x52\x1b\x90\x3c\xa4\x85\x69\x48\x17\x83\x9b\xdf\x0a\xb9\xe0\xd4\x77\x12\x00\xc4\xf9\xf7\xb9\x8f\x9b\xc3\x4a\x1f\xb5\xe9\xdc\x3e\x6b\xc9\xfd\x04\x74\x8e\x67\x3e\x13\x20\x99\x63\xcb\x8e\x77\x28\x31\x6b\xe3\x52\xb5\x8f\x6d\x93\x1e\xe1\xf3\xaf\x41\x7c\x9c\xc9\x74\x3d\x80\x82\x7e\x90\xe9\xfa\x10\x71\x27\x92\x53\xd8\x95\x0f\x98\xe5\x8f\x52\xe5\xdb\x67\x09\xeb\x3e\x81\x54\x35\x44\x76\x79\x64\xc8\x1d\x70\x63\xb8\xb4\x11\x31\xa7\xc8\x65\x1f\x30\xb3\xd8\xbb\x99\x9c\xfe\xfa\x1f\x55\xaa\xce\x84\x46\x95\x0a\x35\x46\x95\x6a\x54\xa9\x46\x95\x6a\xfb\x18\x55\xaa\x51\xa5\xda\x18\xa3\x4a\xb5\x65\xfc\x53\xa8\x54\x26\x29\xee\x65\xf2\x18\x6d\x90\x3f\x7f\xb8\xbe\x73\x0f\x36\xb4\x2a\x2a\x82\x2f\x90\x8b\x95\xcc\x56\xb8\xa3\x42\xc9\xc3\xf5\x1d\x2c\x6c\x0a\xff\x82\x50\x00\xf0\x37\xad\x2d\xf4\xb2\xb0\x5f\xb1\x94\x3c\x7c\x78\xfd\xe1\x15\xe1\x79\x91\xb1\x7c\x7f\x92\x4e\x0d\x59\x31\x9a\x71\x6d\x78\x02\x90\x33\x3e\x67\xc9\x3a\xc9\x18\xbc\xa3\x2f\x0c\xe4\x0b\x39\x00\xce\x3f\xf8\x24\xa2\xdd\x82\x2b\x5a\xec\xa9\x49\xb5\x21\xb8\xf6\xaf\x93\xfc\x33\x73\x66\xcf\x91\x55\x33\x12\x61\xe4\xcc\xbb\xc6\xaf\xc7\xab\x90\x3f\x2c\x14\x8b\x0f\xc2\x09\xcf\xec\x88\xc1\xf1\x69\xde\xf1\x41\x38\x90\x5e\xd3\x97\xb6\x30\x46\xe1\x8c\x51\x38\xfd\xcb\x19\xa3\x70\xc8\x18\x85\x33\x46\xe1\x8c\x51\x38\x7d\xbf\x1d\xa3\x70\x46\x93\x71\x63\x42\xa3\xc9\x18\x35\x46\x93\xf1\x68\x32\x1e\x4d\xc6\xdb\xc7\x68\x32\x1e\x4d\xc6\x1b\xe3\x6b\x33\x4c\x8c\x26\xe3\xed\x63\x8c\xc2\x19\xa3\x70\xc6\x28\x9c\xce\x18\xa3\x70\xc6\x28\x9c\x51\xa5\x1a\x55\xaa\x51\xa5\xc2\x4f\x79\x54\xa9\x10\x0f\x8c\x2a\xd5\xa8\x52\x8d\x2a\xd5\xa8\x52\x91\x31\x0a\xa7\x01\x79\x8c\xc2\x19\xa3\x70\x36\xc6\x18\x85\xf3\x0f\x1b\x85\x83\xf8\x11\xf4\xfd\xe1\xf9\x27\x99\x95\x39\x0b\xfd\x97\x90\xf5\x7f\x6e\xb6\x3d\xdb\x64\x80\xc4\x84\x0f\xe7\x72\x1f\xfd\x52\xb2\x02\x18\x76\x77\x97\x12\xea\x07\xa9\x05\x54\xb7\x73\x1d\x5b\x58\x5e\x48\xe5\x2a\xef\xfa\x10\xa0\xb2\xc8\x24\x4d\x7b\xda\x50\x48\x88\x04\x62\x22\xb5\xf4\xcc\x85\xb6\xcc\x4b\x2c\xec\x92\xa5\x7f\x43\x68\xeb\x00\x71\x21\x25\x14\x91\xeb\x99\xea\x5f\xe5\x8c\xe4\x32\x65\xd9\x94\xbc\x06\xc7\xbc\x5b\xee\x9a\x70\xd0\x06\x35\x4f\x59\x42\x95\xff\xc9\x4e\x38\x38\x56\x8a\xad\x9b\x38\xa8\xf5\x54\x0f\x29\x6e\x6f\x69\xb7\xb7\x05\x55\x0f\x44\x6c\x93\xbb\x6e\x2b\xaa\x1e\xb0\x5f\x6b\xdb\xbb\xcd\x81\xe4\xcc\xfd\x85\xf6\x06\xb5\xaa\xea\x41\xe3\x66\x2b\x3d\x54\xcb\xaa\x3e\x79\xaa\xaf\xb9\xde\xd6\xd6\x55\x3d\x40\xbf\xd2\x76\x7b\x5b\x56\x8f\xdb\xf0\xfd\x2d\xad\xc2\x68\x6f\xfa\xbd\xa1\x22\xa5\x2a\xf5\x9b\x74\x7e\xae\x1b\x3d\x8f\x50\x05\xc3\x89\x37\x89\x9d\xaa\x59\xcc\x7e\xd4\xe0\x65\x49\x54\x33\xac\xea\xc7\x91\x2d\x0a\xc2\x88\x12\x9a\x86\x35\xc9\x42\xcc\x22\xa7\xc5\x80\x66\x59\x28\x3f\x8d\xcc\x34\xbe\x69\x16\x02\xe2\xf6\xb6\x5a\x7b\x9b\x67\x61\x10\xb0\xaf\xbd\xd6\x11\x9b\x68\x55\x78\xc1\x6b\x86\x11\x4d\xb5\xc2\x38\x4d\x73\xad\x6a\xee\x91\x4d\xb6\x10\x20\x7d\x5c\x63\x4c\xb3\x2d\x8c\xda\xd9\x6e\xc7\xd5\xd7\x74\x0b\xb5\xf4\x3d\x6d\xb9\xb6\x35\xdf\xc2\xad\x1d\xd1\x9e\xab\xd1\x84\x0b\x01\xf3\xab\x6b\xd3\x15\x06\xbe\x5d\x57\x85\x72\x3c\x83\xc4\xb5\xef\x0a\x23\xba\x8d\x17\x02\xef\xbe\xd1\x57\x44\x3b\x2f\x04\xd0\x8d\x86\x5f\x3d\x6d\xbd\x30\xee\xe3\x9e\xc6\x5f\x5b\xda\x7b\x61\x5c\xe7\xb8\x06\x60\x8d\x36\x5f\x98\x43\x7c\xd4\x46\x60\x61\x44\x36\x04\xc3\xa2\xb4\xee\x5e\xdb\xdb\x18\x0c\x63\x7b\xdd\x68\x1d\xb6\xb7\x41\x18\x06\xe2\xee\x16\x62\xfb\x1a\x85\x21\x20\xef\x6b\x25\xb6\xa5\x61\x18\x86\x2f\xa2\x5b\x8a\xf9\xc6\x61\x08\x98\x47\x6d\x2d\x16\x46\x6c\x8b\x31\x0c\x48\xaf\xa2\xc4\xb6\x1a\x43\xa1\x15\x9e\x8b\x69\x39\x86\xbf\xc0\x1b\xf9\x29\x5f\x43\xeb\xb1\x30\x22\xee\x90\xbe\x56\x64\x61\xfc\x0a\xf2\x3e\xae\x45\x19\x8e\x4f\xc3\x45\x15\xd5\xaa\x0c\x01\xb7\xd9\xcc\x2c\xa2\x65\x19\xe6\x12\x68\x36\x35\x3b\x7a\xeb\xb2\x30\x22\x84\x72\x5c\x2c\xc0\xa0\x96\x66\x18\x89\xa0\x6e\x7a\x86\x6c\x6d\x86\x00\xba\xa5\xf9\x19\xa2\xc5\x19\x86\x2c\xb6\x36\x41\xeb\x6d\x75\x86\xe2\x65\x3d\xcd\xd0\x36\x5b\x9e\x21\xa0\xa2\x9b\xa2\x9d\xa8\x97\x42\x14\x93\x40\xb4\x42\xab\xd7\x35\xa0\x25\x1a\xf6\xea\x8f\x6d\x8d\x86\xb2\x1d\xc0\x94\xd0\x2d\xd2\x90\xaa\x6b\xd5\x44\x0d\xd3\x2a\x0d\x75\x6e\xb6\x34\x53\xdb\xd3\x32\x0d\x77\x62\xf6\x35\x55\xdb\x6c\x9d\x86\x80\x89\x6c\xae\x86\x37\xe1\x11\x6c\xef\x3f\x4c\x93\xb5\x30\x22\x28\x1f\xdd\x74\x2d\x8c\x41\xcd\xd7\x30\xdc\x18\xda\xb3\xc5\x34\x61\x43\xdf\xa5\xd5\x4e\xf7\x36\x63\xc3\xc9\x68\xbb\xda\xb5\x6d\x6f\xca\x86\x80\x89\x68\xdb\xb6\xad\x39\x1b\x5a\x45\xed\x6d\xdf\x56\x35\x69\x43\x59\x39\x23\xda\xb8\x55\x58\xc3\x06\x3c\x9e\xa2\xad\x5b\x18\x91\xed\xdd\x50\x30\x3d\x85\x45\xb6\x79\xc3\x81\x56\xa0\xb1\x23\xdb\xbd\xa1\x40\xf6\xb6\x84\x0b\x23\x36\xb2\x13\xdf\x22\x2e\x8c\x63\xb5\x8a\x0b\x23\x3a\x6e\x22\xbe\x75\xdc\xd6\xa9\xf7\xb6\x90\x43\x02\x25\x5b\x5b\xcd\xed\x6e\x25\x87\x06\xbb\xbb\xe5\x5c\xb7\xa5\x1c\x1a\xe4\xf1\x5a\xcf\x85\x81\x6e\x41\x87\xc7\xa6\x6f\x55\x87\x68\x45\x87\x86\xb9\xd9\xb2\x6e\x70\x4b\xba\x6a\xe1\xe8\x06\x6e\x61\xe0\x5b\xd4\x85\x11\xd1\xaa\x2e\x66\xc3\x9a\x2d\xed\xa2\x2e\x03\x0f\x21\x7a\xe5\x98\x16\x76\x61\xc4\xb5\xb2\x43\x2f\xfb\x57\x6e\x79\x17\x46\x34\xb3\x8b\x89\xba\x8f\x6b\x85\x17\x85\xba\x53\xa8\x79\x6e\x44\x63\x04\xd1\x42\x2f\x8c\xa8\x56\x7a\xa7\xc3\x07\xa6\xe5\x5e\x18\x91\xe8\x88\x49\x18\x40\xb6\xe2\xab\x7f\xde\xd3\x92\xaf\xfe\x21\xd2\x52\xdc\xd7\xa2\x2f\x8c\xa8\xd4\x03\x6c\xda\x01\x12\xe8\xee\x16\x7e\x61\x74\xe2\x41\x0a\x96\xb4\x4c\x08\x29\xd3\xa0\x0e\x27\x4b\xaa\x68\x62\x98\x82\xb8\xdf\x3e\xfe\x2c\xe7\x75\x2c\x9e\xb7\x34\x05\x3d\xa5\x90\x29\xa1\xa5\x59\x4a\xb5\xd5\xaa\xbc\x85\x0c\x13\x29\x12\x56\x18\x7d\x69\x85\x03\xba\x60\x97\x85\xdd\x74\x6d\x98\x30\x13\xf7\x0e\xfd\xbb\xfa\x23\xf7\x49\x92\x51\x9e\xf7\x50\x69\x44\xec\x08\xc4\xab\xbe\x97\x69\xb4\x62\x7a\x7e\x55\x3f\x5a\xeb\x0d\x4d\xc4\xa2\x63\x61\x73\x80\x01\x86\x07\x87\x58\xef\x4f\xb0\x5a\xe9\x31\x51\xe9\x26\x34\x81\xd7\x4d\x5e\xf6\x1f\x74\xb4\x4a\x15\xc5\x0b\xf0\xe9\x37\x29\x35\xf4\x1e\x6c\x9d\x91\x7b\xf3\x50\x1b\x65\x3c\xdf\x71\xe8\x75\x71\xa8\xf7\x82\x16\x7a\x29\xcd\xeb\x0a\x3c\xca\xbd\x59\x2c\x29\x99\x33\x6a\xef\x58\xb2\xa0\x86\x79\x3b\x12\x13\x56\x4a\x73\xce\xb8\xa4\x54\x96\x59\x67\xeb\xce\x9b\x70\x4a\x3f\x08\x8e\x22\x5b\x37\x42\xf8\x21\xb8\xd5\x99\x7b\xbd\x21\xc1\x7b\x4f\x21\x50\x13\x23\xa1\x27\x54\x04\x78\x9d\x49\x35\x81\x57\xce\x3b\x0c\x44\x70\xe6\x11\x4a\x04\x7b\x0a\x04\x6b\x17\x0f\xe0\x6a\x21\xd5\x87\x29\xed\x6d\xeb\x19\x46\x83\xf4\xa9\xa9\xd5\x5b\xc3\xf3\xa1\xcb\x4e\x25\xf3\x9e\x2e\xc4\xda\xdd\xab\x51\x6e\xc9\x2c\x0b\x0e\xc4\x24\x54\xb2\xf2\x4e\xd8\x39\xe5\x99\x25\x8d\x1a\x03\x6e\x0f\x31\xb4\x05\x61\x0c\x6c\x05\xf7\xfc\x8d\xd3\xc0\xe6\xa5\x25\xb4\x0b\xf2\xc4\x48\x91\x51\x28\x16\x17\x96\xd2\xd3\x0d\xbf\x42\x41\xbd\x44\x38\x73\xba\x9a\xea\x8c\x2d\xe9\x8a\xcb\x3a\xad\x2a\x0a\xb5\x39\x5d\xdb\x3b\x43\x2c\x8e\x5e\xb9\x8e\x16\xfc\xad\x92\x7d\xf5\x20\xab\xf5\x75\xd4\x7b\x78\x34\x9c\xa3\x05\xfc\x11\x2a\xc6\x05\x97\x09\x52\xb4\x99\x31\xe7\xa2\xf1\x8a\x8b\xb3\xe1\x35\xdf\xd0\x72\xa1\x62\xb3\x4d\x9c\xd9\x3e\xf8\xee\x41\x5f\xe8\xd8\x74\x12\xcb\xe9\xaf\xee\x6e\xdc\xec\xb1\x5a\xce\x8f\x52\x11\x2a\xd6\x4e\xd9\xb4\x3a\x97\x4a\x27\x05\x55\x66\xed\x76\xfd\xa2\x39\x73\x24\xc8\x20\xac\x9d\x24\x47\x11\xaf\x63\xb5\x76\x38\x04\x31\x83\x33\x7d\x5d\x30\xe7\xa8\xf4\xf4\x0d\x3b\x86\x5e\x5c\xd8\xd7\x53\xac\x0e\xaf\x06\x6d\xe6\x3b\xf2\x76\x85\xcf\xaf\x6e\x75\x31\xb9\x2c\x28\x91\x1c\x29\x90\x47\x88\xd9\x95\x73\x34\x56\x9a\xfb\x58\x79\x55\xeb\x68\x76\x67\x7f\xe0\x82\xe7\x65\x5e\x43\x8e\xbb\xcf\x4e\x24\xca\x21\x13\x0a\x48\x34\x0f\xce\x78\xce\x0d\xd6\x24\x3b\x30\xb6\x82\x0c\xd1\xa6\xdb\xdb\xf5\x0e\xa6\xd9\x28\x50\xe0\x4c\x45\x9f\x61\xab\x68\x2e\x4b\x94\xe7\x92\x38\x85\x26\x91\x79\x51\x1a\xd6\xf0\xac\x83\x57\x7d\x47\x74\xcc\xbe\x1d\x6b\xb9\xb0\x2f\x9d\x17\x67\xe2\xc1\x4f\x2a\xf0\x93\x2a\xe3\xed\x32\x26\xd7\x10\xed\x40\x0a\x99\x12\x5f\xfd\x2e\x7e\x0c\x29\x1d\x9d\x7d\xf4\x47\xee\xf0\x7d\xac\x2e\x32\x7b\x83\x57\x6f\x43\xdf\x83\x32\xe7\xc6\xf8\xb0\x05\xda\x2c\x63\xcb\x4d\x2b\x79\xd4\x51\x23\x12\x28\x58\xf0\x29\x04\x25\x37\x4a\xad\xd6\xe2\x44\x6d\x35\xc6\x09\xcf\x04\xe2\x6e\xea\x3c\x5f\xa0\xbd\x89\xd3\xf4\xd3\x10\x04\x1d\x6d\x3d\xfa\xad\x50\x7b\xc4\x8f\x43\x8c\x53\xe4\xd5\x70\xe5\x62\xcd\x5c\x0e\x03\x91\x2b\xa6\x3c\x6f\xd7\x3e\xeb\x58\x73\x5c\x98\xbb\xa5\xa2\x19\x17\x29\x17\x8b\x63\x4b\xce\x10\xc4\xf5\xe6\xb3\xbd\xb8\x34\x2e\x0f\x66\x63\x99\x5d\x10\x2e\xf9\x20\xf3\xee\x77\x40\x01\x92\x74\x02\x9e\xc3\xe9\xcb\x5d\x66\xd8\x83\x2f\x83\x13\x3e\x41\x86\x6d\xd8\x71\x75\xfb\x1a\x2b\x8c\x0e\xaf\x7b\x13\xf6\x79\xdb\xf4\xf1\x2c\x83\x10\x5a\x43\x70\xb1\x7e\xc1\x36\xe4\x02\x00\x2f\x08\x25\x8f\x6c\x7d\x81\xcc\x3a\xf0\x30\x85\x4f\x8a\x08\x40\x15\x83\x54\xc8\xe0\x63\x6b\x04\x18\x62\xd5\x86\x2f\x50\xf0\xab\x85\x5e\x3b\x4b\x2f\xe0\x3a\x3c\xdb\x0f\x60\x2d\x31\x1e\x4c\xd2\xa4\x2f\x0a\x31\xb0\x98\x84\xc0\xe6\x18\x54\xa1\x27\x60\x7f\xf0\xf2\xab\xed\x6b\x88\x97\x40\x08\xe8\x32\xe5\x6e\xc0\xc6\xdb\xf3\xb9\xe4\x85\x0b\x5e\xd2\x0c\x4e\x68\xc8\x64\xfd\x44\x33\x94\xed\x7a\x73\x6d\x70\x22\xc9\x8d\xb8\x20\xb7\xd2\xd8\xff\xbc\x81\x30\x71\xa0\xad\xd7\x92\xe9\x5b\x69\xe0\x93\x93\x23\x3b\xbe\xe6\x5b\x0b\xd5\x3e\xd0\xd6\x25\x87\x80\x9d\xb1\x0e\xc7\x8d\x42\x4c\x40\xa9\xb7\x40\x55\x5b\xc8\x35\xb9\x11\x44\x2a\x8f\xa7\x28\x98\x55\x78\x99\xf6\x53\x0b\x36\x00\x21\xc5\xc4\xc7\x89\xdd\xcc\xa3\x41\x36\xe7\xe6\xb7\x4d\xaa\xd6\xae\x1d\x69\x9a\x7e\x8a\x60\x61\x8d\xa9\x7c\xe7\x86\x4b\xc4\xca\x68\xc2\x52\x92\x96\xca\x45\xf1\x6b\xa3\xa8\x61\x0b\x9e\x90\x9c\xa9\x05\x23\x85\xbd\x89\x62\x88\xec\x6b\xae\xf8\x17\x5f\x28\xeb\x91\x61\x61\x4f\xaa\x6d\x8f\x12\xd7\x4f\x56\x2a\x0b\x44\x88\x77\xc8\xc0\x7c\xf2\xab\xaa\x1e\x8d\xa9\x3a\x41\x27\x77\x41\xfb\xff\x65\xaf\x66\x20\xfc\xff\xc1\xde\xa3\x94\x2b\x3d\x25\x57\x44\x73\xb1\xc8\x58\x13\x42\xb0\xeb\x35\x5e\x86\x04\x6a\x67\xd3\x0a\xc3\x05\x56\x2f\x08\x73\x22\xbe\x9d\x69\x57\x5e\xc3\x9e\xef\x27\x88\x50\xb5\x97\x6f\x95\x51\x74\xf6\xc8\xd6\x67\x17\x1b\x7c\xe4\xec\x46\x9c\x61\xa1\x06\xd3\x72\x8b\x67\x54\x92\x0f\x78\x35\xce\xe0\xbb\x33\xec\xc1\xde\x26\x2e\xc6\x08\x82\x27\xd3\x22\x9c\x51\xe6\x3a\xa3\x5a\x0f\x48\x60\x6c\x45\x3b\xdc\x37\x60\xd5\xf1\xc9\x33\xcc\x59\x73\x59\x7f\x94\xe7\xc7\xb4\x2a\x25\x76\x22\x18\xcf\x60\xc4\xe1\x73\xb0\xdf\xcb\x34\x16\x53\xf5\x83\x95\xdb\xfa\x09\xc4\x45\x6f\xfc\x45\x7b\x6d\x78\x0b\xb7\x4d\xcc\x7d\x82\xc8\x34\x39\x27\x3f\x56\x2d\x60\x70\x92\xbe\x55\xb6\x79\x48\xea\x10\xd2\x10\x2e\x92\xac\x4c\x5d\x6e\x31\x00\x07\x85\xde\xdf\x93\x28\x90\x94\xcc\x98\xa9\x3c\x8c\xfd\x34\x1e\xbd\x05\x03\x88\xf5\x53\xf5\x60\x10\xdd\xbd\xfe\xda\x88\xea\x42\x3b\xf8\xee\x2a\x7a\x73\x60\xa1\xf4\x8e\x2b\x3d\xc2\xb5\xdf\x91\xe3\xad\x1a\x1b\x45\x01\xed\x69\x22\xeb\x6a\x98\x72\xc3\x4a\xec\x3d\xbf\xcd\x80\xe1\x4b\x07\x1b\x13\x4f\x51\x1f\xc5\x60\x36\xf6\x04\x5a\x27\x93\xc7\x97\xec\xf8\xa7\x89\xb7\xa0\x89\x29\x69\x76\x40\xb8\x45\x4d\x88\x8c\xdc\x7d\xba\x26\x4b\xaa\x07\xe4\x57\xfc\x13\x05\x66\x24\xb4\xa0\x09\x37\x08\x63\xc0\x97\x4f\xbf\xfc\xd8\x3e\x98\x9e\x38\x6a\x93\x30\x3a\xab\xbb\x14\x29\x53\x19\xd4\x1a\x71\xfb\x84\xe5\x4e\xb8\x6a\x21\x52\x38\xcc\xc4\x9e\x83\x6b\xcf\x69\xae\x03\x00\xbb\xa2\x0d\x06\x82\x58\x9f\x67\x31\x37\xf3\xe6\x4a\x37\x39\x11\xd7\x68\xff\xa3\x62\x1a\x8a\x6a\x55\x61\xe4\xf5\x1c\x43\x54\x84\xcf\x13\x39\xff\x08\x3f\xbd\x37\x54\x19\x96\x9e\x9f\x2a\xbb\xa3\x7b\xe5\x5c\xdb\x25\xd7\x93\x72\x5c\x04\x29\x94\xa7\x0c\x7e\x4b\xe8\x4c\x96\xae\xad\x19\x48\x0e\xc5\x0a\xd9\x33\x31\x4a\xbd\xc9\xa8\x36\x77\x4a\xce\xd8\x03\x1f\x18\x55\xfb\x8e\x6a\xe3\xcb\xbe\x30\x57\x72\x3b\x0d\xb9\x3d\x6e\xf5\x58\x39\x3c\xbe\x12\x88\x1b\xd1\xfa\x99\x5d\xf3\x83\xa2\x42\xf3\x50\x04\xe7\xc0\x85\xb7\x96\x4b\x4c\x05\x1a\xe9\x1a\xb7\x03\xf2\x18\xa4\x60\xa1\x8d\x1d\x68\x61\xe0\x9f\xf9\xea\xd0\x97\x33\xad\xe9\x62\x18\xce\x7e\x2a\x73\x2a\x26\x8a\xd1\x14\x32\x0e\x3c\xa8\x46\xad\x05\x34\xc2\xda\xa7\x24\x83\xbd\xa8\x10\x7f\xb2\x44\x1b\x05\x95\x22\x06\x2d\xfd\x67\xc8\x83\xf5\xb9\x0a\x75\x61\x2a\x6a\xff\xad\x22\x8c\x66\x39\x4d\x96\x5c\x30\xc7\x4b\x35\xd4\x5e\xb3\xa8\xf4\x45\x00\xc0\xce\xbd\xe0\x2b\x16\x97\xaf\xe3\xd6\x15\x8a\x32\x3b\x42\x3e\xd7\x1b\x68\x8d\x31\x18\x72\xe3\x23\xd3\x34\x39\x6b\x31\xe1\x33\x5f\x41\x8c\x51\x11\x37\x49\xd4\xed\x11\xee\x86\x93\x91\x00\x46\x90\x3f\x00\x3c\x3c\x30\x84\xbe\xf6\x5f\x41\x0f\xeb\x02\x8f\x68\xb0\x53\x41\xf5\x1b\x5f\x55\x46\xce\x7b\xc0\x4f\x23\xe0\x9f\x34\x9e\x1f\xa5\x0a\x91\xaa\x3a\x31\x5a\x40\x3c\x72\xe8\x3d\x21\xc5\x92\xea\x58\x2d\xf9\xce\x3e\xb3\x4b\x21\x04\x80\x44\x62\x0e\xe8\xd6\xbd\xfc\xd2\x2a\x31\xe2\x47\xaa\x14\xf6\x22\xbb\x67\xc6\x5e\x0d\x7b\xce\x5c\x5b\x2e\x6f\x3f\xe5\x0b\x57\x18\x59\x95\xc7\xfd\x58\x97\xc4\xb8\x95\x29\xbb\xf7\x5e\xbe\x7d\x2c\xf8\x6a\x0e\x15\x20\xd6\x17\xe4\x41\x66\xbe\xd0\xc5\x05\x28\xcd\x5c\x30\xad\x41\x82\x22\xcc\x24\x87\x96\xd9\xad\x22\x18\xf6\x53\x06\x5e\xca\x63\x62\x35\x30\x0f\x9e\x89\x15\x57\x52\x80\x15\x78\x45\x15\xb7\xb7\x4c\x68\x36\x83\x31\x5c\x6d\x94\xdc\xde\x2c\x2d\x70\x22\x61\xfc\x8d\x58\x7d\xa2\x6d\xff\xa7\xd8\xba\x1c\x14\xc3\xf2\x40\x08\x14\x65\xa9\xfa\xa5\x9f\x22\xf1\x78\x70\x62\x5b\xd3\xd2\xbb\x6d\x9d\x78\x17\x57\x5d\x13\xe2\xfa\x97\x9b\xd7\x6f\x6e\x1f\x6e\x7e\xbc\x79\xf3\xf1\x64\x77\x69\x54\x3b\x9a\xb6\x91\xe6\x93\x5f\x5b\x6d\x20\xd4\xe4\xf7\xcf\x3e\x5d\x7d\x84\x9a\xeb\x98\xe2\x44\x6e\x50\xc5\x08\xfb\x5c\x50\x28\xf5\x50\xea\x60\x9d\x29\x14\x5b\x71\x59\x6a\x12\xc2\x9b\x1a\x78\x8d\x70\x2f\x87\x63\xd3\x3d\x0d\xe0\xc6\xa0\x62\x1d\x6a\x18\xa1\x41\x6e\x3d\x95\xa0\x5b\xd3\xea\x6f\x9f\x26\x8d\x86\xe9\xb2\x28\x64\xb6\x0a\x95\xff\x1a\x89\xd0\x6e\xde\x5c\x14\xa0\x8a\x46\x39\x31\x83\x26\x5e\x0a\x17\xc4\x9f\xba\xc8\x9c\xc6\x26\x11\xbd\x16\x86\x7e\x46\x43\x4c\xa8\x00\xcf\xb0\x4e\x68\x51\xd7\xfd\x4b\x65\x69\x17\xfd\xfb\xdf\x5f\x10\xce\x5e\x91\xdf\x37\x5e\x80\x27\xfc\x37\x1e\x66\x83\x9a\x5c\x0e\x06\x5b\x31\xa8\x5d\x10\x68\x04\x2f\xa8\x2b\xb6\xa0\x2a\xcd\xa0\x29\xcf\x9c\x3c\x2d\x99\x0f\x9b\x67\xf5\x46\xb9\xf2\x78\x68\x88\x52\x11\x21\x3b\x9d\x4f\xce\xce\x90\x6d\x24\x86\x1e\xcf\x1f\x95\x44\x36\x16\xec\xf6\x7b\x71\x31\xe5\x21\x35\x62\x1b\xe5\x46\x84\xa4\xf8\xf0\xc2\xc6\x25\x02\xad\xbe\x7c\x38\x4a\xc8\x95\x70\x41\x03\x58\x87\xea\x80\xc0\x24\x17\x89\xf8\x9e\x16\x7f\x62\xeb\x8f\x0c\xd9\x3d\xc3\x8d\x36\x72\x40\xe8\xf0\x91\x39\xce\x36\x7f\x1d\x40\xc7\x44\x24\x0c\x59\x03\x89\x0f\xb0\xda\x98\xff\x83\x0f\x07\x03\x79\x20\x43\xd6\xc5\x69\x8e\x81\x71\x11\xf1\x4d\xd7\x36\xa6\xbe\x3d\x0d\x3c\x12\x22\x89\x75\x86\xca\x95\xe5\xf4\xec\xe9\xf2\x49\xaa\x47\x2e\x16\x13\xcb\xbd\x26\xbe\x44\x90\xab\x88\x74\xe9\xd2\xc4\xa3\x67\xe2\xda\xef\x5c\xa5\xa9\xcf\xcc\x29\x35\x9b\x97\x99\xf3\xba\xeb\x69\x23\xc5\x39\x2e\x32\x87\xf8\x14\x9a\x0b\x52\xf2\xf4\xdf\xb1\x4c\x26\x8c\xc1\xfb\x1b\x8a\x5a\x1e\xb4\xc7\xf7\x5e\xd4\x6f\x72\xdd\xea\x7c\x45\x63\x41\x2a\xc2\x8d\x06\x7a\x0f\xd1\x49\x5e\x2c\x18\x84\x94\x98\x3a\x11\x6e\xc4\xc6\xf6\x90\xc8\xf8\x1e\x32\x24\x64\x87\x84\x22\x3c\x87\xf0\xc1\xf3\x9a\x11\xba\x28\x91\xaa\xcd\x4f\xd4\x62\x49\xc8\x59\x6c\xf4\x1e\xb0\x87\xe9\xa2\xfd\xa7\xab\x14\x17\x05\xb7\x7a\xde\xd5\x8c\x6c\x00\x6c\x94\x77\x8f\x03\x09\x0e\x7b\x21\x53\xf0\x77\x5f\xb8\x3f\xbd\x1c\x78\x95\x24\xb2\x14\x06\xbe\x88\x83\x09\x76\x8f\xe9\x52\x6a\x73\x73\x77\x11\xfe\x2c\x64\x8a\x6e\x33\xe5\xc6\xd0\xfb\x24\xbe\x68\x52\x18\xed\x38\x80\x76\xe1\x24\xd7\x94\x25\x3a\x6e\xd7\x8e\x1f\x2d\x35\x41\x6f\x44\xae\xc9\x93\xe2\xc6\x30\x01\xe2\x2c\x53\xb9\x15\xc8\xe2\x79\x61\x33\x0f\xe3\x6c\xf5\x12\x1d\x5f\x14\xc6\x60\x8e\x38\x0f\x4b\x39\x08\xb5\x80\x0b\x8f\x57\x77\xd4\xaa\xbb\x3b\x1a\x15\xa1\x34\x58\x95\x64\xda\x28\x7a\xf5\x85\xd0\x32\x8c\x25\x56\xa8\x3c\x35\x63\x0c\x6e\xe0\x1f\x8f\xc8\x20\xab\x34\x4d\xb4\x67\xb9\x1e\xb5\x61\xc9\xc5\xc8\xd5\x6e\x6a\x97\x87\xe7\x1b\x71\xb8\xbc\xa5\x28\xc8\xcf\x1c\x80\x69\x52\x94\x17\x1e\xd8\x34\x67\xb9\x54\xeb\xea\x4f\x56\x2c\x59\xce\x14\xcd\x26\x3e\x34\x21\xee\xf0\x85\x69\xb9\x57\x54\x7f\xb9\x97\xb4\x26\xbe\xf9\x26\xbc\x21\x80\x78\x63\x40\x5d\x5a\xa1\xaa\x8e\xf0\x45\x38\x68\xb5\x43\xb8\xf0\xa9\xf6\x68\x93\x4c\x65\xa5\x72\xc2\x72\x75\x56\xa2\xcf\xb9\xd5\xdd\x7c\xe8\xc8\x45\xdd\xfd\xc0\x7e\xca\xc4\xca\x6a\x71\xe8\x22\x3e\x61\x0c\x66\x82\x29\x5f\x71\x1d\x97\x16\x41\xb6\x4b\x85\xdc\xc7\xe4\xc8\xd2\x14\xa5\xf1\x7e\xd3\x78\x99\xd0\x9b\xdb\x3e\x17\x52\x83\xdd\xa0\xb2\x29\x47\xf6\x32\xaf\x87\xbd\x57\x5e\x62\xbb\x95\x57\x0f\x0d\x45\x68\x98\xf1\x61\xa4\xf6\x31\xb0\xe1\x46\x7f\x20\x6c\x2e\x61\x3d\xdc\x35\xf4\x85\x68\x69\xd8\xcd\x11\x59\xd9\x81\x0c\xbd\x38\x34\x4b\x14\x33\xc7\xb7\x2e\x38\xb8\x84\xc7\xa8\x1d\x24\x88\xe2\xe7\x3a\xb2\x38\xa7\x1b\xbf\xb6\x71\x22\x48\x91\x6e\xe9\x83\xe9\x12\x82\x33\xa6\x4d\xe3\xb8\xf3\x8d\x3a\xb8\xf1\x3a\x35\x43\x5b\xa8\xc2\x18\x8d\x25\xa3\xb1\x64\xeb\x38\x99\xb1\xe4\x7e\x18\x6d\x8f\x96\x92\xa3\x3c\x12\x17\xf3\x80\xac\x35\x78\xa2\x40\x06\x26\x56\x38\x17\xc1\x56\x2f\x73\xd0\x42\x8c\x24\x85\x6f\x74\x16\xe9\x6a\xdb\xed\x64\x9b\x86\x8b\xa0\xf6\xe2\xb9\x3e\x06\x08\xa8\x55\x41\xab\x7c\xbb\x47\x94\x5c\x65\x19\xe1\xc2\x5d\x04\xf6\x15\x08\x98\xdd\x82\x5d\xcd\x72\x5c\xa1\x67\x5e\x63\xfa\x18\x27\xbb\x26\xda\x50\x68\x25\x3c\x25\x7f\x86\x8a\xed\x70\xf6\x9c\x5f\xc9\x22\x24\x2f\x33\xc3\x8b\x8c\x05\x44\x63\xb8\x5a\xdd\x4d\x8a\x6a\x2d\x13\x0e\xd5\xc7\xaa\x9a\xed\x10\x13\xe6\x91\x03\x2b\x32\xf4\x11\x43\x7e\x85\x62\x09\x4b\x99\x48\x98\x4f\x87\xa9\x77\x65\x06\xb5\xcb\xdf\x88\x55\xe5\xd2\x2b\x5d\x5f\x18\x0c\x5c\xbb\xde\x6a\x1e\xad\xb7\x7c\xc9\x80\x03\x7b\x04\xbc\xc3\xab\x13\x9f\x13\x21\x36\x7a\x41\x0d\x0e\x46\x65\xad\xc6\x50\x56\xac\xa0\x55\x79\xb1\x22\x84\xcc\x0d\x09\xab\x9a\x61\x6d\x48\x02\x49\xe9\x84\xde\xb7\x58\x71\x06\x5b\xfe\x37\xea\x72\xfa\xd5\xc5\x98\x13\x89\x30\xc3\xc4\x97\x81\x45\x0e\xe2\xc5\x96\x13\xf9\x77\x86\x8b\x29\x43\x44\x94\x68\xd1\xc1\x75\x9a\x1c\x56\x66\xa4\xd1\xb0\xb2\xae\xbd\x0c\x37\xad\x82\xee\x0d\xe8\xb5\x1a\x09\x9d\x7f\x5c\x65\x0d\xd1\x46\xf6\xf4\x4b\xc7\x0c\x39\xad\xeb\x10\xc6\x75\x1f\xf4\xc1\x91\x6b\x8d\x5c\xeb\xd7\xe6\x5a\x03\x14\xad\xaf\x9a\x65\x9d\x48\xcb\xe0\x52\xf0\xe8\xea\xcc\xe7\x55\x0c\xb0\xab\x9f\x05\x35\xc4\x18\xf9\x4f\x07\xec\x3f\x5d\xe3\x07\x25\x8d\x41\x85\x82\x82\xf0\x2b\x69\x4a\xa4\x20\x29\xd7\x8f\x5b\x1b\xbf\x31\x21\xd6\xda\xb0\x64\x69\x68\xf6\x38\x9d\x65\x72\xa1\x0b\x69\xa6\x89\xcc\x2f\xbf\x7d\xf1\xf2\xfb\xcb\x17\x7f\xb8\xf4\xaf\xb4\x27\x2b\x29\xca\x49\xa9\xe9\x82\xb9\x33\x96\x71\x51\x7e\x9e\x24\x50\x94\x55\x4f\x97\x26\xc7\x14\xc2\xda\x62\x5a\x91\xf4\x71\xb6\xb6\x67\xfb\x49\xaa\x14\xea\x36\x84\x09\x7c\x7b\xf9\xe2\x8f\xf6\x7f\xee\x4d\x3a\x59\xb2\xb4\xcc\x98\x9a\x24\x73\x3d\xa1\x22\x9d\x58\xbc\x20\x8a\xa7\xc5\x71\x41\x48\xf6\xc7\x1d\x9a\x90\xc4\xc4\x85\xf9\xee\x5b\xd4\x13\x8e\x84\xb8\x30\x6c\x81\x2b\x53\x6d\x27\xf3\x9a\x1a\xfa\x75\x4c\x28\xe2\xb8\x64\x7c\xce\x92\x75\x92\xc5\x9e\x82\xab\x04\x62\x14\xaa\x12\x58\xbe\xe7\x17\x04\xe2\xf9\x52\x04\x2e\x1d\x09\x73\x06\xac\x8e\xc5\x05\x51\x4c\x17\x52\x40\xe1\xc0\x46\x50\x6b\x35\x43\xa7\xd3\xa2\x2a\x84\x0d\x50\xd2\xe2\xa8\xaf\x90\xda\x40\xe6\xd1\x80\x52\x75\xe7\x77\xe1\x61\xab\x6a\x27\x34\xcb\x58\x4a\x78\x9e\xb3\xd4\x2a\xc5\xa8\x8e\x94\x76\xb8\xe6\xbc\x8d\xba\x8e\x00\xad\xea\x87\xef\xee\xf6\x25\x15\x29\xae\x11\x9a\x1d\x73\xca\x33\xdf\x57\xb9\x05\xd5\x30\x95\x73\x51\xd5\x0b\x57\x4c\xbb\xa4\x2b\xec\x4c\x93\x44\x2a\xa8\xbb\x60\x24\x58\xf2\x3c\x00\x52\xc8\x8c\x27\xeb\x29\xf9\x00\x17\x57\x4d\x41\x48\xb8\x5e\x7e\xa9\xa7\x0a\x1d\xab\x74\xd5\x7d\x89\x91\xa5\x94\x8f\x50\x57\x33\x03\xa9\x04\x09\x37\xbe\x6a\xaa\x7b\x7f\xe3\x9f\x93\x8a\x6a\x27\x76\x0e\xfa\xf2\x77\xf5\x57\xf0\x01\x4e\xae\x88\x17\x0c\xd9\xe7\xbe\xbe\x1a\xcd\xd1\x6e\x26\x27\x5c\x25\x7c\x70\xe5\x4b\x51\xc9\x87\x73\x99\x65\xf2\x29\xce\x88\x5c\xa7\x22\x36\x7a\x35\xbf\xf9\xcc\x92\xea\xef\xb8\x2c\x3d\x4b\x44\x2e\x0f\x56\x02\xbb\xc0\x3b\x0b\x86\xb9\x8b\x12\x99\xe7\x14\xdf\x4c\xc9\x8d\x76\xa2\xbb\x83\x10\x2a\x8f\x78\x80\x24\xe3\xa8\x1e\x82\xcd\x61\x15\xa5\xcf\x2c\x29\x8d\x25\x4a\xcd\x53\xd6\xa6\xfa\x8b\x01\x91\x4c\x5e\x08\x27\x29\x57\x90\xa5\xb4\xae\x02\xaa\xc3\x3c\x63\x4a\x46\xba\xa1\xa4\x34\xe4\xd9\xf9\xe5\xf9\xf3\x0d\x9b\xe9\xb9\x26\xf3\xaa\x44\x4d\xac\x9f\xe7\xa1\x31\x2b\xae\x89\xe6\x79\x91\xad\x01\x23\xe7\xae\x6b\x7b\xf4\x4c\xed\xd5\xa0\x4a\x11\xb0\x49\x89\x5e\xb2\x2c\x73\x9d\x03\x15\x0d\x15\x1f\x22\x81\x02\x0c\xe8\x26\xaf\x4a\x7f\x37\x3e\x3b\xff\xef\xf3\x0b\xc2\x4c\xf2\x9c\x3c\x49\x71\x1e\xeb\xf8\xb0\x9b\x04\xed\xde\x4a\xdd\x98\xe4\x5a\x96\xd0\xe8\xcd\x91\x45\x28\xc0\x1b\x09\x3a\x81\xfe\xb3\xa5\x6f\xa4\x49\x8d\x03\x6e\x4f\x28\x37\xf8\x6c\xc7\xe6\x90\x73\xf2\x02\x68\x3d\xf4\x95\xd0\x24\xe3\x2b\x76\xb9\x64\x34\x33\xcb\x75\x54\xb9\x50\x37\x84\x14\x93\xbf\x33\x25\x2d\xd4\x52\x78\x38\x71\xc4\x33\xa0\xb2\xde\x01\x6e\xb3\xf8\xea\x7a\x83\xbc\x3e\xf6\x4a\x7a\xcb\x90\x82\x07\xd9\xc8\x95\x7f\x78\xb8\x7b\xcb\x4c\x9b\x0d\x03\xcc\x10\xef\x14\xa3\xf9\x49\x52\x30\x65\xa5\xd9\x53\xf3\xe3\xa5\xd4\x11\x2b\x26\x1b\xab\x96\xda\xb8\xc6\x04\x4e\xb4\x14\x2c\xb1\xb4\x1f\xeb\x8d\x6d\x06\x6b\xfa\x20\x06\x72\x73\x37\x25\x7f\x91\x25\x14\xa9\xa0\xb3\xe8\x93\xf8\x44\x85\x37\x1a\x19\x72\x66\xa7\x79\x66\xb9\xa7\xdd\x8f\x9f\x18\x4d\x99\xd2\xc0\x52\x18\x45\xa7\x9e\xbb\x31\x90\x88\x1b\xef\x3d\xe4\xea\x2b\xb5\x91\x39\x59\xfa\x05\xf8\xd5\x45\x06\x89\x10\x6f\x9b\x02\x9a\x9c\x02\xdd\xba\xa4\x5b\x28\x5e\xe5\x98\x8c\x7f\xc3\x17\x60\x0a\x1b\x67\xc8\x61\xa9\x51\xf9\x9d\x46\xbb\xb5\x93\x26\x9a\x7c\x3b\x26\x97\x7f\x24\xdc\x72\xa1\xee\x49\x2c\x23\x1e\x1a\x1e\x43\x06\x06\x76\x90\x6d\xc6\x50\xbf\x26\x17\x11\x8c\xf4\x24\x77\xc7\x60\x3e\x4c\x62\x73\x40\x9b\x63\xff\x52\xb0\x9d\xd5\xbb\xe3\x80\xb5\x0c\x89\x3d\x20\x31\x1e\xfc\xf6\x43\x43\x56\x38\x28\x24\x8d\x0c\xbc\x31\x09\x29\xa2\x83\xd6\x37\x43\xd6\x8d\xf4\x05\xd7\x88\x74\xb2\xaa\x3d\x70\xb1\x12\x1f\x53\x2b\x7c\x25\x1d\x37\x06\x12\x42\x21\xb1\x96\x86\x30\xa8\x58\x7f\x88\x0a\xf5\x0b\xc5\x2b\x62\xcc\x5e\x9b\xcf\x0e\x89\xc1\xdd\x4c\x3a\x57\x44\x94\xf9\x8c\xd5\x1d\xbe\xa4\x8a\x15\x9e\x37\x36\xb8\x11\xc0\x71\xeb\x80\xe7\x65\x94\xb0\x43\x5c\x52\xb3\xd7\x6d\x14\x15\x0b\x46\x5e\xda\xf7\xfc\xf1\xfb\xef\xbf\xfb\x7e\xea\xa6\x3e\x0c\x26\x15\xe4\xe6\xea\xf6\xea\x97\xfb\x4f\xd7\x90\x62\x1c\x47\x53\x9f\x27\xb5\x75\x62\xc2\x85\x99\x48\x35\x71\xfb\xf0\x0a\x3a\x19\xc7\xa8\xed\xc9\x92\xc5\x5e\x01\x6d\x67\x04\x00\xb0\x58\xb1\x4a\x8b\xaf\xfc\x63\xa5\xad\x78\xc6\xe7\x65\x2c\x2b\xf9\xb5\x93\x93\xed\x51\xfd\x02\xa7\x2e\x9e\xf1\x4e\xe2\x08\x75\x48\xc4\x57\x52\xdc\xcb\xe4\x71\xb0\xf4\x7f\xfe\x70\x7d\xe7\x00\x34\x14\x00\x2a\xbc\x71\x25\x02\xa7\x5c\xac\x64\xb6\x72\x05\xd0\x1f\xae\xef\x60\xe1\x53\xf8\x17\x58\xb7\x40\xc5\x5e\x47\x79\xa0\xea\xae\x91\xce\xa7\x57\x35\x84\x81\x1c\x15\x9a\x41\x7b\x57\xfb\x86\x08\x98\xb5\xe9\xd8\xce\x0a\xef\xca\xfb\x55\x74\x94\xf3\x0f\xc1\x13\xb8\x55\x5d\x89\x3e\x3d\x17\xbb\xd4\x95\xb8\x38\xd2\xf1\xc6\xda\x18\xed\x1b\xcb\xdf\x54\xaa\x6a\x7c\x37\xde\x58\x7d\xe3\x68\x37\xd6\xd7\xc7\xa3\x23\x1f\x28\x14\xbb\x37\x72\x48\xcb\xd0\xf3\x3b\xf7\xe8\x76\x1f\x12\x99\xb1\x39\x3e\x98\x83\xee\x74\xf7\xa4\x25\xf3\xb5\xfb\xaf\xee\x6e\x22\x2d\x44\xb2\xe9\xd2\xf1\x01\xa9\xba\x4c\x96\xc1\x36\x28\x98\xd6\x97\xe0\x08\x2a\xb1\xd1\x55\xa0\x11\x87\x5e\xb5\x17\x16\x7b\x2c\x2f\x5c\xd9\xac\x2a\x53\xc8\x2e\x85\x09\x13\x11\xf3\xc1\x4c\xe2\xa2\x7a\xbd\xb7\x2c\xd4\xfd\x08\x68\x9d\x47\x87\xd0\x12\x68\x34\x4c\xf5\x92\x41\x23\x13\xf6\x99\xd7\x2d\xa4\xaa\x9a\x88\x01\xcd\xf8\x9b\x97\x6b\x52\x50\xad\x9d\xf1\xb7\xe1\xde\x73\xa0\xef\x64\x7a\x7e\xae\x07\x80\x5d\x28\x9a\x30\x52\x30\xc5\x65\x4a\x20\x55\x3c\x95\x4f\x82\xcc\xd8\x82\x0b\xed\x29\xc9\x55\x97\x76\x24\x87\x35\x54\x4a\xf9\xc8\x52\xd7\x28\x0e\xdc\x17\xe9\x94\x7c\x6c\x95\xaf\xf1\x09\x73\x89\x44\x2b\xaa\xb2\xe5\xd6\xec\xba\x2a\x21\x62\x17\x08\xad\xa4\x19\xda\x14\x57\x91\xbb\x0f\xe4\x76\x4b\xdd\x40\xa6\x43\x13\x96\x50\x01\x99\x9b\x9e\xcd\x5d\x3e\x4b\x24\xd8\x5d\x9e\x4d\x4b\x64\xf5\x77\x07\x52\x00\x34\x1c\xa0\xc9\x72\x58\x03\xc9\xd1\x15\xda\x19\xa3\x2b\x74\x74\x85\x8e\xae\xd0\xd1\x15\x3a\xba\x42\x31\xcf\x8c\xae\xd0\xbe\x31\xba\x42\x47\x57\xe8\xe8\x0a\xc5\x8c\xd1\x15\x4a\x46\x57\xe8\xe8\x0a\x6d\x8d\xd1\x15\x8a\x19\x5f\x85\x61\x79\x74\x85\x8e\xae\x50\x37\x46\x57\xe8\x96\x47\x46\x57\xe8\xe8\x0a\x45\x8d\xd1\x15\x8a\x7c\x76\x74\x85\xfe\x86\x6f\xac\xaf\x8f\x47\x9f\xaa\x85\x75\xf0\x1d\x42\x7f\x9c\xd8\xe4\xdd\x3b\xf0\x71\xf0\xc4\xbb\x12\xe5\xbc\x95\x69\xe8\x00\xa3\x32\x0c\xdb\x4e\x27\xd7\xed\xc2\x65\xc5\x05\x87\x61\xed\xac\x1c\x98\xb3\x18\xeb\x7d\x79\x92\xea\x31\x93\x34\xd5\x97\x85\x74\xff\x57\xfb\x5e\x1a\x4e\x17\xa7\x4b\x1f\x3b\x1f\x17\xef\x6d\x39\x89\xa7\x05\xe9\x65\x89\xbb\xde\xa3\x3c\x2c\xf1\x37\x65\xb4\x67\x05\xeb\x55\x89\xab\x4a\xd8\xeb\x51\x09\x3e\x92\x08\x98\x7b\xbd\x29\x0d\xff\x48\x94\x9c\xb5\xcf\x93\xd2\xf4\x8d\xc4\x00\xdd\xee\x45\xd9\xf0\x8b\x44\xf9\xfb\xb6\x78\x50\xb6\xf8\x44\x22\x40\x76\xbd\x27\xbb\xfd\x21\x11\x40\x37\x3d\x27\xbb\x7c\x21\x11\x40\x1b\x5e\x93\x3e\x3f\x48\x8c\xc3\x53\xa4\x87\xfa\x40\xa2\x4d\x9d\x83\x44\xa2\x58\x2b\x4e\xe4\x9d\xea\x03\x5f\x1e\x96\x8a\xe9\xa5\xcc\x90\x9c\xa3\xc5\x35\xde\x73\xc1\xf3\x32\xb7\xc7\x48\xdb\x63\xcf\x57\x55\x3c\x8d\xb6\x67\x15\xcb\x19\xab\xfb\xcd\x19\x6b\x2d\x38\x9e\x32\xc5\x52\x80\x66\x77\x1b\xd2\xd3\x97\x74\x15\xc1\xc3\xcb\x24\x61\x2c\xb5\x9c\xbb\xa9\xe4\x7e\x37\xad\x66\x5d\xb5\xe5\x79\x89\xdb\xf9\xd3\x57\x7e\x88\x72\x41\x9d\xc6\xfd\x14\xeb\x7a\x8a\xbf\xa8\xe2\xd4\x39\x94\xbb\x69\x48\x41\xeb\x3d\xae\xa6\xa6\xf3\x28\x02\xe2\x91\xdc\x4c\x03\x78\xc5\x20\xf7\x12\xca\xb5\x14\x19\x03\x71\x64\xb7\x52\x34\x9f\x45\xb8\x93\xbc\x7b\x28\x4a\xaf\x3a\xa2\x2b\x69\xa8\x1b\xe9\xe0\x32\xc9\xc7\x70\x1f\x0d\xd6\xec\x07\xb9\x8d\x8e\xef\x32\xfa\xa2\xe5\xd8\x23\xf1\x1b\xef\x22\x1a\xe4\x1e\x8a\x77\x0d\xc5\xb9\x85\x90\x2e\xa1\x68\x27\xcf\x80\xad\x8b\x33\x95\x45\x9a\xc9\x86\x9a\xc8\x06\x9a\xc7\x90\xce\x9c\x38\x5d\x0d\x63\x16\x23\xb3\x18\x92\xec\x37\x89\x39\x23\x57\x04\xc8\x81\xe6\xb0\x23\x99\xc2\x62\x1d\x37\xa7\x70\xda\x1c\xc9\x61\x13\x4d\x77\x71\x6c\x2f\xc2\x00\x18\xc9\xb8\xb8\xe0\x86\xd3\xec\x35\xcb\xe8\xfa\x9e\x25\x52\xa4\xc8\xbb\xb3\x53\xa5\xb2\x3a\x2d\xda\x01\xf1\x5a\xc5\x90\x70\xfc\x25\xf5\x65\xad\x59\x1a\x42\xda\x83\xbd\xcf\x8b\x04\xd0\xa8\xc7\xcd\x1c\x55\x31\xcc\x8d\x5f\xd7\x46\x47\xbe\x88\x92\xe3\x02\xc3\x87\x6f\xe4\x4f\xf2\x89\xc8\xb9\x61\x82\x3c\xe3\x22\xec\xe5\xf3\x86\xe2\x12\xab\x75\x56\x87\xca\xc2\x78\xf9\x22\x80\xec\x28\x8a\x48\xa8\x5f\x93\x3a\x09\x2a\xb0\xd6\xc7\xd6\xf0\x3d\xd8\x63\xa9\xf8\x1e\xdc\xbc\xcc\xdc\x81\x44\x1f\x41\x70\x93\x3a\x03\x41\x9b\x2f\xbe\xac\x2b\xfe\xbe\x8c\x98\x63\x75\x82\xa9\x48\x89\x4f\x25\xfa\x9a\xad\x05\x91\x4e\xeb\x08\x87\x75\xed\x86\x46\xa2\x6e\xaf\xb3\xba\xeb\x82\xc6\x9e\xa4\x5d\x8e\xea\x41\xee\xe7\x2f\x6a\xa7\x38\x9e\xcb\xf9\x28\xee\xe6\x51\x76\xc6\xb8\x95\x47\xd9\x39\x8c\xa3\xc8\xce\x5f\x8b\xf4\x68\x78\xce\x64\x69\x4e\x20\x38\x3e\x2d\x79\xb2\x8c\x30\x90\xf9\xfb\x8f\xe7\x4c\x13\x59\x76\x64\xf9\x97\x1e\x78\x75\xe1\x20\x81\x36\xae\xa5\x7f\x02\xe9\x31\x62\xef\x8f\x58\x8c\xfb\xd0\x52\xdc\x49\x51\x8e\x95\xb8\x91\x37\x2f\x4d\xff\x5a\x6a\x63\xaf\xfd\xdf\x5c\xf5\x6b\xc5\x68\xca\x4f\x12\x4b\xe2\x5b\x6f\x23\x96\x57\xcd\x61\xba\x35\xa8\x24\x97\x2b\x96\x42\x33\x89\x08\x98\x4c\xa4\x85\xe4\xc2\xe8\x6d\xb1\x28\x43\xaa\x63\xff\xda\x7a\xee\x18\x8b\x32\xc6\xa2\x8c\xb1\x28\x63\x2c\xca\x18\x8b\x72\x32\xb7\xd1\x18\x8b\xd2\x1c\x63\x2c\xca\x18\x8b\xb2\x6f\x8c\xb1\x28\x63\x2c\x0a\x76\x8c\xb1\x28\x6e\x8c\xb1\x28\xe8\x31\xc6\xa2\x8c\xb1\x28\xfb\x9e\x1b\x63\x51\x90\x63\x8c\x45\x19\x63\x51\xc6\x58\x94\x7f\x18\x6f\xc2\x18\x8b\x12\xc6\x18\x8b\x32\xc6\xa2\xb4\xc6\x18\x8b\xd2\x1a\x63\x2c\xca\x18\x8b\xb2\xfd\xb9\x31\x16\x05\x39\xc6\x58\x94\x31\x16\xe5\x1f\x4a\x7a\x8c\x8a\x0c\x70\xe5\xe4\x11\x5b\xde\xde\xee\x6b\x99\x17\xa5\x61\xe4\x63\x00\x50\x91\x32\x99\xad\x1b\x27\x1d\xb1\xbc\xc3\x2b\x42\x84\x88\x18\xa8\x05\x7e\xe9\xca\x90\x4f\x12\x37\xc3\x49\xb5\xc4\x49\x35\xab\xa3\xc7\x86\x64\x3c\xe7\x06\x79\x6c\x68\x1a\x3c\x94\x77\xd1\xb7\x6d\x34\x67\x6f\x6f\xda\x3b\x98\x66\xc3\xce\xeb\x3a\x9a\x7f\x06\xd1\x8d\xe6\xb2\x8c\xe9\x49\xed\xf1\x5b\x93\x90\xb3\x64\x7f\x1d\xdb\x47\xe2\x59\xa0\xb7\xca\x7f\xfd\xbb\xf8\xd1\x4f\xb4\xbb\x8f\x5e\x04\x3f\x7c\x1f\xc3\x49\x86\xf6\xea\xd5\xdb\xd0\x45\xb7\x65\xce\x8d\x15\x63\xe7\xb2\xd5\xb7\x1d\xfc\xfc\x4d\x29\xcd\x51\x23\x56\xce\x9d\x3b\xf7\x38\xb4\x59\xa8\xbc\xe7\x55\xe0\xc9\x05\x91\x66\xc9\xd4\x13\xd7\x11\x91\x18\x54\xd4\xe2\x33\xd0\xde\x24\x65\x73\x2e\x98\x37\x9b\x37\xe9\x38\xc2\xc5\xf4\x5b\xa0\xf6\x88\x1f\x5b\x85\x56\x71\xb3\xbe\x96\xc2\xb0\xcf\x08\x71\xb7\x1b\xb8\xe8\x1e\x27\xb2\x70\x25\xd2\x83\x6c\xee\xa3\x87\x54\x89\x11\xd5\x9e\xb8\x59\x46\xb3\x15\xd7\x76\xff\x32\x2c\x00\x30\xca\x3e\x9b\x4b\xc4\xfb\x70\x6f\x32\x54\x3f\xd6\xfb\xc9\x26\x56\x36\xa8\xb7\x6d\xe3\xbd\x47\x0f\x48\xb4\xec\xf6\x4e\xf1\x15\xcf\xd8\x82\xbd\xd1\x09\xcd\x80\xa6\x86\x48\x6f\x57\x3b\x60\xc1\xf1\x55\x32\xc3\x1e\xd3\xa7\x25\x83\x56\x20\xd4\xae\x05\x64\xff\x84\x0a\xb2\xa0\x5c\x90\xdc\xe2\xb4\x08\xaf\xb0\x84\x80\x96\xd2\xed\xa5\x55\x50\x65\xb5\x5c\x0f\x76\x4a\x1e\x96\x5c\x93\x99\x94\x99\x0f\x7c\xca\xd6\xb1\x73\xf5\x31\x83\x42\xfe\x22\xd8\xd3\x2f\x76\x66\x9a\xcc\x33\xba\xa8\xa2\x12\x35\x33\x5e\x75\x41\x42\xac\xe3\x22\xab\x69\xee\x42\x2c\xde\x50\x66\x75\x09\x42\xb3\x27\xba\xd6\x16\xbd\x1d\x55\x8a\x70\xfd\x8a\xbc\x7c\x8e\x3c\x47\x76\x50\x4d\xaa\xf9\xa4\xe4\xdb\xe7\x60\xa6\xbd\xbe\xba\xfb\xe5\xfe\x2f\xf7\xbf\x5c\xbd\x7e\x7f\x73\x1b\xc3\x70\xec\x0e\x30\xd4\x46\x26\xb4\xa0\x33\x9e\x71\xfc\x4d\xb9\xe1\xda\x6c\x82\x00\x8f\x59\x9a\x5e\xa6\x4a\x16\x80\x17\xe4\xf2\x55\x29\x04\x17\x8b\x1a\x83\xba\xad\x62\x58\xec\xfa\x5b\x0a\xeb\xfd\x60\xd0\xef\xa6\x35\xb9\x85\xa2\xc2\x38\x59\x78\x88\xe5\x5c\x95\xc2\x6a\x40\xa7\x0a\x2e\xa1\xe9\xd0\x08\xc8\xab\x34\x65\x69\x6b\xa9\x5f\x28\x4c\xe1\x3a\xbc\x72\x4d\x14\x2b\x14\xd3\x96\x19\xdc\x7d\xb8\xbf\xf9\xff\xa2\xbc\xdb\x6d\x0a\x5a\x17\xf1\x9e\xe4\x13\x87\xa7\x11\x62\x09\x7a\xe0\xee\x7c\xf4\x61\xd4\xe3\xfe\x9c\x6c\x7f\xa2\x1b\xdf\x05\x4e\x3b\x80\xe5\x7d\x2c\x45\x93\xd1\x8b\x06\x34\x92\xcb\x14\xdd\x12\xe9\xce\x5d\x46\x4c\x77\x60\xd4\x2c\x10\xfc\x70\xf6\x27\xc2\xf0\x88\x96\x62\x56\x4f\x58\xd1\x8c\xb9\x38\x30\x08\x31\xf6\xa6\xbe\x0d\x37\x2c\x12\xe2\x9c\x66\x1a\xb9\xae\xd8\xfb\xc7\x5e\xc9\xef\xad\x6a\x34\x60\x27\xaa\x67\x49\xca\x84\x34\x5e\xe3\xb2\x33\xb0\x9c\xdf\x7e\x8b\x5c\x1f\xe8\x66\x4d\x5f\x77\xeb\x76\xf0\xcd\xf3\xe2\xae\x1f\xae\x03\x9e\xef\xaa\x59\x3a\xa3\x5b\xa9\x99\x3e\xe4\xfa\xa9\xb5\x35\x3b\x53\xc5\x68\x0a\x29\x03\x05\x35\x4b\xe7\xfe\xc9\xa9\x7e\x64\xd8\xd8\x6f\x78\xcc\xcb\x6d\x5e\xc3\xd4\xbe\xdd\x9e\x9f\xf6\x83\xc5\xe7\x9c\x51\x53\xa2\x5b\x3a\x82\xbc\xe6\x9c\x65\x4c\xd0\x59\x86\x75\x22\x47\xf2\x0a\xbb\xf6\x0f\x22\x5b\x7f\x94\xd2\xfc\x58\x45\xc0\x0f\x20\xa4\x3f\x7b\xf9\xd8\x58\x2c\xd4\x67\xdb\x8a\x60\xe0\xbf\x49\x27\x16\xc5\xd8\x6d\xb2\x07\xae\x19\x90\x1f\x3c\xb4\x5c\x9f\xf2\x20\xa9\x52\x5c\xe9\xb7\x4a\x96\x43\xfa\x79\x5a\xfa\x7e\x7b\xf3\x1a\xf8\x45\xe9\x78\x05\x13\x46\xad\x21\x8f\x87\xc8\x79\x84\xa7\x74\x8b\xb4\xfd\xb3\xa5\xf8\x0e\xf5\xe2\xb5\x81\x52\x68\x66\xa6\xe4\x3d\x5d\x13\x9a\x69\x19\x54\x00\x2e\xc8\x1d\xb8\xe2\x9b\x7a\xf0\x94\x90\x1b\xec\x64\x3d\x90\x99\x34\x4b\xd2\x01\x03\xc7\x68\x13\x3a\xb6\x4d\x91\x45\x83\xb3\x6d\x57\x96\x10\xfb\xa6\xee\x4b\x0c\x7d\x44\x0b\x02\x85\x62\x09\x4b\x99\x48\x90\xd4\xd3\x30\x66\xff\xf1\x0f\x27\xf1\xe0\x02\xbd\xdd\x4a\x61\x0f\xdf\x00\x8a\xbb\x11\x29\x4f\xa8\xe3\xd9\xd4\x74\x28\x27\xa2\x16\xb6\x25\x57\x38\xa6\x42\x8a\x09\x1c\xbd\x52\x33\x05\x36\x32\xab\xa2\xb9\xb4\x9d\x3f\x95\x33\x96\xa1\xe3\xa1\x41\xd1\x5c\xd1\x8c\xa7\xd4\xb8\x2c\x20\x9e\xd3\x05\x23\xd4\x54\x44\x6c\x24\x61\x42\xe3\x19\xa2\x33\x92\x19\x92\x4a\x56\xa7\xd4\x50\x4d\x7e\xbe\x79\x4d\x5e\x90\x67\x76\xde\xcf\x81\xe8\xe6\x94\x63\x1b\xde\x19\xe9\x1c\xfd\x5d\xcd\x73\x1e\x5e\x04\x48\x80\xd3\x83\x35\x11\x2a\xc7\xa0\x2e\x88\x90\xae\x59\xae\xc7\x02\x97\xa2\x52\xbf\x7d\xa0\x4a\x44\x5c\x10\xfa\xe0\x46\xc4\xac\xff\xc3\x1e\xdc\x41\x6c\xff\x67\xcd\xd4\x40\xae\xff\xf3\xc9\xb8\x7e\x53\x7d\xb7\x67\xb2\xc6\x29\x7e\x8f\xdd\xc1\xcb\x99\xa1\x29\x35\xd4\xdf\x06\x75\x5a\x63\x83\xb4\xe2\x98\xfe\x1e\x02\xdc\x45\x5a\x68\xeb\xf5\x56\x02\xdc\x46\x5a\x78\x34\x6c\x25\xc0\xaf\xf0\x4e\xd0\xec\x1d\x17\xe5\x67\x17\x41\x32\xd4\x9c\x74\xff\x06\x80\x90\x24\x2c\x16\x38\x07\x2d\x8a\x0c\x8f\x33\x6f\x31\x6a\x84\x36\xdc\xb4\x48\xe7\xe2\x20\x01\x1c\x58\x21\xcd\x32\x69\x2f\x30\x2b\x21\x52\x91\xca\xbc\x3b\x71\xac\xac\x2c\x15\x61\x34\x59\x36\x27\x3b\x0a\x3b\x51\x84\x1d\x6f\x6a\xcb\xd8\x8a\x65\x03\xcd\x39\xef\xec\xb3\x56\x98\x0f\xfb\x0d\xc0\x48\x46\x67\x2c\xa6\x57\x2d\x88\x04\x8e\xaa\xf5\x26\xbd\x46\x5a\x4a\xa2\xcc\x2b\x4a\x66\x43\xa3\xc2\x3f\xca\x0c\x02\x36\x68\xb5\x78\x0b\xec\x37\xb4\x76\x78\x64\xd8\xda\x41\x0f\x6e\xad\x1d\x2c\x0d\xbf\x9d\xb5\x97\x68\x29\x81\x74\xd7\x6e\x05\x8c\xf6\xda\xe1\x46\xff\xad\xac\x3d\xd2\x3c\xf8\xc4\x45\x2a\x9f\xf4\x61\xd7\xd8\x9f\x1d\x90\xc0\x15\x13\xcb\x82\x5d\xb1\x98\xe8\xab\x8c\x66\x59\xcb\x1a\xb5\xed\x2e\xf3\x8e\x5c\xec\xa5\xa3\x64\xee\xac\x3c\x1b\x7c\xbf\x12\xf4\x4b\xed\x62\x0d\xc6\x1b\x66\xc8\x0d\xb3\xc8\x35\xbd\x56\xf6\x1d\x86\xd3\xec\xbe\xc0\xd6\x04\x21\x5d\x5a\x7a\xfb\xfe\xfe\xaa\x0d\xc8\x1e\xc4\xa7\x25\x53\x2c\x32\xc1\xd5\x42\x22\x34\xcd\xb9\xd6\xa0\xd0\xb1\xd9\x52\xca\x47\xf2\x2c\xf8\xd2\x17\xdc\x2c\xcb\x19\x54\xf3\x69\xc4\x50\x6a\xbe\xd0\x97\xfe\x44\x4c\xec\xaa\xe2\x4a\x55\x64\x5c\x34\xcc\x9d\x4c\x18\x1d\xe2\x56\x61\x3a\x49\xb5\xb2\x08\xa8\x96\x0c\x20\x04\xb6\xf2\xe4\x6d\x22\xe9\x36\x2e\x83\x11\xf2\x32\xbd\x19\xd4\xe5\x68\x5a\x6e\x97\x15\x4b\x3a\x71\xd7\xbb\x2b\x30\x12\x01\x11\x8c\xb2\x4b\x29\xa4\x0f\xbe\x73\x49\x83\xde\xdc\xe1\xac\xa2\x91\xfb\xe7\x39\x0a\xe0\xcd\xdb\x63\xc1\xd2\x7a\xd2\x4b\x63\x93\x8e\x6f\xa3\xb2\x79\x7b\x68\x19\xe2\x83\x5d\xe1\x96\x08\x4c\x34\xc3\x9f\x3b\x64\xe4\x88\xc3\xa9\x9c\x31\xf5\x3a\xfa\x76\xbe\xb5\x9f\x11\x70\x77\xef\xfc\xb6\xfd\x8c\xa1\xd8\x53\xef\x7c\x65\x59\x38\x60\xc3\xc1\xc2\xe0\x41\x58\x9e\x1d\x2e\x45\x67\x71\x88\x92\x1c\x3a\xb6\x89\x1d\x56\x87\x08\x90\xdd\xf0\x82\xb6\x8d\xa2\xb2\x3e\x44\x40\xc4\xd8\x29\x22\xeb\x32\xec\x50\xfc\x8e\x62\xaa\x20\x27\x31\x57\x10\xa4\xc9\x02\x4e\x5c\x2c\x87\xde\x7a\x36\xcd\x49\x8f\xe7\xc7\xe6\x31\x88\x99\xef\x97\xe1\xd0\xa7\x09\x30\x44\xfe\xb0\x90\x3d\x0e\x74\xbc\xdc\x44\xe7\x73\x2e\xb8\x59\x47\x46\x32\xda\x83\xd0\x16\x84\x0b\x99\x9e\x6b\xe2\xab\x0f\xfa\x90\x22\x6d\x14\xe5\x02\x11\xd5\x1a\x27\xe7\x09\x99\xb2\x2b\xf4\xbc\x37\xe6\xfe\xba\x0a\x14\xb6\x80\x2a\x0c\x34\xe6\x8e\xe6\xd4\x99\x4b\x68\x0c\x08\x38\x95\x50\x5b\x28\x36\x67\x4a\xb1\xf4\x75\x69\x09\xf4\xbe\x9a\xe8\xcd\x02\x0e\x9e\xfb\xf8\x0d\x94\x51\x43\x87\x3c\x92\x6d\x97\x46\x55\x3d\xd2\xa9\x23\xee\xc5\x71\x59\x4e\x01\x84\x45\x08\x30\x79\x8b\x65\x7f\xcc\x35\x35\x5c\xcf\xd7\x91\x62\x47\xb5\x43\xec\x33\x14\xbe\x84\xc8\xd9\xfa\xc6\x00\x59\x34\x48\x11\x58\xe5\xc6\x8e\x59\x09\xce\xa1\x9c\xae\x49\xb2\x94\x12\x2a\x99\x01\x49\xc0\x5c\x57\x5c\x66\xe0\x28\x93\x22\x66\xb2\x52\xb9\xd8\x4e\x7f\x55\x36\xa6\xec\xc2\x19\xaa\x17\xc4\xf0\x75\x4d\x72\xa9\x4d\x4d\x07\xa1\xe6\x9e\x14\x0c\xa2\x81\xe1\x8f\x05\x94\x39\x8b\xea\x66\xab\xcb\xdc\x4e\xf4\x89\xf1\xc5\xd2\xe8\x0b\xc2\xa7\x6c\x5a\x5b\x46\x87\x4c\x35\x67\xcc\x40\xee\x43\x40\x40\x83\x23\xf8\x38\x87\x9c\x61\x58\x42\x3d\x9e\x85\x30\xf0\x90\x94\x70\x51\xc5\xe4\x77\xcf\xc3\x81\x44\x05\x25\xee\xa6\xcf\x2f\xaa\x2c\x00\x6a\x31\x14\x77\xad\x71\xc3\x14\x35\x76\xb9\x66\xa9\x64\xb9\x70\x7b\xc3\x5c\x5c\xbd\x57\xc2\x06\x5c\xc0\xf6\xc6\xa5\x69\x6a\xe1\x9e\xb9\xed\x3a\x0b\x02\x94\xdd\x44\x8e\x35\x17\x10\x2f\xd4\xc1\xde\xe6\xd4\x24\xcb\x4a\x4d\x54\x8a\xe9\x42\x0a\x78\x07\x7c\xf3\xa6\xc6\xcc\xbf\x0c\x00\xff\x4c\x3f\xaf\x89\x73\xc9\x17\x4b\xa6\x0d\x4c\x96\x46\xab\xd0\x6d\xea\xff\x52\xc5\xa0\xae\x04\x61\x79\x61\xd6\x8d\x73\x17\x7d\x47\xb8\x61\x98\xca\x2b\x6c\xc3\xe1\x80\x2b\x5e\x3b\xfc\xf0\xdc\xa5\x70\x44\x81\x74\x44\x40\x5e\x90\x67\x70\x68\xb9\x39\x77\xde\xf8\x89\x2c\x9e\x4f\xc9\x15\x11\x65\xc5\xbf\xe3\x44\x33\xd2\x3c\xb2\xad\x89\x0b\x59\xcd\x1b\x5e\x1a\x05\x14\x24\x48\x2d\xeb\x39\x46\x3c\x3d\xb4\x00\x96\x5b\xbe\x15\x7b\x0f\xaa\x23\x75\xe5\x4e\x8b\x66\x19\x94\x14\x05\xa4\x5c\x10\xaa\xb5\x4c\xa0\x52\x47\x24\x6c\x52\x9f\x8a\xf6\xa1\x73\x5b\x1a\x87\xd6\xe1\xc8\xb1\xa3\x7b\xcc\xe3\x21\x6c\xa0\x2a\xe3\x1a\xf4\xc4\x16\xca\x06\x80\x25\xad\xeb\xc2\x72\x56\x0b\xf1\x5c\x3b\xe3\x77\x94\xc6\x19\x46\x34\x37\xa8\xc7\x5e\x7a\x68\x4c\x74\x10\x70\x77\x38\x1a\xf4\x65\xc5\x0f\xaf\x63\xc7\xdc\x14\xcd\x01\x4a\xa4\xbe\x20\x94\x3c\xb2\xf5\x85\xbb\x3e\x04\xb1\x94\x42\x87\xee\x87\xf7\x23\x28\x96\xd1\x10\xf3\xf9\xc8\xd6\x00\xda\xbd\x6d\xc8\x9e\x1c\x46\xbf\x6e\x3c\x32\xa4\x1a\xb0\x6d\x6c\x88\xc0\x40\x5f\x16\xe6\x60\x90\xa4\x8e\xad\xaa\xf6\xd4\x7b\x5f\x0e\x81\x29\x87\xe1\x97\x1c\x52\x84\xaf\x1e\x81\x74\x8e\x84\xe9\x8f\x21\x2c\x5e\x47\xd5\x36\xee\x8e\x47\xb6\x3e\xd7\x8e\x24\x2d\xff\x5a\xf2\x02\x1c\x37\x07\x40\xf4\xf9\x2b\x9e\xa2\xc9\x27\x9a\xf1\xb4\x5a\xfc\x21\xfb\x67\xa5\x9e\x1b\x71\x41\x6e\xa5\xb1\xff\x79\xf3\x99\x6b\x2b\x72\xbf\x96\x4c\xdf\x4a\x03\x7f\x0e\xdf\x60\x42\xde\x1a\x77\xca\xdf\x1d\x00\xe5\x08\x64\xe2\xf0\x76\x24\x22\xb9\x12\x2e\x17\x01\xea\x28\x1c\x32\xab\x7a\x66\x2e\x42\x11\x1c\x77\x07\xb1\x42\xe2\xb8\xf6\x8d\xb0\x0a\x9f\xdf\xd2\xca\x78\x77\x18\x99\xd8\x05\x87\xd2\x1d\x42\x8a\x09\xc8\xa0\x87\x90\x46\x67\xc5\x76\xde\x8e\xfa\x0e\x80\x29\x55\x8b\x72\x4f\xb2\x78\xb7\x70\xbc\x2b\x74\xdb\xe8\x2e\xfc\xad\xb1\x53\x7f\x87\x76\x82\xee\x82\xe9\x96\xda\x9c\xf0\x92\xae\x62\x6b\x8b\x36\x07\x25\x9a\x8b\x45\x56\xa9\x8a\x17\x2e\x6d\xe1\x00\x88\xc1\xa1\xcc\x85\x61\xaa\x50\xcc\x97\x40\x8f\xaa\x06\xd3\x1d\x3e\x26\xcd\x7b\xec\xdc\xea\x21\x83\xa1\xc8\x68\x32\x40\x12\xae\x47\x0a\xaa\xbc\x45\x83\x51\xd4\xb0\x05\x4f\x48\xce\x54\x94\x1f\xa0\x3b\x0a\x2b\xdd\x0e\x3f\x38\x07\x88\x8b\x6e\x1c\x81\x9d\x0e\x49\x99\x6b\x8f\x21\x85\x68\xeb\x31\x19\x2c\x08\x4d\x0e\xe3\xb0\x83\x0a\xd5\x76\x1f\x1f\x86\x35\x50\x8a\x7e\xe4\x2c\xc3\x96\xfe\x69\x8f\x2f\xad\x0f\x81\x7d\x68\xd4\x87\x7a\xc6\xa8\x0f\x21\xc7\xa8\x0f\xe1\xc6\xa8\x0f\x8d\xfa\x10\x62\x8c\xfa\xd0\xa8\x0f\x0d\x87\x3a\xea\x43\xa3\x3e\x34\xea\x43\x5b\x80\x8c\xfa\xd0\x90\xc7\x87\x60\x6d\xf0\x8b\x9d\x37\xeb\x20\xc7\xdb\x9f\x9d\x8f\xb3\xf6\xb4\x81\xe7\x6c\x98\x42\xe7\x3c\xf2\x5d\x97\x9b\x55\x5c\xee\xbd\x4c\xfa\xc0\x54\x1e\xcf\x06\xdb\x25\x78\x27\x2f\x5f\xbc\x88\x3d\x61\xf1\x05\x50\xeb\x31\xac\x28\xf2\xd0\xf6\x34\xb5\x3f\x35\xea\x31\x47\x09\x31\x11\x04\x5f\xa6\x4b\xcd\xae\x28\x92\xa3\x46\x55\x79\x61\xa3\x0a\x37\x19\x18\x04\xb3\x23\xdc\x09\xa4\x68\x21\x0d\xc9\x99\x21\xd4\x0c\x8b\x4f\x30\x3c\x67\x55\x10\x9f\xbb\x26\x7d\x09\xda\x10\xcb\x95\x12\x29\xa2\x82\xc0\x42\x0c\xc8\x74\xef\xfa\x07\x05\xb9\xb6\xd7\x9f\x30\xaa\x43\x83\x80\x80\x03\x99\xdb\x95\xf0\x28\xeb\x83\xbf\x6e\x2d\x02\x58\xd8\x71\xf2\x8c\x4d\x17\x53\x92\x96\xf0\x02\x2a\x7c\x45\xde\xe7\x31\x4c\x02\x94\x5e\x28\x48\x02\x71\x66\x52\xc1\x7f\x2c\x7a\x8d\x5a\x43\x3d\x83\x15\x13\xa6\x8c\x28\x33\x64\x07\x5b\xf1\xc4\x54\x3b\x06\x59\x45\xdc\xb8\x78\x46\x3c\xf7\x19\x66\x68\xe8\x72\xcc\x48\x89\xa0\xa3\xf4\x86\xd2\xaa\x6d\x3b\x59\x24\x13\x6c\x05\x66\xf8\x30\x3b\xf8\x27\x9c\x8e\x0f\x1f\x63\x22\x86\xc8\x50\x41\xa7\x6b\x11\x2b\xb3\xcc\xee\xb6\x0b\x20\x3a\xcc\xf8\xb7\x23\x08\xc7\x2d\x74\x20\x3f\x71\xc3\xc5\xe8\xb9\x88\xac\xab\xdb\xd7\x2c\x75\x30\x1f\x64\x21\x33\xb9\x58\x37\xf7\x39\x7e\xd6\x90\xb7\x19\x2a\xca\x82\x41\xaf\x9c\x79\x6b\x82\xa5\xdc\xdb\x0e\x21\x8d\x71\x2f\x7e\x8c\x71\x2f\xa3\x9d\x17\x35\x46\x3b\x6f\xef\xb3\xa3\x9d\x17\x3b\x46\x3b\xef\x68\xe7\x45\x8e\xd1\xce\x3b\xda\x79\x47\x3b\xef\x68\xe7\xdd\x35\x46\x3b\xef\x6f\xd0\xce\x3b\xc6\xbd\x60\xc6\xa8\x0f\x91\x51\x1f\xc2\x8f\x51\x1f\xda\x32\x46\x7d\x68\xd4\x87\x7a\xc7\xa8\x0f\x8d\xfa\xd0\xa8\x0f\x8d\xfa\xd0\xa8\x0f\xb5\x80\x8c\xfa\xd0\x90\xc7\xbf\x68\xdc\xcb\x90\x57\xc6\x6f\xce\x64\xd3\x11\x1b\x19\x29\x11\xb1\xb4\xd8\x36\x3f\x32\x3d\x4a\x79\x9e\x42\xa6\x07\x57\xe7\x71\x2e\xfc\x44\x4e\x7c\xd5\x68\x08\x1d\xb0\x80\x7d\xdc\x8e\xa6\xb9\x8b\x54\xc0\x5e\x04\x7f\x97\x82\xb9\x3a\x21\x96\x89\x42\xac\x01\x34\xdb\xb4\x40\x9f\xe9\xe7\xc8\xba\x06\x63\x0d\xa0\xb1\x06\xd0\x58\x03\x08\x0f\x72\xac\x01\x74\xaa\x1a\x40\x4b\xaa\xdd\x29\x75\x5d\xb2\x76\x96\x04\x8a\x80\xdd\xe0\xff\xf6\x62\xfa\x97\xbd\x15\x81\x22\x29\xd5\xd7\x0e\xfa\x95\x2a\x02\xd9\xc3\xeb\x0f\x8a\xdd\xc5\x06\x89\x3b\xbc\xc5\x09\xbe\x2e\xbc\x95\xa5\x77\x6d\x7c\x79\xcb\x26\x2c\x95\xa6\x69\x24\xd0\x82\xa9\x89\x3b\xb4\x92\xcc\xb9\x48\xb7\x60\x2b\xec\x45\xcc\x96\x0e\xad\xc0\xd3\x5e\xda\x41\x41\x55\xcd\x68\xb1\xa6\x68\x30\x28\x9e\xea\xa2\x1b\x55\x7c\x10\xc5\xbb\xf1\xe5\xeb\xf7\x80\x8d\x32\x08\x81\xc7\x30\xda\x83\xcd\xf3\x6f\x25\x53\x6b\x22\x57\x51\x11\xc5\xf5\xa0\xc1\x76\x56\xb5\xef\xbe\x70\xd2\x16\xd7\x24\xa1\x7a\x98\x26\x67\x59\xd4\x10\x15\xee\x50\xab\xf2\x31\x22\xc5\x48\x17\xd1\x5d\xa0\xc3\x55\x53\x4d\x68\xe5\x69\x71\x9b\x77\x90\xab\x85\x74\xdc\x2d\x47\x08\x31\x0c\xa3\x0e\x31\x1c\xea\x1b\x39\x4c\x0d\xdf\x4a\xe9\x07\x23\xab\x85\xae\xb6\xfb\xe6\x50\xb7\x41\x70\xfc\xd4\x2e\x9c\xc3\xec\xe3\x1b\xce\x9f\x58\xb1\xae\x3b\x8e\xed\x00\x22\x47\x71\x02\x91\x43\x1d\x41\xa4\x4b\x2c\x76\x6d\xd1\xa5\xd2\xb7\x8d\xca\xa3\xb4\xe9\x17\x3a\x10\x72\xdd\xdb\xe3\x10\xfb\xf0\x91\x2c\x55\xc7\xf0\x11\x91\xee\x26\x1c\xc1\x4c\x4f\x80\x66\x6b\x77\xd3\x16\xa7\xd1\x81\xd0\x8d\xac\x2f\xbf\x43\x4f\x82\x1b\x1d\xb7\x93\xe5\xa2\x07\x42\xdc\x70\x3d\xd9\x73\x7b\x20\xcc\x63\xf9\xae\x8e\x46\x80\x87\x7a\x9f\x48\x97\xfc\xbc\x99\x3f\x4a\x69\xdb\x36\xe8\x86\x27\xeb\x48\x84\xb2\xc5\xb7\x73\x73\x88\x81\x9f\x38\x33\xc6\x31\x3d\x5a\xe4\x34\x5e\x2d\x72\x22\xcf\x16\xd9\xe1\xdd\x3a\x10\xe4\xa6\xc3\x08\xdd\x44\x71\xd7\xf0\xfe\xb1\x96\x2b\xe6\x70\x3e\x09\x8e\x9c\x2d\xee\x98\x03\x21\x83\x33\xe7\x50\x97\x0c\x39\x86\x5b\x86\x1c\x8f\xdf\x1c\xee\x9e\x21\x07\xbb\x68\xc8\x41\x6e\x1a\x72\xb8\xab\x86\x1c\xee\xae\x21\x47\xc0\x24\x28\x57\xef\x20\x59\x66\x28\x22\x69\x9a\x72\xcb\xf7\x69\x76\x77\x04\x79\xf4\x08\x34\xb6\xa9\x3d\xba\x05\x1e\x72\xd0\x29\xc9\x69\x61\xef\xa1\xff\xb2\xca\x01\xb0\xa5\xff\x21\x05\xe5\xea\x80\xbb\xe8\x2a\x38\xaf\x9b\x30\x9d\xa7\x65\x30\xcc\xe6\x72\xed\x8c\xb9\x26\xf6\x9c\xac\x68\x36\x3c\xce\x8e\xf8\x84\x4e\x6f\x92\xb5\x58\xe8\xea\xe4\xc3\x03\x03\x9e\x96\x52\x3b\x8d\xa8\xea\x9d\x72\xf6\xc8\xd6\x67\xc3\x21\x76\xef\xb6\xb3\x1b\x71\x76\x71\x90\xdc\xb6\x11\xba\x70\x60\x98\xa1\xef\xbb\x75\x06\x30\xcf\xbe\x26\xb3\xc1\x51\x1c\xc8\x03\x1f\x17\x34\x67\xba\xa0\xc9\x30\xee\xd1\x3a\xf4\x35\xa8\xca\xeb\x35\x0c\xa9\xce\xcc\xdf\x00\x67\x42\xac\xe3\xfd\x21\xba\x68\xa3\xbb\xe4\xb3\xaa\xd0\xfd\xc2\x52\x94\x79\x1e\xd3\x3c\xa0\x1e\xed\x0c\x5a\x30\x72\xe5\x8c\x0a\x4d\xce\x22\x9d\x27\xf5\x70\x3d\x6a\xaa\xb5\x9f\x0d\x00\x72\x80\xd4\x71\xe0\x3d\x70\xc8\xbd\x68\x7c\x42\xef\x9f\x86\x19\x46\x3a\x3e\x10\xef\x41\xd7\x4b\x59\x66\xe9\x50\xf1\xb5\x72\xc9\xa7\xe4\x59\xb0\xe4\x3f\xb7\xfb\x2d\xa4\x69\x7c\x39\x08\xf6\x33\x2a\x0c\x9f\xd4\x50\x2b\xfb\x7e\x21\xd3\x61\x94\xd3\x2a\x21\xd2\x3a\x2d\x84\x0f\x53\xb3\xc0\xfa\x53\xf9\xaf\xeb\xf3\x78\xe1\x7a\x4c\x1e\x8a\x53\xae\x49\xca\xe6\x5c\xb8\x58\x2f\x55\x0a\x31\x54\xfa\x90\x22\xb8\xc4\xdd\xc5\xe6\xda\x93\x79\xb7\x57\x6c\x27\xda\x7a\xc0\x9e\x80\x2d\xac\xa6\xcd\x86\xf7\x71\xa0\x65\x52\xce\x09\x15\x3e\xdf\x5e\x0a\xcf\xec\xec\x27\x6e\xbe\x83\x60\x3a\x1b\x1d\x4b\x9d\x9b\x94\x57\xd8\x9c\x92\x37\x96\x35\x0d\xdb\xfd\xc6\xa2\xb9\x06\x9a\xa7\x59\x26\x9f\x86\xdd\x73\x07\x70\x96\xa1\x3a\xc7\xa4\xb9\x84\x2f\x15\x5a\x75\x84\x92\x42\x4f\x27\x2f\x29\xd4\x71\x79\x8e\x15\x85\x76\x8f\x49\x17\x59\x51\xcf\x8e\x65\x85\xc6\xb2\x42\xff\x00\x65\x85\xec\x97\x11\x10\x9d\x13\x29\x54\x22\xda\x5d\x5f\x28\x06\xab\xdd\x4a\x44\x3b\xea\x0b\x45\x80\x74\x9b\xf4\xe7\x25\x03\x5e\xa6\x18\x10\x54\x5e\x66\x86\x17\x75\x68\x7b\x94\x8e\x0d\xd2\x06\xf8\x2b\x7c\x52\xa1\xee\xf0\x5d\xbb\x02\x1a\x15\x28\xdf\x61\x3e\x30\x47\x08\x92\xd7\x70\xdf\xfb\x50\x38\x9a\x45\xb5\xda\x87\xba\x43\xc1\xc0\xed\x62\x1d\xf9\x97\x0b\x50\x7a\x0d\x32\x9f\xae\xdd\x50\x20\xb3\x3c\xb3\xe2\x65\x54\x81\x29\x8b\x6f\x2b\xec\xed\x91\x7b\x9d\xdf\x2c\x32\xd7\xc1\x87\xab\x2d\xf8\x8a\x89\x5a\xe8\x7d\xa6\x9f\x3f\x0f\x3e\x51\xa7\x5c\x44\x01\xad\x14\x91\xbd\x4a\x45\x14\xc8\x16\xa0\x4d\x65\x62\x88\x90\xde\x27\x9c\x83\xa0\x1d\x05\x71\xaf\x50\x5e\x09\xd8\x51\x20\xff\xb5\x21\xd5\xfd\x5b\x4b\x1c\x6f\x8a\xd6\x51\x20\x6b\x31\x1c\x98\x49\x08\x09\x6d\x90\x27\x1f\xa2\xa0\x0c\x8d\x14\x38\x28\x64\xaa\x27\x5c\xca\x1d\xbb\x68\x81\x6f\x77\xa8\xd4\xa0\xb0\xa7\xaf\xaa\x30\x56\x17\xe0\x50\x8b\xf5\xae\x30\xa7\x76\xb8\xd2\x20\xd0\x5d\x5b\xe5\x61\x36\xc7\xe3\x25\x97\x1f\x25\x44\x69\x67\x78\xd2\x21\xd1\x3f\x9b\xa1\x49\x55\x80\xd1\x50\x8f\x4b\x27\x2c\xa9\x19\x5c\x34\x10\xe4\x3f\x5a\x4e\x7a\x1d\x86\x74\x80\xd5\xa5\x9a\xd4\x98\x9a\xbe\x6d\x6c\x0d\x39\x6a\x04\x0d\x1d\x80\x9b\x6d\xe1\x46\x71\x49\x35\x9b\x10\xbf\x6c\x8e\xfa\x81\x81\x42\xc7\x09\x12\xfa\xda\x52\xd3\xab\xc0\xa0\xc3\xf2\x69\x8f\x1f\x14\xb4\x35\x20\x88\x1c\x14\x40\xb7\x11\x0c\x74\x60\xbc\x03\xd9\x12\x08\xe4\xe7\x7d\x00\xcc\xcd\x20\xa0\x8d\x30\x9e\x43\x58\xdc\xd6\x9c\xef\x83\x42\x78\xb6\x85\xef\x8c\x99\xd4\x5b\xc7\x98\x49\xfd\x1b\xcc\xa4\x3e\x38\x24\xe7\x78\xe1\x38\x07\xd2\xcf\x9e\x30\x1c\x17\x4e\x33\xd4\x67\xb5\x19\x82\x53\x85\xd2\x0c\x02\xb9\x19\x7e\xd3\x9c\xee\x40\x0f\x68\x27\xf4\xa6\x1d\x42\x33\x74\xe5\x1b\x61\x37\x75\xf8\xcc\x20\x90\x9d\x90\x9b\xee\x1d\x38\x08\x66\x15\x6e\x73\xe4\xb0\x99\x13\x84\xcc\x1c\xa4\xba\x1e\xc0\x21\x06\x3f\x3a\x3c\x44\xa6\x37\x3c\x66\x60\xe1\x94\x7d\xa1\x31\x83\x75\xa4\xad\x61\x31\xed\x10\x97\x68\x98\xdd\x90\x98\x43\xc3\x5b\x06\xde\xce\x07\xf0\xd4\xa1\x77\xca\x01\xe1\x2c\x3d\xa1\x2c\x87\x44\x9e\xec\x0b\x63\xe9\x5a\x91\xa3\x81\xb7\x42\x58\xf6\x98\xe5\x87\x7a\x9b\x8f\x19\x8a\x82\xb0\x74\x47\xc3\xec\x09\x41\x19\xe6\xc5\xdf\x17\x7e\xe2\xed\xdd\xf1\xec\x63\x47\xe8\x49\x15\x46\x12\x0d\x71\x7b\xd8\xc9\x01\xf1\x17\xe4\xc0\x90\x93\x81\x27\x7e\x58\x84\xc0\xb0\x65\x7e\x11\x57\xff\x80\xb2\x38\xc2\xf0\xe3\x95\xc6\x69\x72\x94\xc3\xea\xe3\xd0\x95\xe4\x29\x29\x4a\xe3\x8b\x56\x6c\xd6\xc8\x41\x02\x85\x4a\x3a\x63\x8d\x1c\xcc\x38\x41\x8d\x9c\x16\x41\xec\x2d\x94\x13\x01\xd5\x95\xd4\x41\x16\xca\x89\x80\x2b\x05\x43\x15\xca\x89\x8a\x11\xa0\x06\x57\x28\x27\x02\x68\x28\xa9\x83\x28\x94\x13\x3b\xd5\xdf\x4e\xa1\x9c\x5d\x94\xd5\xad\x96\x13\x03\x13\x10\xda\x5b\x2d\x27\x86\xa2\xe6\xad\x10\xa6\x9d\xd5\x72\x62\x0e\x29\xd4\xd5\xc1\x54\xcb\x89\x00\xba\x37\x5e\xb0\x55\x2d\x27\x02\x68\xb7\xae\xce\x58\x2d\x07\x33\xc6\x6a\x39\xbd\x63\xac\x96\x53\x8d\xb1\x5a\x4e\xcf\x18\xab\xe5\x7c\x2d\x69\x6f\x63\xb5\x9c\xc3\xe2\x23\xc6\x6a\x39\xf8\x31\x56\xcb\x19\xab\xe5\x0c\x18\x63\xb5\x9c\xb1\x5a\xce\xfe\x31\x56\xcb\x19\xab\xe5\x8c\xd5\x72\xc6\x6a\x39\x5b\xc7\x58\x2d\x87\x8c\xd5\x72\xb6\x8e\xb1\x5a\xce\x58\x2d\x67\xac\x96\x33\x68\x8c\xd5\x72\xda\x63\xac\x96\x33\x56\xcb\x89\x1d\x63\xb5\x9c\xb1\x5a\xce\x58\x2d\x67\xac\x96\xd3\x18\x63\xb5\x9c\xb1\x5a\x4e\x6b\x8c\xd5\x72\xc2\xf8\xa2\xd5\x72\x5a\x61\x2c\xff\xac\x25\x73\x4e\x89\x84\x4e\xdd\x9c\x98\x70\xa0\x66\x85\x9d\x3d\x75\x73\x62\x82\x51\x1a\x15\x76\xf6\xd7\xcd\x89\x09\x32\xaa\x2a\xec\xf4\xd5\xcd\x89\x00\x1a\x2a\xec\x8c\x75\x73\xc6\xba\x39\xdb\xa1\x8e\x75\x73\xc6\xba\x39\x63\xdd\x9c\xf6\x18\xeb\xe6\xf4\x8f\xb1\x6e\xce\x10\x88\x63\xdd\x9c\xb1\x6e\xce\xf6\x49\x8d\x75\x73\xb6\x8d\xb1\x6e\x8e\x07\x3d\xd6\xcd\xd9\x3d\xc6\xba\x39\x63\xdd\x9c\xb1\x6e\xce\x90\x31\xd6\xcd\x19\xeb\xe6\x0c\x78\xf5\x58\x37\x27\x76\x8c\x75\x73\xc6\xba\x39\xf1\x0f\x8f\x75\x73\xc8\x58\x37\x27\x7e\x69\x63\xdd\x1c\x37\xc6\xba\x39\x7e\x8c\x75\x73\xc6\xba\x39\x5b\xc6\x3f\x77\xdd\x9c\x88\x1f\xd3\xd2\xc8\x5c\x96\xc2\xdc\x33\xb5\xe2\x09\xbb\x4a\x12\xfb\xd7\x83\x7c\x64\x88\xc0\x81\xb6\x15\x79\x0f\x28\xc2\x45\xca\x13\x64\xb5\x93\xa7\x25\x83\xca\x37\x94\x68\x07\x89\x50\x07\x8a\x18\x80\x55\x73\x50\x98\x3d\x35\x3c\xa1\x19\xca\xe5\x08\xd3\xc3\x10\xa1\xc3\xe0\x4c\xca\x8c\xf5\xda\x5a\x98\xa0\xb3\x8c\xf9\x45\xbf\xe3\xe2\x11\x71\xb1\xb5\x10\x77\xfe\x66\x03\x42\x8d\xaf\x80\x0d\xc4\xea\xb8\x70\x61\x39\x5c\x0a\x42\x67\xb2\x34\x01\x7f\xba\x81\x32\x2e\xfe\xea\x62\xcd\x38\x2e\x26\xc2\x5e\xf4\xe7\x9a\x30\xb1\xe2\x4a\x0a\xb0\xed\xaf\xa8\xe2\x76\xc2\xfa\xa2\x7d\x39\xe8\xb5\x30\xf4\x33\x02\xa6\x9c\x93\xd7\x32\x79\x64\x8a\x64\x76\xb1\x53\xf2\xa1\x70\x3a\x17\x38\x95\x69\x99\x19\x08\xf3\x35\xaa\x64\xd3\xf3\xa3\xee\x15\xcf\xe9\x82\xdd\x95\x59\x76\xcf\x12\xc5\x4c\xf4\x4e\xdd\x74\x9e\x77\xc6\x38\x22\xfd\xfc\x41\x4e\xc2\x21\x00\x4a\x65\x30\x91\xb8\x88\x66\x1d\xc0\xd5\xd5\xa3\xea\xcb\x11\x67\xba\x2d\x35\x83\xca\x3a\x45\x99\x41\x31\x9c\xc6\x75\x00\xab\xd6\xf6\x17\x75\xec\xc9\x9d\x4c\x3f\x96\xc2\xf0\x9c\xdd\x33\x28\x61\x85\xb2\x00\xde\xcc\xeb\xdb\x1b\x14\x1e\xcd\xaa\xb9\x43\xe8\xcd\x8c\x91\x82\x6a\xfb\x22\x23\x81\x88\x57\x3c\x2d\x29\xc6\x81\x60\xe7\xcd\x14\xe1\x79\xe1\xb4\x3c\x67\xb9\x86\x25\x99\x25\xcb\x2d\xbc\x52\xb3\x29\xf9\xd1\x0a\xb1\x9f\xa9\xfd\x19\xc6\xb8\xe6\x31\x0a\x1e\x4e\x39\x27\x29\xd0\xdd\x85\xd3\x87\x1c\x11\x5e\x4b\x31\xe7\x0b\x20\xa3\xb0\x16\x04\x5c\xab\xfd\x2c\x25\xc4\x5b\x4d\xc9\x7b\x09\xe1\x1c\x73\xf9\x8a\x2c\x8d\x29\xf4\xab\xcb\xcb\xc7\x72\xc6\x94\x60\x86\xe9\x29\x97\x97\xa9\x4c\xf4\x65\x22\x45\xc2\x0a\x03\xff\xb0\x9a\x1c\x53\xfa\xd2\x6d\xcd\xef\x1c\x52\xd7\x5c\x2c\x26\xf0\x89\x45\x86\x9f\xcb\x44\x8a\x09\x9d\xd8\x63\xd8\x3b\x2b\xb4\x54\xdd\x22\xea\x77\x32\xa1\xd9\x07\xb8\x2c\x3e\x06\xa2\xac\xdd\x6e\x4c\xc8\x72\x81\x13\x77\x9a\xfc\xc7\x48\x92\x31\x43\xd6\xb2\x24\x4e\x3e\x73\x11\x87\x01\x7e\x1a\x73\x5f\x72\xa1\x79\xca\xb6\x1c\x0c\x0c\xc5\xc6\xba\xd5\x2c\x70\xac\xd4\xd0\xe6\x0d\xb7\x76\x6e\xfe\xc4\xf9\x85\x9a\x26\x69\xa0\x65\x03\x0c\x09\xc9\x95\x65\xed\xec\xe9\xf2\x49\xaa\x47\x4b\x36\x56\x28\x9d\x38\xa4\xea\x4b\xc0\xd0\xe5\xef\xe0\x3f\xe8\xd7\x3e\x7c\x78\xfd\xe1\x15\xb9\x4a\x53\x5f\x78\xae\xd4\x6c\x5e\x66\xbe\x56\xd0\x94\xd0\x82\x7f\x62\x4a\x73\x29\xf0\x36\xed\x47\x2e\xd2\x0b\x52\xf2\xf4\xdf\xfb\x89\xd7\x8d\x48\x79\x6f\x80\x58\x84\x91\xb9\xac\x60\x7d\x8b\x22\x84\x16\x09\xdc\xfa\xc7\x9c\x8d\xce\x17\x13\x03\xf6\x1e\xea\xd6\x21\x13\x4b\x20\x78\x45\xb8\x64\x7f\xc7\x6e\x93\x3a\x20\x91\x1b\x27\x53\x7b\x37\x06\x36\x65\xb8\x2e\xbf\xa7\x2d\x8f\xad\xaa\x1f\x82\x0e\xe2\x75\x53\x78\x27\x68\x24\x50\x94\x10\xc3\x06\xb5\x2e\x73\x27\x00\x50\x28\x76\x37\xe7\x46\x93\x56\x41\x35\x7c\xc4\x44\xc4\xe6\xdb\xf9\xe1\x23\x6b\x86\x5a\x75\xa3\xa8\xb1\xc3\x0d\x1a\x13\xec\x44\x43\xf8\x3a\x68\x25\x4a\x54\x98\x31\x90\x83\xc2\x3d\x08\xdb\x04\x85\xb7\x4c\x9d\x37\x31\x25\xf7\x2d\xd8\x18\x49\xb8\xd4\xc6\x49\x6f\x1e\x86\x15\xf2\x32\x67\x61\xee\xbc\xaa\x19\x49\x8b\x91\x6d\x44\x4d\x41\x43\x6e\xc6\x39\x5f\x94\x0a\x2e\x91\x4b\xaa\x35\x5f\x08\x7b\xf7\x41\xc1\xb1\x4b\xac\x2c\x88\xe2\x07\x85\xe2\x52\xa1\x6a\x8a\x6e\x14\x68\x0b\x8f\x3a\xe3\xc0\x94\x7c\xa2\x8a\xcb\x52\x87\xe0\xd8\x44\xe6\x85\x14\x48\xbb\xaa\x15\xdb\x1a\xc1\xc0\xcd\x9a\x6a\xd5\x6b\xfc\xa5\x52\x48\x94\xfa\x0c\x91\xb0\x77\xe1\xd9\xab\x34\xe7\x60\xee\x26\xd7\x52\x18\x25\x9d\x90\xa5\xbd\xd6\x92\x5e\x10\x8e\xaa\xc3\xaa\x20\x62\x17\x64\x48\xa5\x5d\xec\xad\x66\x8d\xd2\xa7\x30\x7b\x67\x58\xa6\xe1\x8d\x08\xb8\x49\x3d\xa7\x42\x16\x65\x88\xc3\xa9\xd0\x01\x2f\x0a\x6b\xb9\xce\xa8\xd6\x96\xbf\x62\xb0\xf0\x10\xca\xfa\xa9\xda\x92\x7e\x51\x17\xfb\x53\x2d\x0c\xf7\x03\x8c\x4b\x78\x88\x49\x71\x28\xba\xab\x8b\x24\xc8\xb6\x48\x5e\xeb\x8d\x9e\x62\xce\x75\xc4\x2a\x09\x39\x73\x34\x0c\xe7\x6d\x92\x28\x0e\xba\xf5\x19\x38\x24\xc2\x57\x49\x56\x6a\xc3\x54\xfd\x2d\x52\x5a\x36\x4f\xd2\xcd\x94\x42\x89\xa2\x27\xa9\xaa\x9a\x90\x61\xd6\xcd\x62\x8c\x28\xaa\x84\x85\x81\xfd\x3d\xd8\x2c\xed\x46\x31\x45\x66\x2c\x68\xa5\xa1\xb6\x63\x0c\x16\xae\xac\xee\x04\x42\x90\x15\xa1\xaa\xd0\x81\x60\x5e\x9c\xad\x49\xa2\x98\xab\xbf\x49\xdb\xe4\x89\x61\x90\xc0\x9d\xc2\x8c\x2d\xa7\xb4\x24\x6d\xf7\x51\x48\xd3\x51\xaf\x90\xf1\xc9\x15\xa7\x08\x3a\x58\xea\xd4\x68\x22\x15\xf9\x3b\x53\xd2\xd7\xe3\x54\xcc\x49\x0e\x28\x0d\x01\x00\x1c\xf5\xce\x56\x8c\xa6\x5c\x30\xad\xdf\x5a\x02\x8d\x56\xbd\x5b\x74\x4e\xb3\xac\x86\x47\x16\xce\x52\xc2\x51\xe1\xf3\x33\x46\x98\x65\x07\x60\x34\x06\x8d\x59\xa6\x35\xac\x50\xfb\x11\xe2\x22\x68\xba\x26\x4f\x4b\x86\xe1\x64\x76\x42\x56\xf4\xa9\x75\x3b\x20\x7a\x07\xe3\xea\xf6\x35\xfc\x20\x91\xc2\x09\x22\x18\x3a\xa9\xcd\xe4\x21\x5f\xab\xb3\xde\x25\x5d\x31\xa2\x0d\x35\x25\xf8\x4a\x51\x5a\xb6\x91\xe4\xec\x41\x95\xec\x6c\xdb\xcd\xbc\xe0\x66\xfa\xf8\xbf\xe1\x5a\x66\x62\x49\x45\xe2\x04\xb7\xcb\x47\x56\xe8\x4b\xcd\x17\x13\xc1\x8c\xd5\x37\x2e\x5f\xbc\x78\xf1\xff\xc0\xb5\x0c\xcb\xfb\x5f\xdf\xfe\xf0\xbf\xbe\xfd\x61\x9a\x9f\x4c\x43\xbd\x93\xe9\xc7\x26\xed\xd4\xda\x69\x4b\xa9\xc4\x19\x52\x43\x72\x4b\xb5\x17\x27\x50\x22\x2b\xd8\x0f\xf6\x74\x0c\xd1\x26\xaf\x9b\x10\xdc\x12\xb5\x9b\x7b\xcc\xbc\xdd\xf0\xe4\xe3\x2e\x83\xea\x71\xe7\xd3\x03\x2e\x14\xac\x78\x51\xd6\x6b\xac\x25\x3f\x52\xa3\x8b\xb1\xdc\x4f\xda\x88\xfe\xf5\xf4\x45\xe5\x2c\x69\x43\xaf\xf0\xf3\x8f\x9d\xe7\x5b\x1b\xde\xfc\x12\x7f\xbd\xf8\x4d\x07\x29\xdc\x9d\x69\xb2\x50\xb2\x2c\x2e\xfc\x95\x1b\x93\x5b\x5f\x7a\x7b\x9e\x2a\x45\xa5\x2b\x4e\x89\xbb\xb1\x5a\xd3\xab\x14\x3f\x8c\x06\x52\xd7\x81\x86\x1b\x30\x25\x89\x05\xb1\x3d\x95\x4f\x95\x02\x69\x9e\x2c\x05\x44\xaa\x7a\x47\xb7\x83\x76\x96\xb1\x05\x4d\xd6\x67\xed\xb9\xe2\xaf\x0b\xbb\xfe\x80\x37\x67\xf0\xb5\x1a\x34\x4f\xb8\x71\x73\x76\xa7\x88\x0a\xb4\x73\x1d\x04\x09\x77\x0a\x41\x02\x28\xb5\x47\x44\xb8\xb7\x3d\x41\x91\x25\x15\x69\xc6\x14\x66\xed\x83\xf8\xb9\xd5\xaa\xfc\xbb\x26\xb0\x94\x69\x8e\x91\x37\xc0\x99\xed\x30\x41\xb3\x62\x49\xc9\x9c\x51\x53\x2a\x06\x72\xa2\x2b\x77\x0f\xb9\xc5\x9e\x08\xe7\xa5\xfd\x12\x6d\xca\x47\xf1\x8a\xca\x9c\x71\xb0\xc8\xdc\xa2\x37\x2b\x3b\x71\x5d\xa0\x6b\x6d\xcf\xd6\x8d\x7b\xba\x9a\xd3\x61\xd2\xdc\xe6\x44\xec\x6b\x02\x69\xd4\x2f\x39\x2a\x3a\x59\x52\x82\x10\x2b\x85\x61\x9f\x11\x19\xf0\x6d\x06\x76\xef\x1f\xf7\x9e\x90\x4a\xfb\x08\x6c\x46\x95\x98\xeb\xca\x1e\xa3\x68\x93\x41\x21\x33\x9e\xac\x2f\xc3\x02\x26\x89\x5b\xc1\xe5\xb0\x23\xb3\xe5\x4d\x86\xea\xc7\xda\x32\xc1\x40\xee\xa9\xa4\xbc\xcd\xf7\xf6\x53\x79\x9c\x34\x31\xd7\x6f\x2d\xdf\x1e\xd0\xfa\xe4\xec\xaa\xd2\xb7\x74\x59\x04\xb7\x4a\xe6\xee\x81\x98\x9c\x9c\x46\xe9\x1d\x2f\xc5\x06\x11\x97\x0b\x27\x4d\x4d\xc9\xbd\xcc\x19\x59\xc9\xac\x44\xf7\x3d\xb1\xd4\xa9\x5d\x5c\x00\x90\xcb\x9f\xca\x19\xcb\x18\xd8\x4b\x3d\xfb\x80\x80\xba\x27\xfb\x22\x7c\xe5\x54\xb0\x95\x50\xe3\xa7\xe2\xed\x57\x16\x88\x77\x7d\x01\x59\xbe\x22\xff\x21\xc8\x4b\xac\x04\xf3\xe0\xa6\x61\xb5\xbd\xb7\x37\xaf\xab\xe3\x69\x61\xfd\x78\x0f\x9b\x43\xbe\x75\xa6\x0f\xcd\xcc\x82\x63\xa3\x2e\x66\xce\x90\x6b\xaf\xab\x67\x82\x3d\x91\x39\xcf\x98\x76\x8a\x65\x2d\xf3\x47\x61\x34\xcc\xac\x5a\xae\x9f\xde\x73\xf2\x9d\x9b\x5f\xc1\x14\xde\x36\xe3\xe7\xe8\xf4\x98\x0f\x1f\xcf\x7d\x15\x7b\xf5\x34\x51\x4f\x93\xc9\x64\x62\x71\x18\x2e\xdc\x98\xba\x95\x61\x9f\xab\xfb\x3d\x97\x29\x77\x8d\x5b\xea\xdd\x86\x9b\xa4\x9e\x2e\xd6\x8b\xe1\x13\x47\x1d\xd6\xa6\xb8\xa8\xb4\x86\x69\xe7\x8f\x7f\x88\x08\xc6\xc0\x57\xb0\x50\xa5\xb8\x1a\x7c\x8a\xed\xbe\x59\xb2\xab\xe4\x2f\x46\x98\x30\x6a\xed\x92\xfe\xe5\x1c\x7b\xda\x96\xac\x3e\xb8\x96\x05\x25\xa0\xec\xfe\x6c\x25\x8f\x20\x6d\xf8\x2b\x06\x09\x91\xfb\xbd\x9f\x92\xf7\x74\x4d\x68\xa6\x9d\xa9\x98\x81\xec\x79\xdf\xbe\x4f\x40\x5a\x44\xc2\xf5\x10\x66\xd2\x2c\xbb\x60\x80\x2a\xee\x64\xda\xf9\x18\xeb\x90\xaa\x0c\x81\x6d\xdd\xba\xfb\x12\x43\x1f\xd1\x6e\xb3\x42\xb1\x84\xa5\xe0\x32\x9d\x87\x7c\xc2\x0a\xcd\x38\x06\xf3\x85\xe8\xef\x56\x8a\x8f\x52\x22\x6b\xdb\xb4\xc5\xa5\x86\x4d\xd1\x27\xf2\xd5\x94\x84\x74\x63\xf8\x69\x10\xaa\xc1\xdf\x20\x26\x4a\x4a\x90\x7b\x9d\xac\x64\x54\xb0\xce\x7a\xee\x10\xc3\xf1\x56\x34\xe3\x69\xb0\x1e\x82\xfb\x9c\xd0\x5a\x84\x36\x92\x30\xa1\x4b\x74\x6c\x61\x70\x64\xa5\x92\xb9\xc8\x35\x3f\xed\x9f\x6f\x5e\x93\x17\xe4\x99\x9d\xf7\x73\xa0\xc3\x39\xe5\xd8\xc4\x48\x23\x89\x36\x54\x75\x71\xc7\xe7\xe1\x45\xd3\x8a\x93\x62\x19\x9d\x22\x73\x9a\x69\x76\x61\x55\x30\x5d\x26\xcb\x80\x05\xab\x53\x54\x91\x18\x4c\x81\x39\x14\x1d\x75\x87\x3c\xc8\x11\x99\xe7\xbf\xc1\x83\x8c\x43\x56\x4c\xd4\x11\x09\x67\xf0\x67\xcd\x90\x19\xa3\x1b\x57\xc0\xcf\x27\xbb\x02\x9a\x21\x57\xf6\x40\xd6\x38\xc5\xef\xb1\x3b\x75\x39\x33\x34\xa5\x86\xfa\xab\x21\x80\x69\x5d\x10\x71\x97\xc0\x2e\xea\xdb\x45\x57\x58\x81\x76\x3b\xf5\x6d\xa3\x2b\x3c\x0e\xb6\x52\xdf\xb6\x0b\x02\x09\xf2\xab\xbb\x46\x34\x7b\xc7\x45\xf9\xd9\x05\xeb\x21\x2d\xa1\x1b\x74\x7c\xff\x06\x80\x90\x24\x60\x09\x98\x8d\xd3\x30\xb0\xc8\xde\xd0\x43\x02\xfb\x6c\x6b\xdb\xd5\xf7\xf8\xfb\x09\x6e\x0c\x60\x9f\x56\x2f\x01\x97\x14\x25\x8a\x8a\x54\xe6\xdd\x99\x23\x81\x56\xcd\xee\xea\xed\x44\xf3\xd9\x51\x60\xda\x01\x22\x36\x33\x2f\x63\x2b\x96\x0d\xac\x83\xf6\xce\x3e\x6b\x15\xb5\xb0\xff\x00\x2c\xba\x2e\x02\x2c\xb4\xa1\x48\xb7\x08\x14\x1f\x15\x3f\x20\x1e\x5e\xc9\x0c\xed\x83\xe8\x36\x44\x93\x99\x0f\x66\x0a\x8b\xb7\xc0\x7e\x43\x6b\x37\x11\xfe\x97\x2e\xb3\x5a\x17\x9d\xb5\x43\x84\xe8\x6f\x67\xed\x25\x5a\xd8\x20\xdd\xb5\x5b\x39\xa5\xbd\x76\x10\x0c\x7e\x2b\x6b\x8f\xcc\xc8\x68\x1a\xc7\x40\x4b\x1f\x72\xb7\x5d\x55\x45\x83\xc0\xbc\xa6\xc3\x95\x16\xd6\x3d\xe7\x0a\xad\x28\x79\xd1\x0c\x84\x3d\x2e\x3a\xd7\x07\x54\x6d\x0a\x01\x6d\xf8\xaa\x1e\x2d\xdc\xbb\xa0\x90\x9c\xaa\x35\x79\x7b\xf3\x7a\x4a\xba\xd7\x27\x12\xa6\x90\x61\xb1\x41\xe3\x80\x6e\x92\x2e\x5b\x77\x1d\xbb\xd5\x51\x39\x81\xf1\xd2\xce\x90\xc2\xa3\x71\x59\x3a\x7a\xad\x13\x83\x4d\x3b\x6f\x11\xcf\xbd\x7b\x92\x2c\x65\x96\x36\xca\x4f\x55\x81\xce\x58\xc1\xc8\xcf\xc0\x39\xec\x1a\x61\x7c\x53\x2b\x03\x78\x37\x55\x29\x2c\xbd\x4b\x85\x4f\x0f\x0b\x50\x9f\x79\x03\x6a\xad\x43\x78\x89\xe9\x39\xc9\xa1\xe6\x6d\x9c\x46\x9c\xd1\x52\x60\x2b\x3c\x44\xd1\xc6\x16\xd4\xfa\xd0\x1d\xd7\x93\x4b\x09\x96\x91\x82\x2a\x9a\x33\x13\x51\x81\xd6\x04\x71\x0d\x7f\x8a\xa3\x0b\x08\xc4\x44\x9f\x93\x8d\xf0\x63\x1f\x80\x4e\xc3\xab\xd7\x2e\xb5\x24\xbe\x82\x6d\x64\xbe\x1d\x88\x88\x83\xa7\xfd\x29\x64\x58\x7e\xe1\x79\xc7\xe6\x08\x4e\x60\x77\xd0\x3f\x06\xa4\x44\x71\xa6\x88\x94\x88\x38\xc6\xf4\xc4\x45\x2a\x9f\xf4\x61\x8a\xdb\x9f\x1d\x90\x3a\x20\xdd\xc7\x7f\xea\xd3\x28\x6f\xde\x91\x88\xb6\x03\x9a\x25\xf8\xa2\x9a\x57\x5c\x57\x4d\xf1\x97\x14\x5e\x7c\x4a\xa7\x3d\xe6\x86\xaf\x59\xbd\x3a\x95\x2e\xb5\xc8\x35\xbd\x56\xf6\x1d\x86\xd3\xec\xbe\x60\xc9\x40\x21\xf3\xed\xfb\xfb\xab\x36\x20\x2b\x72\x42\x1a\x78\x64\x59\x26\x0b\xa9\x0e\x3b\x26\x4f\x6c\xb6\x94\xf2\x91\x3c\x6b\xc4\x41\x2c\xcb\xd9\x34\x91\x79\xc3\xbf\x3b\xd1\x7c\xa1\x2f\xfd\xd1\x98\xd8\x55\xc5\x64\xca\x73\x91\xc1\x7d\x12\xee\x43\x08\x8e\xf6\x71\xda\x30\x9d\xa4\x5a\x59\x04\x54\x4b\x06\x3e\x18\xc6\xdf\xb5\x9b\x48\xba\xc5\x33\x21\x12\x8a\x94\xf8\x8a\x4f\x55\xc1\x12\x08\xda\x98\x38\x45\xd6\x92\x70\x54\xb1\x12\x48\x9d\xf3\xa9\x6f\x10\xff\xc0\xd4\x0a\x82\x95\xac\xb4\xef\xc2\xca\x23\xf7\xcf\xb3\x16\xc0\x5b\x88\x24\x99\x67\x34\xa2\x70\xf5\x00\xf6\xbf\x49\xc7\xb8\x48\x92\x30\x7a\x68\x39\xe4\x01\xc5\x61\x42\x34\x72\xc8\x3a\x64\xe4\x88\xc3\x67\x41\x46\x80\xec\xdb\xf9\xd6\x7e\x46\xc0\xdd\xbd\xf3\xdb\xf6\x33\x86\x62\x4f\xbd\xf3\x95\x29\xfe\x80\x0d\x07\x93\xbc\x07\x61\x79\x76\xb8\x1d\x9d\x89\x3e\x4a\x47\xee\x18\xf3\x77\x98\xe9\x23\x40\xb6\x72\xa8\x97\xac\x63\xd4\xaf\xcc\xf5\x11\x10\x31\x86\xfd\x48\x81\x8d\x8b\x2d\x17\x67\xdf\x7d\x1b\x01\xff\xf8\x26\x7e\x82\x33\xf3\x3b\x5e\x1b\xcb\xa1\xb7\x9e\x4d\x73\xd2\xe3\xf9\xb1\x79\x0c\x62\xe6\xfb\x65\x38\xf4\xa9\x2a\x5e\xe8\x56\x75\x8a\x21\xd1\xba\xf7\x1b\x10\x42\xb1\xdc\x06\xfb\x46\xac\xb1\x0d\xc7\xb3\xf6\xcd\x38\xdb\xa8\x0c\xe2\xc1\x71\x6c\xf5\xe7\x1e\x41\x13\x5f\x74\x03\x9d\x75\x87\xda\x5b\x23\x33\xe6\xb2\xfb\x62\x13\x40\xb6\x06\x6d\x9e\xeb\x26\xc4\x7e\x6a\x1c\x96\x7f\xf0\x10\x92\x21\xed\x9e\x3c\x54\xef\x83\x33\x6b\x0c\x45\x86\x8a\xba\x8e\x04\xee\x69\xa6\xc1\x42\x66\x71\x6f\xdc\xf9\x6c\x86\x43\x1b\xc5\x0b\x64\x35\xbe\x7f\xad\xaa\xef\x5d\xb0\xf9\x9c\x25\xe6\xdf\x48\xa9\x43\xea\x53\x55\x9d\x23\xaa\x98\xe3\xbf\x86\x5f\xff\xdb\x29\xf2\xeb\xdd\x2c\x07\x99\x72\xde\xc0\xa3\x9d\x14\x37\x87\x42\x07\x35\xc6\x94\x03\xb8\x09\xf5\x8d\x5c\x65\x33\x9f\x0e\x9b\x65\x2d\xa0\x11\x57\x2f\x64\x5e\xb6\x93\x94\xe4\x13\x4b\xeb\x32\x7e\x8c\xdc\x4a\xdf\xae\x07\x95\x5d\xed\xc6\x1d\x64\x03\xd4\x4f\xc2\xe5\x70\x2b\x5d\x83\x9f\x53\xe5\x61\x44\x95\x13\x6f\x6d\xd3\x9f\xea\xe2\xe1\x0e\x8f\xad\x12\xe0\xf5\x71\x45\xaf\xbf\xf6\x20\xec\xdf\xaf\x47\xb6\x8e\xd8\x2c\x5f\xb4\xd8\x97\x3a\xf7\xd9\x02\x55\xf9\xc6\x90\xf2\xe7\xaa\xfa\xe2\xfb\x4b\xba\x76\x0a\x32\x9f\x71\xe1\x78\x84\x9b\x6a\x20\x38\x98\x6d\x64\x9f\x73\xbb\xdb\xf6\xb1\x98\xe5\x45\x6f\x76\x6c\x3d\xf3\xd6\x8e\x7f\xd8\xac\x5e\xbe\xb5\x06\x79\xcc\xf9\xac\xe4\xb4\x8d\x5a\xe3\x70\x8e\x06\x94\x09\x7f\xf3\xb7\x92\x66\xed\x70\x17\xff\x91\x07\x36\xac\xef\xaf\x91\xe4\x89\x67\x69\x42\x95\x33\xb9\xfb\x4c\x63\xed\x0b\x29\xf8\x64\x33\x2a\x2a\xd6\x8f\xdf\xf8\x40\xd9\xda\x5b\x47\xa9\x32\x3c\x29\x33\xaa\x88\xe5\x7f\x0b\xa9\xd0\x6d\xed\xe3\xa5\xaf\xea\x98\xde\xb3\x44\x8a\x74\x98\xf1\xfd\xa1\x0b\xa5\x49\x21\x31\x9a\x71\xc1\x14\xf7\x0d\x5d\x20\xa6\xaf\xc5\x48\xc8\xb3\xa8\x8a\x0a\x6e\xcc\x40\x50\x73\x2c\xbe\x66\xa6\x17\x2e\xed\xf7\x89\xb7\xb2\xf2\xd1\x40\xb9\x26\xdc\xf5\x60\x7b\xde\xb8\xe9\x2b\x4e\x38\x25\x3f\x54\x79\x1c\x78\xf6\x1f\xea\x7d\x18\x02\x81\xd6\x7e\xad\x9e\xad\xb8\x77\xd4\xaf\x40\x43\x9d\x4b\xc5\x56\x4c\x91\x67\xa9\x04\xd8\xd0\x86\xeb\xf9\x94\xfc\xff\x4c\x49\x60\x39\x82\x2d\xe2\x7a\x2e\xf9\x5b\xae\x0a\x8f\xf7\x81\xec\x54\x93\x17\xe4\x99\xeb\xf2\xc5\xf3\x9c\xa5\x9c\x1a\x96\x45\x94\xa5\xf4\x96\x30\x97\x7d\x8e\x25\xf8\x2f\xe3\x1f\x8c\x72\x7c\x6c\x71\x7a\xb4\xae\x49\xa7\x95\x0e\xbc\x23\x2b\xf1\x51\x4e\xb7\x95\xe3\x77\x1c\x2e\x26\x4a\x9f\x04\x2d\xb9\xaa\x1c\x17\xae\xc8\xea\x80\xfc\xd5\xde\x91\x94\x28\xb6\xb0\x3c\x09\x0d\xd7\x71\xa1\x13\x71\xae\x93\x24\x78\xa2\x80\x22\x7e\x64\xa8\x5a\xb0\x3d\xb2\x6f\x9b\x77\xc2\x8f\xbd\x38\xe9\x8e\xc0\x8c\x26\x8f\x65\xe1\xc1\xec\x84\x82\x93\xc8\x0b\x6a\x96\x3d\x4c\xbd\x9d\x83\x6d\x7f\xdf\x9a\xcd\x9c\x67\xcc\x81\x01\xd7\x28\xcc\x6d\x2f\x3c\x94\xf2\x85\xde\x6f\xdc\xe6\x29\x36\x8f\x58\xe4\x47\x36\x6f\xa4\xde\xe2\x51\x4e\xa2\x14\xa1\xba\x92\x56\x3f\xeb\x88\x20\xff\x47\x2e\x10\xbe\xcc\x98\x1a\x4b\x28\xdb\x48\xe4\x86\xf5\x1e\x4d\xc5\x8a\x8c\x27\x34\x86\x36\xc3\x23\xae\xcc\x08\xa4\xd1\x6a\xae\x58\x4a\x44\x99\xcf\x98\x72\xe5\x16\xdd\x4f\x7a\x96\xe3\x6a\xfe\x82\xa9\xb3\x66\x7c\x96\x06\x58\x4a\xca\x62\xd3\x53\xe9\x2f\xf3\x3e\xb0\x46\xf6\x65\x9b\xe1\xeb\xcb\x60\x6f\x29\x2d\x68\xa1\x97\xd2\x20\x93\xd2\xb7\x46\x12\x58\x5c\x7e\x82\x5c\xaa\xfb\x26\xb4\x46\x25\xc9\xbe\xeb\xa4\xfd\xf4\xb6\xbc\x58\x5a\x67\xb6\xfa\x5f\xf5\x80\x4c\xaa\xec\xed\x90\x9b\xed\x13\x29\xb8\x26\x74\x45\x79\x46\x67\x19\x83\xcc\x26\xbc\x08\x07\x46\x56\x57\x24\x85\x9c\xa5\x8a\xaf\x98\x3a\xab\x0d\xb3\xda\x65\x25\x9e\xad\x5a\x8b\x31\x4c\x9d\xed\xdf\x54\xe4\xd1\x70\x60\xdf\xcb\x52\xf4\x15\x24\x6d\x8b\x10\x8d\xc7\x1a\x95\xe8\xeb\xac\x41\xa7\x76\xda\xef\x7b\x56\xef\x0b\x2c\x6a\x43\xf5\x92\xd8\x7f\x26\x54\x5d\x72\xc1\x1b\x91\xb9\xe4\xbe\xc1\xf9\x3d\xf8\x3e\xa2\x6f\x84\xf6\x06\x39\x07\xae\xb4\x94\x2b\x28\x56\xd6\x57\xdc\x1e\x75\x5f\xec\x42\x89\xff\x62\x06\x31\x3f\x80\x04\x30\x84\x59\x3d\xea\x13\x2e\xa7\x72\x33\xa6\xa0\x4f\x66\x89\xb1\x85\xc1\x94\xec\xa5\x1a\x5f\x0d\x85\x9a\x65\x98\x5c\xdb\x57\x44\x4d\x44\x1f\x82\x7a\x23\x1b\xac\x2e\x14\x48\x26\xe4\xbd\x15\xee\x5c\x61\x79\x00\x8f\x82\x79\xfe\xea\x1c\x23\xd7\x45\xc9\x74\x0e\x51\x4a\x16\x74\x41\xb1\xed\xac\xdb\xcd\x53\x3a\x00\x48\xca\x0c\x53\x39\xb8\xef\x97\xf2\xc9\x7d\x8f\x33\xc7\xd8\xfb\xa5\xf0\x90\x98\xaf\x4e\x06\x35\xa6\xa4\xab\xf3\xd8\xd8\x0a\xa4\x61\x02\x04\x75\xa8\x34\xf5\x44\xd7\x84\x2a\x59\x8a\xd4\x37\x33\xae\x34\xbe\xf7\x9d\x05\xdc\x4a\x81\x93\xe2\xb9\xf6\x51\x2c\x6d\x1f\xf0\x8c\x19\x4a\xb8\x20\x2f\xa7\x2f\x51\x8d\xdf\xa3\xb6\x0b\x1b\xc1\xb6\xd9\x1c\xa1\x51\x92\xd0\x62\xa5\x8e\x66\x73\xe7\xf5\xe8\x33\x55\x8c\xa6\x1f\x44\x86\x32\x72\xb6\x66\xfb\xde\x1d\x12\x00\x30\xa9\x6e\x0e\xc8\x60\x84\x8f\x9e\x14\x47\x5a\x79\x6a\x5d\xea\x19\x64\xf3\x11\xa9\x9a\xf2\xc5\xf3\x96\xb5\x0a\x05\x11\xc0\xe0\x51\x85\xcd\x5f\xd3\xe5\xec\x28\xbc\xca\x33\x1c\x38\x38\xce\x90\x81\xd5\x48\x9b\x81\x5d\xbb\xd9\xd6\x6b\x9c\x3c\xe6\x51\x20\xc9\xd9\x19\x79\xe6\xa0\x9d\x6b\x02\xa9\x9d\x47\x27\x33\x8f\xba\x37\x9f\x0b\x94\x71\xb5\xed\xf1\xf8\x5c\x50\x91\xb2\x14\xd4\xac\x1d\x78\x44\x2d\xb5\xc2\x35\x0e\x8f\x28\x98\x3f\xb0\x25\x5d\x31\x4d\x34\xcf\x79\x46\x55\x06\x51\x9b\xf7\x6e\xb5\x64\x56\x9a\xad\x35\xe3\x51\x90\x1b\xb5\xd1\x7f\xff\xec\xd3\xd5\xc7\x5f\x6e\xaf\xde\xbf\x79\x0e\xdc\x97\x05\x8c\x54\x5e\xae\x68\xea\x69\x4c\xab\x6d\x0d\x6e\x12\x03\x6e\x9e\x40\x30\x61\xcd\x76\x87\xc1\x72\x16\x70\xe0\xfa\xd0\x87\x36\xf7\x9f\x93\xac\xd4\x7c\x85\xf4\xd7\xec\xe4\xd8\xdf\x1f\x99\x40\xb1\x51\xb0\x93\x5a\x62\xe9\xfd\x25\x22\x4e\x16\x6d\xa7\xc1\xa8\xf9\x28\xd3\x8b\x7e\x44\x1b\x5e\xf4\x63\xcb\xd0\x01\x1f\x24\x2a\x75\x12\x6d\x4b\xd2\xde\xa7\x7f\x19\x56\x38\x33\x02\x7d\x64\x7d\xe6\x11\x9c\xe4\xd8\x7f\xb7\x22\x37\x1e\x82\xdf\x7b\x84\xd4\x78\xe9\xfb\xce\x42\x25\x29\x4b\x32\xaa\x40\xec\xf6\x16\x4d\x59\xf5\x26\xb0\xd8\x84\x5f\xf5\xd2\x70\x42\xb3\x8c\xa5\x04\x53\xed\x35\x46\xea\xc6\x4a\x27\x51\x1c\x1e\x6d\x05\x3e\xc9\xb1\x44\x1c\x36\x5c\x30\xfa\x51\x8f\x64\xff\xfc\x7b\x66\x8e\x39\xd3\x2c\x2f\x5e\xf3\x3d\xb7\x6a\xfb\x58\xb3\xbc\xa8\x54\x4f\x48\x4e\xaa\x2b\x4d\x03\x71\xce\x4b\x91\x80\xa7\xf2\xd2\xab\xc0\x7b\x90\x70\x25\xc8\x7f\x82\x2b\xfa\x35\x57\xff\x19\x12\x86\x9f\xe8\x5a\x37\x6e\x51\xab\x8e\x5d\x9a\xbc\x08\x95\x5e\x9d\x21\x01\x42\xe6\x0f\xe4\x03\x29\xd7\xf6\x2e\xbd\xa6\x10\xdd\x11\x61\x32\x38\xdf\x5e\x24\x2e\x04\x47\x2b\xa6\x0d\x4f\xc2\x7f\x66\x99\x9c\x5d\xe6\x54\x1b\xa6\x2e\x53\x99\x5c\xe6\x54\x94\x34\xfb\xc5\x7e\x3b\x55\xda\xfc\x2e\x71\xaf\xdf\x1f\x1e\x84\x15\x33\x73\x96\xf2\x32\x8f\x58\xca\xbd\x91\x8a\x2e\xd8\x7b\x78\xae\x4a\xef\x81\x2d\x70\x6c\xda\x7d\x4f\x92\x5e\xe9\x76\xc6\xaa\x64\x6f\x97\xba\x16\xca\x07\x1d\x83\xd3\x6a\xfe\x77\xf6\x8e\xe7\xbc\x27\xe2\x05\x05\xad\xf7\x48\xec\xfd\xc1\x9e\x2f\x77\x1d\x68\x77\x69\xfd\xc4\x2d\x2e\xd7\x5b\x57\xd1\xa6\xae\x1f\x36\x7e\xdf\xb1\x4b\xd5\xf6\x58\xf7\xd3\x7b\xb6\xbd\x18\x95\x8b\x7e\x3c\x3f\xd7\x84\x6a\x2d\x13\x4e\x0d\xab\x4a\x4b\xc2\x9d\xfa\xc8\x58\x31\xad\xca\x10\x2e\x59\x56\x40\xab\x0a\xa9\x48\xca\x66\xe5\x62\xb1\x0d\x8d\x45\xa9\x0a\xa9\x59\x25\xf3\xbd\x22\x2f\xbb\xb4\xbb\xcf\x0a\xbb\xdb\xee\xea\xec\x85\x7b\x51\xf3\x1a\x7e\xd2\x09\x5d\x6a\x06\x7b\xd3\x05\x6b\x85\x00\xee\x90\x17\x6a\x2b\x9a\x15\x3b\x7d\x1a\x5f\x33\xbe\xe8\xec\x23\x1c\xde\xb3\x0b\x72\xf6\x69\xd3\x5a\x19\x96\xbe\x01\x77\x15\xdc\x91\xe1\xf9\x2e\xf1\xef\x24\xd0\xa5\x94\x9b\x0d\xaf\xda\x99\xb1\x49\x28\x09\x48\x0d\xb9\x77\x36\x46\xa7\x71\x80\x64\xc4\x85\xdd\xda\x42\x8a\xe6\xc2\x89\xf6\x3d\x5a\x37\x0f\xe1\x35\x15\xbe\x28\x68\x59\xa4\x74\x8b\xb6\xb2\x8f\x87\x16\x52\x1b\x47\x7a\xdb\xce\x63\xa7\xe8\x70\xf8\xa9\xc5\x8b\x97\x47\x1a\x0e\x6c\x42\xe7\x06\x9a\x94\xb5\x67\xbc\xf5\x60\xba\x98\xa0\x22\x63\xdb\xc3\xb5\xfa\xb8\x7e\xa5\xbd\xec\x33\xe3\x77\xcb\x07\xd7\x4f\x74\x0f\x61\x83\xec\xfa\x4b\x64\xf8\x7c\x1c\x49\x98\x8b\x90\xf0\x8f\xe5\x39\x15\xa9\x6b\x15\xf1\xe6\x33\x4b\xec\x12\x66\x60\xbe\xa8\x7e\x3f\xe7\x7b\x4c\x60\x2e\x7c\x53\x19\x00\xf0\xd3\xc3\xc3\x9d\x7d\xf4\xe1\xfa\xce\xc1\xd9\x75\xdf\xf7\x31\x49\x3b\x45\x14\x7a\x3e\x08\x17\x44\x07\xc6\x1b\x29\x2a\x74\xcc\x65\x96\xc9\x27\xab\x58\xd6\x3a\x71\x1d\xed\xbe\x73\x35\x80\x81\x36\x92\x69\x12\xda\x20\x59\x22\xdf\xf5\x28\xe6\xba\xf7\xb8\xde\x2b\x0f\xb4\xb7\x1e\x7e\x1f\x62\x0b\xfc\xe3\x24\xe3\xa2\xb5\x8d\xce\xe6\xbf\xff\x52\x6a\x12\x88\x0b\xb9\xf5\xdd\x86\x1a\x72\x54\x10\xeb\xc3\x7b\xfa\x72\x89\xa0\xee\xd7\xb3\xf3\xcb\xf3\xe7\xa4\x6b\xbf\x3e\xd7\xae\x06\xa2\x0b\xf4\x80\xa8\x5b\x0f\x75\xbf\xa2\xa2\x43\x47\x1b\xbb\xb6\x73\x68\x69\x11\x22\x66\x5c\x06\x3d\x78\x37\x28\xd1\x4b\x96\x65\x2e\x32\x4b\xd1\xd0\x10\x66\x2f\x68\x78\xc2\x02\x30\xaa\xf4\x5c\xec\xd9\xf9\x7f\x9f\x5f\x10\x66\x92\xe7\xe4\x49\x8a\x73\x03\x28\x99\x92\x07\xc7\xb9\xc3\x4b\xf6\x42\x5d\xcb\x92\x08\xe6\x84\x0d\xf6\xd9\x15\x12\xce\xd6\xc0\x62\x88\x2c\x0d\x09\x3d\x78\x00\x14\x44\xa7\x19\x5f\xe6\x7d\x2f\x58\x39\x27\x2f\x60\xd7\xeb\xc0\x9b\x8c\xaf\xd8\xe5\x92\xd1\xcc\x2c\xd7\x2e\xa8\x47\x8a\x89\x6b\x08\xa0\x49\x29\xfc\x37\xfb\x04\x1d\x84\x16\x88\x94\x84\xfa\xb5\x86\x5e\xf9\xc6\x8a\xac\x6f\x77\x07\x50\xb4\x8e\x81\x65\x2a\x6f\x59\x57\x00\xb1\x10\x88\xfd\xb8\xd1\x9c\xc9\x57\x49\x3b\xe4\x8c\x2e\xa5\xde\x2b\xe0\xb5\x67\x26\xb5\xeb\xf9\xe0\x3d\x06\x82\x25\x76\x1e\xb5\x33\x39\xc4\x1e\xf4\x55\x0b\xbe\xb9\x9b\x92\xbf\xc8\x12\x78\x26\x9d\x65\x6b\xf2\x44\x9d\x0c\xa1\x99\x21\x67\xf6\x35\x67\xf6\x8c\xd9\x35\xff\xc4\x68\xea\xea\xb5\x6a\xc3\xe8\x5e\x03\x1f\x6a\x3b\x1b\x30\xf1\x8c\xa9\xd4\x46\xe6\x64\xe9\xa7\xe2\xe7\x59\xf5\x36\x80\xfd\x98\xc2\xbe\xed\x5d\x35\x04\x55\x43\x20\xa1\x23\x73\x0f\xef\x40\x22\xde\xa0\x1d\xb7\xba\x96\x17\x31\x69\x2e\xc0\x95\x03\xe8\x51\x2d\x9c\x73\x5a\xb8\x1b\x0e\xae\xb6\xfd\x47\x18\x6f\xca\xc0\x19\x32\x36\xb2\x18\xfc\xdc\x9d\x61\x11\x95\xce\x1e\x61\xb3\x40\xda\x41\xf6\x4f\x0a\x97\x36\x8f\x9e\x15\xce\x8e\x82\xb0\xa2\x60\x6c\x28\x48\x0b\x0a\xc6\x7e\x52\xf4\x78\x5b\x36\xbd\x2c\x56\x73\x4d\xa0\x6c\x8c\x74\x47\x0a\x88\xce\xe5\x80\x1d\x7c\xde\xad\xac\xb6\x6f\x3a\x54\xac\x3f\xec\x0d\xb4\x9a\xa0\xe3\x56\x26\xd8\xcd\xdd\x12\xb1\xa2\x1a\x1a\x66\x25\x62\x76\x11\xb3\x77\x0b\x1b\x55\xda\x6e\x1d\xa8\x90\x09\x10\x18\x15\x54\xa6\x7e\x69\xa1\xfe\xf1\xfb\xef\xbf\xfb\x7e\x4a\x7a\xd3\xe7\x02\x04\x2a\xc8\xcd\xd5\xed\xd5\x2f\xf7\x9f\xae\xc1\xa3\xb1\x6f\x57\x3e\x4f\x1a\x99\xea\x5c\x98\x89\x54\x13\x87\x91\x57\xe0\x6a\xdc\xf9\xa8\x4e\x96\x6c\x3f\x6b\x68\x9b\x51\xe0\xe7\x4d\x1b\xad\xbf\x91\xc0\xbb\x22\x2b\xef\x36\xd2\xb5\x66\x24\x90\xdd\x81\xf4\xd6\x77\x68\x27\xb0\xb1\x87\x48\x11\x77\x7b\x2e\xec\x8d\xab\xc0\xfe\x78\x9b\x1c\x01\x9f\x1f\x57\x90\x98\xc9\x74\xaf\x3f\xba\x35\xb7\x1f\x64\xba\xde\x71\x8d\x1e\x7a\xde\xed\x3a\xd0\xf3\xf8\x51\xaa\x7c\xfb\x3c\x60\x3d\x07\xde\xcc\xf8\x3b\x11\x95\xb0\x14\x7b\x9f\x21\x9c\x0a\xe8\xa4\xc2\x28\xaf\xc2\x51\x83\x93\x71\xe0\x46\x31\x16\xb1\xee\x51\x8c\x1d\xc5\xd8\xfe\x49\x8d\x62\x2c\x8c\x51\x8c\x1d\xc5\xd8\x51\x8c\x3d\x89\x18\x6b\x92\xe2\x5e\x26\x8f\x48\x73\xd8\xf9\xc3\xf5\x9d\xfb\x79\x43\x92\xa5\x22\xd8\xa9\xb9\x58\xc9\x6c\xe5\xfa\x99\x3e\x5c\xef\xbe\xb9\xec\x84\xa7\x60\xa8\x07\xbf\x0f\xd8\x58\xd7\x16\x66\xe5\x8b\x72\x5d\xe4\x79\xee\x2b\xaa\x42\x7e\x18\xcd\xb8\x36\x3c\xd9\x09\xd5\xc2\xcb\xf8\x9c\x25\xeb\x24\x63\x00\x79\x97\x53\xf9\xe8\xc6\xb8\x73\x57\x14\x8f\x66\x08\x81\xa6\x8f\x64\x42\xcf\xab\x9b\xbb\xbd\xad\xce\xfe\x41\x38\x95\xe7\x50\xaa\xe5\x4f\xfa\xa7\xe3\x54\xa7\x3c\xe3\x7b\xbf\x2e\x14\xc3\x3a\x32\xc3\x2f\x77\xf8\x31\x67\x6c\x2e\x15\x43\x3b\x32\xa1\x71\xe1\x36\xbf\x2b\x19\x3d\x99\xa3\x27\x73\xf4\x64\x8e\x9e\xcc\xd1\x93\x39\x7a\x32\x47\x13\xd0\x68\x02\x1a\x4d\x40\xa3\x09\x68\x34\x01\x8d\x26\xa0\xd1\x04\x34\x7a\x32\xf7\xcf\x6d\xf4\x64\xb6\xc7\xe8\xc9\x3c\xf0\xd2\x19\xc5\x58\xc4\xba\x47\x31\x76\x14\x63\xfb\x27\x35\x8a\xb1\x30\x46\x31\x76\x14\x63\x47\x31\xf6\x24\x62\xec\xe8\xc9\xdc\x31\x46\x4f\x26\x19\x3d\x99\xff\xe0\x9e\xcc\x9d\x5f\x15\xd4\x0a\x6b\x7b\x33\x4b\x6f\x1a\xe9\xb4\xbe\xbc\xbc\xf3\x74\x5e\xb7\x92\xfb\xb9\xf6\xc0\x7c\xc1\x2e\xfa\xb8\x8d\x3a\x9c\xf7\xb3\x62\xab\x75\x4a\xec\x39\xd4\x54\xea\x9e\x83\xdd\x89\xed\x8a\x15\x52\x73\x23\xd5\x86\x0e\xd7\xa9\x35\x1a\x7e\xe6\xea\xdd\x84\x73\xd7\xf8\xbc\xaa\x39\xb2\x94\x59\xaa\x5d\x1d\xca\x2d\x2e\x24\x2e\x5c\xde\xf2\xa6\xd3\x76\x1f\x93\xd9\x25\xb0\xb6\x99\x4a\xb3\x12\xa4\x2f\xcb\x63\x9a\x2d\x49\xf6\x35\x1c\x49\xa4\x48\x58\x61\xf4\xa5\x5c\x31\xb5\xe2\xec\xe9\xd2\x3b\xdd\x26\x4f\xdc\x2c\x27\x6e\xcf\xf5\x25\x74\x39\xbd\xfc\x1d\xfc\x67\x2b\x79\x39\x46\x7c\x95\xa6\xbe\x52\x5a\xa9\x19\x64\x7b\x5b\xf1\x54\x4f\x1b\xe5\x54\x2f\xa0\x06\xea\x05\x29\x79\xfa\xef\xdb\xf8\xd6\x1e\xee\xb0\x93\x0c\x15\x33\x4c\x58\x64\xdc\xc9\x8c\x27\x7d\x5b\xda\xfa\x6d\x27\xdd\xbb\x70\x1f\x1a\xe9\x9d\xb3\xc0\x9c\xb7\x96\x45\x90\x59\x5a\x39\xe3\x7d\xfa\x76\x17\x33\xfb\x76\x36\x55\xeb\x8f\xe5\xd6\x3a\x79\xfb\xab\x31\x3c\x32\x56\xbc\xa6\x7c\x7b\x45\xb4\xbe\x82\xda\xfb\x79\xb4\x05\xfd\x93\x2c\xd5\xa9\x60\xbf\xa3\xdb\x6f\xca\xc3\x21\xbf\x97\xc2\x2c\x4f\x35\xed\x07\xba\xd8\x7a\xfd\xef\xd1\x8f\x7b\x6e\xb8\x7d\xaa\x8c\x7d\xe3\x9f\x19\x7b\x3c\xd5\x6a\xfe\xc2\xe8\x49\x36\x78\x17\xa7\xda\x8b\x8a\x42\x95\x62\xcf\x53\xdb\xcf\xc0\xae\x3b\x70\xab\x3a\x3a\x71\xef\xc0\x32\x12\xed\xbb\xb7\xec\xe5\x20\x55\x8b\x97\xb6\x91\x36\x3c\x0b\xfa\x80\x95\x70\x21\x74\xa1\x53\x2a\x61\xeb\x44\x36\xb0\xb3\x6d\x89\x93\x2e\x97\xfb\xa6\x67\x3d\xce\x87\xdf\x04\xb1\x8b\x1f\xc9\x19\x28\xbc\xe9\x5b\x26\x7c\x49\xfb\xbd\xeb\xff\xb0\xf1\xf3\x10\xfd\x91\x3b\x13\x75\x62\x25\xf1\x45\xfd\x6d\x80\xbf\xb1\xd1\x2e\x9a\x83\x6b\x2f\x11\xfc\xe0\xda\xfd\xdc\x18\x92\x48\xe5\xea\x4d\xa4\x95\x5d\xaf\xf1\x93\x73\xdd\x80\xbe\x19\xfc\xe0\xea\xe8\x71\x1d\x6a\x4f\x58\xb9\x30\x2f\x8d\x9b\x8b\x6f\x54\x70\x75\x77\x03\xad\xbd\x36\xb5\xfc\x7d\xc7\x60\xd7\x11\xd8\x82\xff\xce\x47\x2b\x5f\x4b\x9c\xac\x5e\xce\x98\xa1\x2f\xeb\x8f\x60\x2f\x1c\xed\x36\xbf\x75\x3d\xd0\x58\xda\x10\x07\x7d\xb5\x1c\xff\xc9\xff\x0d\x00\x00\xff\xff\x52\x87\x60\x1b\xf9\x27\x03\x00") +var _stashAppscodeCom_backupbatchesYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\xfb\x6f\xe4\xb8\xb5\x20\x8e\xff\x9e\xbf\x82\x70\xb2\x70\x37\xe0\x2a\x77\xcf\x64\xf2\xdd\xed\xbb\xd8\x85\xe3\xee\x99\x78\xd3\x0f\xc3\xf6\x74\x36\x5f\x5c\x60\x2e\x4b\x62\x55\x31\x96\x48\x5d\x92\xb2\xbb\xb2\xbb\xff\xfb\x07\x3c\x87\xd4\xa3\x1e\xd2\x91\x5c\x9e\xe9\xcc\x88\xb8\xb8\x99\x76\x49\x47\x7c\x1c\x9e\xf7\x83\x17\xf2\xb3\x30\x56\x6a\xf5\x86\xf1\x42\x8a\x2f\x4e\x28\xff\x2f\x3b\xbf\xff\xaf\x76\x2e\xf5\xf9\xc3\xeb\x85\x70\xfc\xf5\xef\xee\xa5\x4a\xdf\xb0\xcb\xd2\x3a\x9d\xdf\x08\xab\x4b\x93\x88\xb7\x62\x29\x95\x74\x52\xab\xdf\xe5\xc2\xf1\x94\x3b\xfe\xe6\x77\x8c\x25\x46\x70\xff\xc7\x3b\x99\x0b\xeb\x78\x5e\xbc\x61\xaa\xcc\xb2\xdf\x31\x96\xf1\x85\xc8\xac\x7f\x86\x31\x5e\x14\x6f\x98\x75\xdc\xae\x7f\xc7\x98\xe2\xb9\x78\xc3\x16\x3c\xb9\x2f\x8b\x05\x77\xc9\x5a\xd8\x39\xfc\x36\xe7\x45\x61\x13\x9d\x8a\x79\xa2\xf3\xdf\xd9\x42\x24\xfe\x6d\x9e\xa6\xf0\x59\x9e\x5d\x1b\xa9\x9c\x30\x97\x3a\x2b\x73\x05\x90\x67\xec\x7f\xdd\x7e\xfa\x78\xcd\xdd\xfa\x0d\x9b\xfb\x17\xe6\x36\x59\x8b\xb4\xcc\x04\x7c\x16\xbf\x74\xdb\xfc\x93\xdb\x14\xc2\x4f\xc5\x48\xb5\xda\x0b\xa0\xe0\xa5\x15\x69\xe3\xf5\xeb\xfa\x0f\xf8\xf2\x42\xeb\x4c\x70\xb5\xfd\x76\xdc\x95\xf9\xce\x96\x34\x80\x5d\xac\x9a\xd3\x48\xb9\xf3\xff\x5c\x19\x5d\xc6\xfd\x69\xef\x01\xbe\x16\x36\x31\xe1\x4e\xac\xb4\x91\xf1\xdf\xb3\x6a\x47\xfd\x7f\xc7\xf7\xe2\x3f\xe1\x0c\x18\xc3\xa3\xfc\x33\x6c\xf6\x9f\xfd\x66\xc3\x5f\x33\x69\xdd\x5f\xb7\x7f\x79\x2f\xad\x83\x5f\x8b\xac\x34\x3c\xdb\x3a\x22\xf8\xc5\x4a\xb5\x2a\x33\x6e\x5a\xbf\xfd\x8e\xb1\xc2\x08\x2b\xcc\x83\xf8\x51\xdd\x2b\xfd\xa8\xbe\x97\x22\x4b\xed\x1b\xb6\xe4\x99\xf5\x13\xb2\x89\xf6\xcb\xfd\xe8\xd7\x52\xf0\x04\x76\xd3\x96\x0b\x13\x50\x2b\xac\xc7\x3a\xee\x4a\xfb\x86\xfd\x9f\xff\xf7\x3b\xc6\x1e\x78\x26\x53\xd8\x46\xfc\x51\x17\x42\x5d\x5c\x5f\x7d\xfe\xd6\x9f\x66\xce\xf1\x8f\xfe\xc3\xba\x10\xc6\x55\x7b\x82\xc8\x56\xa1\x79\xf5\x37\xc6\x52\x61\x13\x23\x0b\x80\xc8\x4e\x3d\x28\x7c\x86\xa5\x1e\xb1\x85\x65\x6e\x2d\xd8\x03\xfe\x4d\xa4\xcc\xc2\x67\x98\x5e\x32\xb7\x96\x96\x19\x01\x4b\x54\x0e\xa6\xd4\x00\xcb\xfc\x23\x5c\x31\xbd\xf8\x87\x48\xdc\x9c\xdd\xfa\x6d\x30\x96\xd9\xb5\x2e\xb3\x94\x25\x5a\x3d\x08\xe3\x98\x11\x89\x5e\x29\xf9\xcf\x0a\xb2\x65\x4e\xc3\x27\x33\xee\x44\xd8\xf7\x38\x00\xcb\x15\xcf\xfc\x26\x94\xe2\x8c\x71\x95\xb2\x9c\x6f\x98\x11\xfe\x1b\xac\x54\x0d\x68\xf0\x88\x9d\xb3\x0f\xda\x08\x26\xd5\x52\xbf\x61\x6b\xe7\x0a\xfb\xe6\xfc\x7c\x25\x5d\xbc\xd8\x89\xce\xf3\x52\x49\xb7\x39\x4f\xb4\x72\x46\x2e\x4a\xa7\x8d\x3d\x4f\xc5\x83\xc8\xce\xad\x5c\xcd\xb8\x49\xd6\xd2\x89\xc4\x95\x46\x9c\xf3\x42\xce\x60\xe2\xca\x01\x75\xc8\xd3\xdf\x57\x47\x75\xda\x98\xe9\xd6\x5d\xc2\x01\x08\x77\x70\xdf\x3d\xd2\x31\x69\x19\x0f\xaf\xe1\xfc\xeb\xed\xf5\x7f\xf2\xbb\x72\xf3\xee\xf6\x8e\xc5\x8f\xc2\x11\xb4\xf7\x1c\x76\xbb\x7e\xcd\xd6\x1b\xef\x37\x4a\xaa\xa5\x30\x78\x70\x4b\xa3\x73\x80\x28\x54\x5a\x68\xa9\x1c\xfc\x23\xc9\xa4\x50\xed\x4d\xb7\xe5\x22\x97\xce\x9f\xf4\x7f\x96\xc2\x3a\x7f\x3e\x73\x76\xc9\x95\xd2\x8e\x2d\x04\x2b\x0b\x7f\x59\xd3\x39\xbb\x52\xec\x92\xe7\x22\xbb\xe4\x56\x3c\xfb\xb6\xfb\x1d\xb6\x33\xbf\xa5\xfd\x1b\xdf\xa4\xca\xed\x07\x71\xb7\xaa\x3f\x47\xc2\x1a\xc7\xbe\x3b\xe4\x07\x5e\xf1\xbf\x48\xeb\xb4\xd9\xbc\x97\xb9\x74\xed\xdf\xb7\xcf\xf6\xcf\x3b\xcf\xc3\xa7\xe4\x52\x86\xdb\xa5\xca\x7c\x21\x8c\xbf\x30\xf8\xe8\xad\xb0\x76\xfb\x36\xc1\x05\xf6\x38\xe2\x4e\x4f\x2d\xe3\xd6\xea\x44\x72\x27\x2a\x5c\x80\x7b\x73\x2f\x44\x31\x67\x77\xfe\x7c\xa5\x65\x6b\x91\x15\xcb\x32\x63\x4b\x6d\x58\x2a\x16\xe5\x6a\xd5\xdc\x96\x6a\x95\xa5\x29\xb4\x3f\xb2\xb7\x62\xc9\xcb\xcc\xbd\x61\xaf\x4f\xb7\x1e\x5a\x6a\x93\x73\xf7\xc6\xdf\xbf\x6f\xbf\xd9\xfa\x0d\x77\xd2\xdf\xcc\x95\x30\xad\xdf\x52\x23\x1f\x84\xe9\xdc\x9a\xb7\xf0\x08\x93\x2a\x95\x9e\x88\x87\xdd\xe0\xb9\x40\xfa\x22\x18\x5f\x09\x8f\x99\x9a\x95\x56\xf8\xff\xc1\xad\xdf\x59\x83\x7f\xd4\x71\xb3\x12\x9e\xd0\x94\x45\xa1\x8d\xab\x48\x00\xe3\x46\xb0\x93\x1b\x61\x9d\x4c\x4e\xce\xd8\xc9\x67\xcf\x25\xc5\xad\xe2\x85\x5d\x6b\xe7\x84\x39\xa9\x96\xbe\x03\x17\x2f\xa1\xb4\xd5\xfb\xf3\xbd\xab\xdf\x42\x38\x3f\xd6\x5a\xdf\xdb\xce\xb5\x5f\x24\x80\xcd\xcc\xad\xb9\x63\xb7\x9e\x61\x45\xda\xe8\xf8\xbd\xbf\x3b\xfe\x68\x0b\xad\x9a\x0b\x67\x16\x31\xc3\x6e\xcf\x83\xed\xb9\x91\x5b\x8f\x1c\xc2\x66\xf8\x4d\x5b\x87\xa8\xb7\xfb\xdb\xd6\xb4\xaf\xab\x47\xfd\xbe\x24\x3c\xcb\x44\xca\x64\x9e\x8b\xd4\xa3\x63\xb6\x61\x7c\xe9\x84\x61\x7c\x6b\xc6\x7b\xc0\x32\x00\xa0\xf3\x22\x13\x4e\xec\x2e\xa8\x7b\xc6\x7e\x78\xda\xc1\xa5\x12\xc6\xf3\xcf\xfd\x8f\x6c\x4d\xfe\xb2\xf9\xc6\xf6\x25\x6c\xa0\x5d\x05\xf9\x00\x50\xc6\x1e\xd7\xc2\xc0\xc1\x88\x2f\x22\x29\x9d\x08\xaf\xe5\x39\x57\xa9\x85\x1b\xf7\xee\x8b\x48\xfc\x12\x16\x82\x69\x53\x3f\xbf\x94\x2a\x3d\x08\xd5\x03\xf1\xc8\x0b\x00\xfe\x72\x77\x77\xed\x5f\xbd\xbb\xbc\x46\x38\x07\x5e\x3b\x88\x83\x71\xf8\x29\x92\xb6\xe7\x93\x12\x40\x63\xb4\xca\x36\x4c\xab\x6a\x3b\x96\x3a\xcb\xf4\xa3\x67\x41\x01\x43\x17\xf5\xe6\xed\xe0\x59\x3d\x60\x07\xda\x9b\xcc\x01\xe9\x81\xc5\xf3\xfb\xbd\x87\xce\x08\x07\xcf\xe0\xf0\x61\xaf\x0f\x3f\xb0\x73\xf4\xf0\xbc\xc7\xb9\xc6\x51\xb1\x4c\xaa\xd6\x31\x4a\x65\x65\x7a\x68\xa7\x71\xb4\x10\xe4\x0c\xfe\xf9\xa8\xcd\xbd\xdf\x9e\x54\x1a\x91\x78\x2a\x0f\x07\xd8\xfc\x0e\xdb\x62\xd4\xdb\xc3\x68\xed\xd8\x8b\xd3\xf3\xd3\x97\xfe\xe6\xb7\x3e\x71\x6a\xd9\x52\x66\xc2\x6e\xac\x13\xb9\xa7\xee\x15\xd4\x4e\x88\xd2\x32\x2b\xf3\x22\xdb\xc0\xda\x4e\xd3\x33\x26\x9d\xff\xa3\xa7\x12\xa6\x54\x61\xa5\x5e\xe0\x58\x8b\x2c\x3b\x63\x56\x33\x67\x78\x54\x29\x3a\x41\xc3\x1b\x1e\x80\x33\x65\xa0\x62\x2f\x4e\xff\xef\xe9\x19\x13\x2e\x79\xc9\x1e\xb5\x3a\x75\xb0\x25\x73\x76\x87\x94\x3b\x7e\xa4\x13\xea\x46\x97\x4c\x09\x91\xe2\x71\x14\x99\x4c\xa4\xcb\x36\x40\x62\x98\x2e\x1d\xca\x85\xdc\x21\xa8\x39\x7b\xf7\xc5\xf3\x51\x10\x8d\x3b\xc1\xea\x25\x7b\x05\xa7\xee\xb5\x0f\x91\x32\x6e\x59\x26\x1f\xc4\xf9\x5a\xf0\xcc\xad\x37\x80\xf0\x4a\xab\xd9\x3f\x85\xd1\xfe\xb9\x52\x85\x5f\x0e\x23\x36\x63\xd2\x89\xbc\x03\x39\x19\xe5\x5a\x36\x1f\xe3\xc6\xf0\x4d\xe7\xfd\xde\x92\x55\x9a\xc3\x0b\x58\x3f\x88\x1d\x21\x24\x8e\xd6\x35\xf0\x44\xe5\x07\xb1\x2d\x80\x78\x08\xcc\xff\x39\x08\x79\x7e\xaf\x0b\x61\x3c\xdf\x7f\xca\x1d\x5d\x6b\x7b\x70\x56\xbb\x33\xd3\xd6\x21\x11\x76\xda\x23\xbf\xf2\x82\xac\xd3\x67\x5e\x0f\xf1\xcc\xb9\x52\x0c\x0a\xdd\x8d\xf8\x57\xd7\x73\xf6\x77\x5d\x02\xcd\xe4\x8b\x6c\xc3\x1e\x39\xca\x10\x56\x38\x76\xe2\x3f\x73\xe2\xef\x98\x5f\xf3\x5f\x04\x4f\xbd\x6c\xec\x51\x59\xf0\x0e\x52\x46\x3c\xce\x06\x4c\x3a\x61\x02\x6b\x02\x5b\x87\xa9\x84\x79\x06\x22\x10\xce\x63\x0e\xe7\xd6\xb9\x6a\xee\x49\x34\xe8\x63\x88\xe6\x01\xde\x13\x91\x78\x07\x77\x70\x75\xe1\xef\x0b\x2f\x5d\xb1\xa4\xb9\x00\x90\x55\xba\xe9\x27\xf3\x24\x21\xf5\x2b\x04\x0e\x07\xac\xad\xfb\x0a\x53\x70\x0d\x87\xea\x90\x04\x0e\xac\xca\xd3\xd3\x30\xf7\xa5\x57\xcf\x01\x46\x2f\x08\xe2\xed\x66\x51\x88\x7c\xea\xa4\x00\xc8\xf1\x66\xe5\xf1\x4a\x1a\xd1\xc9\x3e\x19\x9b\xf5\xef\xc5\x8c\x30\xb3\x5e\x02\xd6\x7c\xac\x8b\x12\x32\x56\x70\xb7\x26\xdf\xac\x6b\xee\xd6\x1e\x1f\x79\x92\x08\x6b\x99\xc6\x2b\x05\x48\x07\x46\x19\xf3\xe4\xfb\xee\x65\xb5\xae\xe9\x70\xb5\xf9\xb4\xec\x7a\x60\xd6\xa1\x3f\xed\x7f\xb2\xf7\x70\x5b\x5b\x00\x72\xae\x36\x0d\x0d\xb3\x12\x31\xb7\x37\xa6\xf3\x08\x2b\x61\x64\xce\x3e\x22\xa8\xbc\xb4\xa0\x6d\x44\x42\xc5\xd5\x4a\xb0\xd7\x1e\xea\x9f\xbe\xfb\xee\xdb\xef\xe6\xf0\xe9\x4e\x98\x11\x02\x57\xec\xea\xe2\xe3\xc5\x4f\xb7\x9f\x2f\x7f\xfa\x78\xf1\xe1\x5d\xd7\xa9\x7c\x99\xdd\x97\x0b\x61\x94\x70\xc2\xce\xa4\x72\x33\x6d\x66\xb8\x23\x6f\x98\x33\x1d\x78\x08\xc6\xa5\xce\x5b\xd8\xda\x37\x30\xa6\x89\xa8\x78\x7a\x61\x2e\x70\x24\xb0\xc3\x20\x1f\xf2\xdc\xad\x52\x1d\xbb\x09\x98\xd3\x80\x76\x4f\xc4\xb7\xbe\x4b\x3b\x83\x83\x7d\x8a\x14\x71\xdd\xc1\xb0\x77\x58\x81\x7f\x78\x9f\x1c\x01\x7f\x3f\xae\x20\xb1\xd0\xe9\x86\x7c\x76\x7f\xd6\xe9\xe6\x00\x1b\x7d\xea\x7d\xf7\xeb\x20\xcf\xe3\x7b\x6d\xf2\xfd\xf3\x80\xf5\x3c\x91\x33\xd3\x79\xe2\xbd\xe8\xdc\x3b\x1c\x43\xf9\x59\xef\x57\x49\x8b\x18\xfc\x6d\x1a\x97\x60\xc7\x65\x3a\x93\x18\x4b\x58\xf7\x24\xc6\x4e\x62\x6c\xff\xa4\x26\x31\x16\xc6\x24\xc6\x4e\x62\xec\x24\xc6\x3e\x8b\x18\xeb\x92\xe2\x56\x27\xf7\x44\x73\xd8\xe9\xdd\xe5\x35\x3e\xde\x90\x64\xb9\x8a\x76\x6a\xa9\x1e\x74\xf6\xe0\x37\x8b\xb3\xbb\xcb\xc3\x9c\xcb\x4f\x78\x0e\x86\x7a\xf0\xfb\x80\x8d\x75\xe3\x61\x56\xbe\xa8\xbb\x4f\x6f\x3f\xbd\x61\x32\x2f\x32\x91\x0b\xe5\x18\x67\x46\xf0\x4c\x5a\x27\x93\x83\x50\x3d\xbc\x4c\x2e\x45\xb2\x49\x32\x01\x90\xb7\x1d\x73\xd5\xf7\x8f\x6d\x8c\x3b\xfd\x54\xa0\x1d\x98\x20\xd0\xf4\xa1\x4c\x10\x76\xbc\x40\x73\x68\xfe\xec\xd7\x43\xa9\x02\x85\x32\x2d\x7f\xd2\x6f\x8e\x52\x3d\xe7\x1d\xef\xfc\xb9\x30\x82\xea\xc8\x8c\x4f\x1e\xf0\x63\x2e\xc4\x52\x1b\x41\x76\x64\x42\x0c\xd8\x3e\xbf\x2b\x9b\x3c\x99\x93\x27\x73\xf2\x64\x4e\x9e\xcc\xc9\x93\x39\x79\x32\x27\x13\xd0\x64\x02\x9a\x4c\x40\x93\x09\x68\x32\x01\x4d\x26\xa0\xc9\x04\x34\x79\x32\xbb\xe7\x36\x79\x32\xdb\x63\xf2\x64\x3e\x91\xe9\x4c\x62\x2c\x61\xdd\x93\x18\x3b\x89\xb1\xfd\x93\x9a\xc4\x58\x18\x93\x18\x3b\x89\xb1\x93\x18\xfb\x2c\x62\xec\xe4\xc9\x3c\x30\x26\x4f\x26\x9b\x3c\x99\xbf\x72\x4f\xe6\xc1\x9f\x72\xe1\xf7\xb0\x3b\xb5\x34\x3c\x83\xf9\xe4\xfe\x6a\xfa\xd3\x0b\x6e\xcc\x44\xab\xa5\x5c\x95\x86\x37\xb2\x4f\xb9\x11\xac\xe0\x7b\x56\x11\xb3\xfc\x17\x55\x81\x84\x7a\x1c\x10\x56\xbb\x2f\xf0\xde\xb4\xd8\x3d\x2b\x18\x93\x1c\x7b\xe0\x0c\x0e\xa7\xcc\xf6\x4f\x97\xf5\xe6\xc6\xee\x99\xfb\xc0\x0c\xd9\x0e\x94\x0d\x53\xef\xcb\x93\xa5\xae\x84\x51\x3d\xcd\x7b\x16\x75\x3c\x7f\x33\x8e\x51\x5e\xe7\x1e\x98\xc1\x27\x3d\xce\xf7\x1c\x40\xd0\x08\x65\x97\x1f\x7a\xcf\xe6\x51\xbd\xd1\x3d\xeb\x6b\xf9\xaa\xc7\xfb\xa4\x71\xd0\x55\x38\x82\x7f\x7a\xcf\x9a\x69\x5e\x6a\x82\x4d\x25\x78\x77\xa9\xbe\x6a\x8a\x95\xa6\xed\xcd\xa6\x7b\xac\x09\xb0\x1b\x3e\x6d\xa2\xdf\x9a\x00\xf4\x80\x67\xfb\xa0\xf7\x9a\x00\xb2\xcf\xbf\x7d\xc0\x87\x4d\x80\x4c\xf0\x72\x6f\x7b\xb2\x29\x5b\x70\x0c\x5f\x37\x8e\x7f\x09\x6b\x5e\x8f\x27\x1c\xc7\x38\x7f\x78\xcf\x52\x7a\x8c\xdc\xe1\x21\x32\xf5\xe8\x13\xd6\xf7\xad\x84\x60\x78\x24\x5e\xf3\x20\xad\x0f\x34\x3f\xd2\xa8\x52\x9f\x81\x32\xcc\x82\x8e\x44\x44\x63\x25\x8e\xe1\x26\x4b\xc2\xaa\x80\x59\x8e\x30\x5c\xe2\x20\x5f\xac\xc1\x46\x4c\x02\x4c\x86\x86\xce\xc1\xa6\x4c\x1c\x74\x7c\xc6\x41\x33\x6b\xe2\x38\x82\x71\x13\xc7\x20\x7a\xc4\xe8\x86\x4e\xca\x34\x69\xe6\xce\x51\xf3\xa4\x99\x3e\x71\x10\x0c\xa0\xf1\x41\xea\x8c\x89\x04\xb9\xf9\x70\x3f\x95\xef\x37\x8c\xe2\x38\x9e\x79\xb4\x39\x3f\xd2\xd6\xf7\x19\x20\x70\xf4\x9a\x21\x70\xd0\x8d\x11\xed\xe7\x89\x48\x32\xd8\x84\x4a\x38\x77\xbd\x25\xea\xf5\x98\x27\x28\x98\xd4\x32\x60\x8c\x32\x52\xe0\x18\x6d\x54\xc5\xd1\x6f\x5a\xc5\x31\xce\xc0\x4a\xd8\x88\xb7\x0d\x07\x61\x9f\x99\x15\xc7\xd1\xfd\x24\x1d\x46\x99\xe6\x17\x49\x72\x58\x57\x2c\x01\x8e\x51\x11\x05\xfd\xda\xec\x91\x45\xb1\xbe\xd8\x83\x3d\x6b\x19\x17\x81\x10\x16\x40\xbf\xe1\x7d\xd1\x08\x7b\x66\xf6\x84\x98\x04\x1c\x64\x69\x65\xa8\x6c\x40\x8a\x52\xc0\x31\x8e\xa3\x13\xe7\x31\x60\x89\x23\x67\x33\x84\x1f\xb2\xe7\x63\xb5\x93\x8a\x31\xa9\x18\x9d\x73\x9f\x54\x8c\x49\xc5\x98\x54\x8c\x49\xc5\xe8\x1a\x93\x8a\x31\xa9\x18\x38\x7e\x6e\x15\xa3\x37\xce\x03\xc7\xa8\x68\x8f\x9e\x5d\xe1\xe8\x16\x1b\x1a\xf3\xd1\x0b\xb5\x8a\x08\x19\x10\xf9\x81\xe3\x59\x0d\xcb\x47\x8b\x05\xc1\x41\x8f\x08\x09\xcf\xff\x16\x28\x27\x21\x6a\xe4\x37\x4c\x39\x7f\x5e\xda\x42\x78\xa8\x33\x5f\x1e\xc7\x53\xb2\xe6\x3b\xd6\xd0\x08\x6e\xe8\xcc\x9d\x8f\xf3\x9c\xa2\x1b\xa6\xe8\x86\x29\xba\xa1\x1f\xe2\x14\xdd\x30\x45\x37\x4c\xd1\x0d\x87\xc6\x14\xdd\x30\x99\x1e\x27\xd3\x63\xcf\x98\x4c\x8f\xc7\x9b\xe7\x64\x7a\x9c\x4c\x8f\x3d\x63\x32\x3d\x4e\xa6\x47\x1c\x53\x74\xc3\xf6\x98\xa2\x1b\xa6\xe8\x86\x03\x63\x8a\x6e\x68\x8c\x49\xc5\x98\x54\x8c\x49\xc5\xe8\x19\x93\x8a\x31\xa9\x18\xa4\xf9\x4d\x2a\xc6\xa4\x62\x4c\x2a\xc6\x14\xdd\xb0\x1f\xea\x14\xdd\xb0\xf7\xf9\xdf\x02\xe5\x9c\xa2\x1b\xba\x5e\xfe\xca\xa2\x1b\x7a\x1e\xf0\x08\x63\x64\x8e\xfd\xe0\xef\x44\x5e\x64\xdc\x1d\x20\xfa\x2d\x24\xb8\xda\xf7\x5e\x93\x50\x31\x17\xff\xe8\xb9\x00\x3f\xb0\x80\x07\x78\xdf\x9f\xdc\x5a\x43\x5d\x0b\xb3\x12\x9e\x1a\xa5\xdc\x21\x04\x6d\xb8\x91\x75\x48\x45\x59\x64\x9a\xa7\xc8\x4c\x0e\x80\x5c\xf0\xe4\x5e\xa8\xd4\xe3\xa7\x54\xd6\x13\x1a\xb5\xf2\xcb\xd4\x55\x73\xfc\x2b\x70\xd1\x82\xa7\xbe\xb4\x7c\x91\xe1\x14\xff\xa1\x17\x07\x20\xe6\x3a\x15\xd9\x9c\xbd\x05\x57\x2a\x2e\x71\x03\x7e\x5e\xc5\xac\x4c\x45\xc2\x4d\x78\x64\xef\xfb\xfd\xe4\x8e\x17\xf2\xb3\x30\xd6\xef\xeb\xc1\x73\x6e\x13\xb9\x8b\xeb\xab\xf0\x86\x27\x66\x52\x05\xfb\xd3\x03\xfe\x4d\xa4\xc8\xbc\x79\x2c\x5d\xd2\x81\x66\x46\x14\x46\x58\xa1\x1c\x94\x42\xf1\x2f\x70\x15\xb0\x65\xce\x6e\x41\x5e\xb4\xb1\xea\x48\xa2\xd5\x83\x30\x8e\x19\x91\xe8\x95\x92\xff\xec\xf4\xea\xe2\x0c\xaa\xf2\x88\x1e\x13\xac\x43\x74\x53\x3c\x43\xb9\xfa\x0c\x7c\xbc\x39\xdf\x30\x23\xfc\x17\x59\xa9\x48\xb0\xd1\x44\x32\x67\x1f\x3c\x4a\x48\xb5\xd4\x6f\x40\xeb\xb5\x6f\xce\xcf\x57\xd2\xcd\xef\xff\xab\x9d\x4b\x7d\x9e\xe8\x3c\x2f\x95\x74\x9b\x73\x4f\x63\x8c\x5c\x94\x4e\x1b\x7b\x9e\x8a\x07\x91\x9d\x5b\xb9\x9a\x71\x93\xac\xa5\x13\x89\x2b\x8d\x38\xe7\x85\x9c\xc1\x02\x15\x78\xd9\xe7\x79\xfa\x7b\x23\xac\x2e\x4d\x22\xec\x61\xba\x4f\xa0\xa2\xf7\xb2\x2b\xb0\xa2\x7d\xae\x7f\x95\x18\x53\xc0\x03\x48\x5c\x69\x7d\x48\x80\xf8\x6b\xc1\x6e\xde\xdd\xde\x75\x1e\x2a\x4e\x1c\xeb\xd6\xe0\x69\xd6\x40\x6c\x7d\xb0\x7e\xeb\xa5\x5a\x0a\xd3\x87\x26\x4b\xa3\x73\xf8\xb2\x50\x69\xa1\xa5\x72\x48\xbb\x33\x29\x94\x17\x22\x16\xb9\x74\x36\x9a\x08\xfc\x99\xcf\xd9\x25\x57\x4a\x77\x11\x38\xaf\x65\x17\x29\x04\x3c\xb1\x2b\xc5\x2e\x79\x2e\xb2\x4b\x6e\xc5\xb3\x1f\xab\x3f\x33\x3b\xf3\xc7\xf2\xb4\x83\xcd\x85\xe3\x9e\x4e\x51\x0f\xf7\xd6\x71\x95\x72\x93\x86\x03\x39\x3d\xb5\x15\x88\x67\x5f\x73\xfc\xd0\xe1\x05\xd3\xa4\x32\x38\x54\xac\x9a\xd4\xcd\xdf\x78\x1a\x43\x58\xae\xc9\xe2\x1e\x59\x24\xd9\x22\x86\xf5\x9c\xe0\xee\x28\x56\x86\x70\x99\xd2\x88\x94\xdd\x8b\x0d\x49\x8b\xcf\x79\xc1\xac\xd3\xfe\x95\x47\xe9\xd6\x20\xe2\x56\xd7\x88\x3b\xb8\x2b\x0b\x01\x26\xb1\xc5\x86\x89\x2f\x48\xc8\x7a\x2d\xfc\x3a\x43\x4b\x9a\x83\x88\x40\x95\x32\x23\x9c\x91\xe2\x41\x30\x6e\x16\xd2\x19\x6e\x36\x0d\x34\xb8\x5b\x8b\x3e\x93\x00\x37\x02\xc4\xf7\xff\x2c\x85\xd9\x00\xf7\xf2\x50\xeb\x4e\x2e\x70\xcb\xcd\x83\x5f\xc6\x5a\x28\xcf\x99\xe4\x72\xd3\x2f\xe4\x21\x52\xee\x12\xd5\x37\xe7\xe7\xb5\x30\xe4\x71\x31\xd5\x89\x3d\x2f\xad\x30\xb3\x55\x29\x53\x71\xde\x40\x89\x6e\xf9\x98\xa8\x2b\x25\x46\x00\xb4\x3b\x99\x0b\xeb\x78\xde\x11\x94\xc9\xb6\x71\xe1\xe4\x72\xfb\x65\xa4\xa6\xae\xfa\x67\x93\x94\xf6\x9d\xdd\x5a\x04\x8b\x09\xbc\x8f\xdb\xd9\xa4\xa8\x8f\xdc\xe2\x6c\x81\x84\xb9\xbe\x9e\x30\x0c\x8e\x6d\x55\x72\xc3\x95\x0b\x61\x57\x01\xa1\xa4\x62\x6b\x5e\x14\x42\xd9\x59\x10\x74\xb4\x49\x85\x61\x3c\x31\xba\x57\x98\xb6\xa2\xe0\xc6\x0b\x5a\xfe\x9e\xe1\x41\xcc\xd9\x25\x90\x66\xa4\xf0\xfe\xb3\xfe\x2b\x30\x77\xb8\x0a\x7d\x22\x30\x4a\x48\xd5\x5e\xa1\x2d\xf4\xe6\xfb\xcb\x6f\xbf\xfd\xf6\xbf\x81\x27\x87\x85\xe0\x37\xa9\xd8\x8f\x77\x97\x73\xf6\xef\xfb\x5b\x42\xd5\xe3\x5a\x17\x65\x06\x86\xe0\xc5\x06\x77\x36\xf4\xbf\xb9\x11\x3c\x9d\x79\x59\xcc\xcb\xff\x59\x06\xa2\x98\x57\x2c\x7b\x2d\xc5\x3f\x13\xc5\x3c\xe9\x9c\x86\xdf\x0b\xee\xde\x78\x79\x55\xcc\x3c\x96\x10\x6e\x40\x2f\x81\x5b\x09\xe5\x0f\x52\x0c\x8c\xdf\x3d\xf9\xa1\xf1\x5e\xa0\x84\x3a\x68\xc3\x9e\x2a\x2c\xe5\x97\x33\x30\x6c\xf7\xf9\x10\x37\x0d\xd4\x3f\xf3\x58\x1a\x27\xc4\x38\x2b\x95\xfc\xcf\x32\xc4\x03\x7f\xfa\xf8\xfe\xef\xec\xea\xfb\xde\xe2\x87\x0c\xf5\x31\x34\x01\xaf\x39\x5a\x1f\x16\x42\x28\xcf\x74\x1e\x64\x0a\xd7\x27\x14\xd9\xc3\x87\xa4\x85\x89\xf6\x45\x39\x56\x91\xc9\x46\xb8\xd2\x28\xbc\x52\x0d\xc1\xe4\x51\x66\x99\xbf\x62\xa9\x5c\x2e\x85\x11\x20\xb5\xf0\x3e\x4c\xad\x80\x16\xdc\x5a\x3f\xb5\xbb\xea\xda\x20\x40\x9e\x59\xb8\xb8\x89\xce\x17\x52\x05\x76\xd1\x6b\x2f\x09\x1b\x67\xcb\xe5\x52\x7e\xc1\xb6\x4f\x71\xf5\x01\xb8\xdf\x19\xd8\x78\xff\xf1\x07\x9e\xc9\x14\x2e\x73\x0f\x64\x53\x66\x5e\xdd\xc2\x57\xeb\x7d\xae\x45\xeb\x85\xf0\x3a\xab\x4a\x1a\x97\xaf\x07\x64\x26\xd4\xca\xad\xa3\x62\x8f\x33\xae\xd4\x5a\xbf\xc5\x39\xbf\xc7\x68\x5d\x9c\x38\x2e\xad\x8f\xbf\xa8\x06\x56\x79\x82\xb1\x7b\xe4\x55\xe4\x33\xcc\xbd\x7f\x9e\x11\x2d\xd1\xfd\xc1\xc4\x17\x4f\x36\xce\x9a\x74\x1b\xce\xeb\xe3\xa7\xbb\x80\x20\x07\xd5\xd0\x38\xfe\xf8\xea\xbf\xb1\x59\xf4\xca\x41\x2c\x2f\x40\x10\xd2\xad\x85\x89\x40\xbe\x79\xf5\x9a\x5d\x86\xee\x53\xbd\xc1\xc8\xdf\xbd\x7a\x85\xe2\xc4\x8d\xe0\x56\xab\x20\x79\x7b\xf6\xa4\x4b\x4f\xf7\x53\x99\x70\x87\x15\x69\x1b\x57\xab\x07\x68\x02\xbc\x1e\x6f\x11\x5b\xea\x52\xa5\xd1\x58\x02\x8c\x8a\x67\x99\x76\x4e\x04\x1c\xa8\xef\x43\x1f\x1f\x41\x11\xc2\xcb\x27\x1b\xf6\x22\x52\x8e\xaa\x54\x63\x05\x3e\x4c\x1a\x98\x02\xe1\x2e\xdd\x78\x78\xb3\x0b\x80\x81\xce\xa0\x97\x70\xfc\x17\x45\x91\xf9\xb3\x06\x3d\x5c\x2e\x59\xa0\x5a\x04\x16\xda\x88\x90\x7f\x66\x26\x20\x53\x91\x17\xda\x09\x95\x6c\xba\xf9\x00\x91\xb2\x67\x7c\x21\xb2\xaf\x47\x72\xfe\xc0\x0b\x7f\xcb\x83\xae\x79\x2f\x36\x16\x30\x06\xd5\x6b\x94\x7a\x13\xae\x88\x95\xf3\x9d\x66\xda\xac\xb8\xd7\xdd\x01\x8a\x47\x91\x95\x36\xfe\x9f\x2f\x6c\xa2\x8b\x20\xa7\x8a\x4c\x24\xee\x65\x25\x6e\xf6\x31\x79\xbe\x61\x39\x77\xc9\x3a\xbc\xa8\x0d\x44\x96\x1b\x51\x64\x70\x71\xb4\x02\x03\xa2\xd1\x59\xe6\xf5\x59\xfc\x82\x79\x90\x89\x18\x2a\x3f\xf4\xca\xb9\x78\x76\x47\x11\x71\xfb\xfd\xbe\xed\x73\x6a\x99\x33\x03\x99\xf0\x44\x45\x2a\xc6\x01\x98\x2d\x78\xd2\x2f\xd4\xd9\x9a\x88\x83\x2c\x8b\x92\xb6\x5a\x55\x8a\x8e\x3d\x63\x3c\x73\x6b\x5d\xae\xd6\xcc\x6a\xe0\xab\xe1\x87\x5e\xdd\x69\x83\x0e\x7f\xc6\x23\xef\x75\xba\x8e\x47\x5f\x8b\x48\xab\x6b\x1b\x13\x2f\xbc\xc6\x69\x24\xef\xcd\x10\x01\xe2\xce\x4b\xa7\x73\xee\x64\xe2\x29\xd2\x3c\x12\x0b\x56\x18\x99\xa3\x81\x50\x2a\x27\x94\x67\xa6\xe0\x74\x0a\x6a\x40\x0f\xe4\xfa\x7a\x07\x94\x6d\x96\x05\x46\xcb\x1a\x5c\xc5\x68\xcd\x20\xdc\x84\x68\xd1\x18\x8a\x5d\x32\xf5\x64\x67\x29\x85\xb1\xbf\x87\x13\xa5\x20\x5a\xef\x85\xaf\x70\x63\x88\x18\xf9\x31\xbe\xd4\xb2\x2d\xe2\x5f\x02\xd6\x09\xbe\x53\x09\x79\xdf\xa7\xb7\x70\x76\xce\x2e\x14\x13\x79\xe1\x36\xf5\xc4\xfc\x21\x7a\xa4\x7c\xe0\x59\x3f\x87\x0a\xd2\xdd\xbf\x9f\x04\x0f\xce\xbf\x9f\xd4\x80\xce\xd8\xa2\x74\xad\x9f\x30\x2d\xa9\x8f\x95\x72\xa5\x95\xc7\xaa\x2d\x4b\xe8\x9c\x7d\xd4\x8e\x41\x9e\x0b\x52\x2a\xd0\xbb\xe3\xfd\xe9\x9f\xa7\x57\xec\x3c\xd1\x03\xba\xd8\xb8\xa4\x6c\xd6\x10\x9c\x74\x53\x02\xea\x81\x89\x1d\x48\xb5\x15\xd5\x84\xa2\x74\x0b\x3b\x0a\x2c\xf5\x43\xf4\x78\xb0\xb7\x1f\x6f\x7f\x7a\x7f\xf1\xe7\x77\xef\xfb\x88\x42\x85\xd8\xe3\x51\xb7\x5a\x9b\x3d\x0a\x8f\xd4\x8f\x4a\x98\x1b\x01\x02\x7b\xd2\xc7\xfa\x5a\x98\xfb\x3e\x14\xf9\x8e\x1b\x94\x8a\x02\x49\x02\x48\xbd\x95\xde\xde\x4b\x27\x97\xec\xe2\xfd\xfb\x0a\x4a\x90\xac\xa0\x82\xf8\x9a\x3f\x08\xd4\x5c\x52\x91\x09\x10\xb1\x1a\x80\x7b\xe0\xc6\xf3\x5a\x71\xb3\xe0\x2b\xaf\x3f\x64\x9e\xa5\x35\xb5\x9f\x60\x58\x90\x5e\x6f\x57\x7c\x45\x51\xd5\x78\x83\x01\x82\xec\xab\x3c\x75\x15\xca\x0b\x71\x32\xd8\x2b\x60\xee\xf0\x79\xb0\xdd\x52\x6e\x19\x54\xdb\xae\xe1\x82\x08\x1b\xdd\x75\xf8\xc7\x20\xb7\x83\x61\xa1\x2f\x90\xce\x19\x7f\xfb\xef\x20\x21\x34\xa9\x30\x2e\xf7\x88\xe6\x35\x32\x48\x98\x84\x15\x7b\x6e\x54\x7f\xa2\xfb\xa4\x48\x81\x62\xed\x24\xcd\x16\x6a\x45\xd7\xa3\x65\x42\x01\xcb\xf3\x38\xef\xd5\xf9\x7e\xc6\x01\x9b\x94\x09\x07\x29\x74\x81\x74\x6f\x40\xdf\x7e\x54\x7e\x09\xd1\x81\x72\xb1\xf5\x97\x5e\xb0\x5b\xbe\x4f\x50\x05\x6b\xda\x11\xb4\xbc\x80\xd7\xca\x9d\xf5\xeb\x1f\x60\x67\x4f\xb2\xd2\x3a\x61\x66\x48\x91\x30\xc7\x10\xce\x02\x32\x15\x1b\x1f\x80\x23\xed\xbb\x1f\x43\xa2\xdc\x28\xae\xad\x7a\xb4\xab\xdf\x5f\x5f\x45\x87\x56\x54\x45\x0d\x1e\x1d\x29\x7a\x64\x90\x7f\x7b\x91\xe9\xe4\x1e\xb0\xe3\xad\xbf\xd7\x63\xa6\xeb\xaf\xb0\x29\xc5\x19\xbb\xf8\xf8\xd6\xab\x33\x7e\xbe\x40\xca\x2a\xbd\xfe\x64\xa9\x8d\x58\x19\xaf\xae\xc5\xaf\x74\x13\xcc\x38\x96\x52\xf1\x4c\xfe\xb3\xba\xdf\x35\xe8\xfa\x2e\x05\x7a\x04\x8e\x1a\x12\x50\x0f\xe4\x5e\x6c\x66\xc8\x89\xd0\x3c\x5d\x2a\x27\x33\xbc\xfc\xa6\xba\x25\xf0\x8f\x5c\x3f\x74\x25\xa6\x37\x47\x33\x6c\x67\xc9\x33\x2b\x20\xf1\xb4\xb2\x3f\x46\xeb\x84\x57\x1a\x0c\xa4\x9f\x52\x82\x05\x18\x3b\xc1\x15\x9e\xb0\x42\x98\x5c\xda\x26\x5a\xc0\x5e\x9c\x31\xed\x71\xfa\x51\x5a\xc1\xfe\xf8\xcd\x37\x24\x98\x2f\x7e\x54\x85\xd1\x89\xb0\xe8\x05\x7e\xa7\x9c\x74\x9b\x97\x15\xa1\x8e\x56\x25\x3a\xba\x2d\xb4\xce\x44\xaf\x85\x89\x35\x48\xdc\x78\x3c\xdb\x3a\x26\xa0\xec\xd1\xdd\x4a\x5a\xfd\x60\x82\x3b\x66\xa5\xdd\xde\xcf\x03\x6b\x44\x3f\xe8\xf6\xa5\xff\x2a\xfc\x82\xdb\xfb\x40\x24\x30\xd4\x48\xdf\x3d\x7a\x5f\xdf\x36\x1c\x5b\xb5\x18\xb1\xba\x52\x8e\x38\xe3\x1f\xaf\xde\x1e\x77\x6d\xa5\x3c\xfa\xc1\x51\x83\x8a\x67\x0d\x46\xd7\xfb\xa8\xc7\xb0\xde\x87\x08\x56\xc0\x99\xdf\x77\x92\x61\x88\x20\x7c\x50\x42\x92\x09\xc0\x6c\xd1\x55\x35\x63\xcb\x1f\x5e\x88\xa4\xa5\x62\xa6\xc2\x82\x71\x22\x59\x73\xc3\x13\x27\x0c\xc4\x17\x5a\xa6\x97\x5d\x1e\xe9\x18\x43\x14\xac\x0d\x28\xee\x73\x08\xd9\xe3\xa5\x5b\x6b\xb3\x97\x70\xec\x41\xab\x44\xab\x44\x14\xce\x9e\x7b\x66\xc8\x57\xe2\xbc\xf0\x07\x6a\x9d\x50\x6e\x86\xdf\xb0\xbf\xaf\xff\x84\x7f\x49\x32\x2e\xf3\x0e\xac\x23\x7a\xd5\x21\x66\xee\x83\x4e\x07\xa9\x3b\xa7\x17\xf5\x6b\xb5\x2c\xdb\xdc\x48\x52\x2c\x5e\x0e\xef\x83\x52\x8a\x1b\x19\xec\xc0\x5e\xd7\x39\xe6\xd6\xe1\x64\x66\xf0\xb9\xd9\xeb\xee\x8b\x4a\x12\xed\xc9\xf7\x98\x16\x6e\x9f\x72\xc7\x6f\xc1\xda\x35\xe0\x0c\xee\x6a\x07\x46\xa0\x15\xb8\x95\x18\x17\x77\xab\x78\x61\xd7\xda\xbd\xad\x40\xf7\xb9\x89\xb2\x62\xcd\xd9\x52\x70\xcf\xa3\xd8\x8a\x3b\x11\x6c\x09\x42\x79\x09\x05\x1d\x23\x49\x69\x3c\xb1\xcc\x36\x5b\x5f\xe9\x33\x76\xe1\xcc\xc0\xdc\x5e\x87\xfd\x42\xa0\x1d\x1a\xf9\x82\x1a\x1a\xfc\x52\x10\x48\xd6\xa7\x5d\x24\x5c\x45\x58\x5b\x93\x69\x02\xae\x1d\x29\xe8\x2d\xef\xf5\x95\x29\xf1\x18\x91\xd1\x2f\x18\x40\xd5\x42\x59\x08\xd2\x08\xc6\x20\x7c\xae\x0f\xa4\xab\xd5\x29\x27\xf3\xbd\x4b\x65\xa9\x16\xe8\x9a\x0c\x2b\xea\x81\xd9\xb5\xde\x30\x79\x98\x73\x10\xd0\x13\x52\x1d\x94\xe8\xb0\x59\x72\x99\x79\x14\xa8\x57\x1d\xce\x8b\x83\x5b\x57\x3c\x00\xb7\xbc\xea\x6f\x3c\xc7\xd8\xb2\xf4\xc8\x74\xc6\x1e\x05\x2b\x32\x0e\xa5\x83\xe2\x91\x81\x02\xde\x98\x38\xdc\x14\xb0\xa2\x13\xfc\x3a\x0b\xb1\xe6\x0f\x52\xd7\xa9\x13\x8d\xad\xcc\xf9\xc6\x53\x71\xb5\x3a\x5a\x85\x22\x5e\xc8\x1f\x8c\xee\xaa\xd0\x15\xc7\xb6\x12\x09\xaf\x45\xec\x5f\xc1\x3f\xd0\x96\x56\x9b\xb7\x09\x42\xc3\x42\xa0\xa1\x3c\x88\xdb\x68\xb3\x69\x42\x6f\x39\xa6\x28\xe5\x79\xd0\xa8\x1a\x3d\x9e\x20\xf1\x6e\x69\xff\x89\x3f\x1e\xaf\x06\xc3\xac\x29\xb2\xf9\xf7\xda\x30\xae\x36\xa8\x0a\x79\x0d\xc1\xa4\xb3\x82\x1b\xb7\xc1\x93\x3d\x6b\xcd\x38\x0a\x37\x47\xcd\x07\xa2\xc9\xfb\xad\x33\x8a\x41\x8f\xe0\x60\xdc\x14\x02\x1d\x3c\x01\x23\xb7\xf7\xfd\x98\x73\x1d\xd1\x96\x39\xfa\x1d\x9a\x35\xd1\x7e\x86\xb9\x52\x63\xca\x7b\x45\x4b\x82\x60\x49\x14\x19\x2b\xd7\xd0\x10\x89\xe5\x26\xbe\xd4\x88\x46\x85\xbd\xcc\xa5\x92\x79\x99\x93\x1d\x4e\xcf\x2f\xae\x10\x82\x7f\xd9\x20\x0a\x96\xc9\x5c\x3a\x8a\xc9\x6c\x84\xff\x97\x0d\xd5\xd8\xda\xc7\xf2\x1e\xa6\xd6\x48\x9c\x85\x23\xe1\x5f\xe0\x48\x78\xae\xcb\x5e\x9b\x31\xc3\x3e\x99\x89\xce\x8b\xd2\x35\xfc\x86\xe8\x15\x3c\xe0\xa9\xef\x3a\x99\x96\x2b\xee\x1c\xad\xe1\xb3\x00\x7e\x56\x81\x9f\x55\xd9\x23\xe7\xd4\xdc\x1c\x92\x21\x36\x46\x32\x7f\x95\xa7\x75\x13\xc3\xac\xb7\xce\x2b\x5c\xa1\xa7\x9d\x57\xc5\x14\x3c\x7f\xab\xbe\x24\x2d\xd3\xb9\x74\xb4\x3a\x6e\x90\xef\xd1\x2c\xe4\x27\x5d\x33\xe7\x9e\x05\x6c\x03\x1b\x29\x27\x44\x4d\x32\xa8\xc6\x18\xcb\xd3\x35\x98\x6c\xc3\xe2\xe7\xb4\x17\x8b\xaa\xec\x35\xc0\x9a\x19\xea\x96\x94\x29\x63\x50\xe4\xbf\x12\x8e\x12\x1f\x8c\x51\x13\x03\x88\xf4\x05\x46\xa9\x60\x7c\x31\xd3\x0f\xc2\x04\x4a\x6b\x43\x1e\x9d\x95\x90\xd0\xdd\xeb\x7a\x58\x48\x95\x4a\xb5\x3a\x96\x04\x08\x61\x20\xef\xbe\x78\xb6\x61\xfb\xe3\xcf\x77\x96\xb5\xfd\x7a\xbb\x2f\x30\x2e\x39\xee\x16\x01\x63\xc2\x3d\xc9\x31\x9f\xe2\x6e\x2d\x5a\x7f\x01\x67\xf1\xc5\xc7\xb7\x14\xe1\x6a\x5c\xbd\x83\x8b\xad\x29\x37\x3f\x1f\x32\x48\xe8\x8b\x61\x21\xd6\x27\xda\x10\x30\x00\xe8\x8c\x71\x76\x2f\x36\x18\x45\x06\xb1\xa4\xc2\x70\x07\xa2\x33\xa7\xd0\x17\xbf\x49\x90\xf6\x13\x7d\x0d\x8d\xe0\x22\x8a\x30\xfb\x8c\x45\x59\x5a\x5b\xe9\x67\x16\x44\x3a\xdc\x53\xff\x07\xd8\x10\x8c\x24\x1c\xb0\x8d\x0c\x34\x95\x22\x83\x82\x40\x9a\xe6\x2f\x19\x51\x91\x21\x9e\xc4\xa8\xe5\x56\xc7\xd8\x10\xc1\xe0\xa0\x4f\x2d\x1e\x98\xbf\x1d\x6b\xd9\x55\xb5\x78\x6b\xfa\x1a\xb0\x0d\xee\x51\xcc\xcc\xfa\xcc\x33\x99\x56\x9f\xc2\xfb\x70\xa5\x28\x6a\x11\x8e\x8f\xda\x5d\xa9\x33\xf6\x0e\x42\x3a\x01\x6f\xde\x6a\x61\x3f\x6a\x07\x7f\x79\xb6\x8d\x1d\x56\x7b\xa7\xb5\xad\x21\x68\x0e\xc3\xae\xc1\xd6\xd4\x08\xad\xa3\x23\x3d\x8e\x60\x9d\xa8\x8e\x4a\x5a\xaf\xeb\x6b\x13\xf7\xa5\x0a\x21\xa1\xf9\xce\x18\xa4\x8d\xf8\x29\x45\x0d\x53\x69\x35\x0b\x71\x23\xbb\xdf\x22\xc3\x0c\xc7\xa3\x4d\xeb\x74\x9a\xd3\x6b\x7c\x96\x0c\xb5\x0e\x69\x01\xeb\x1a\x42\xc0\x74\x84\x8c\x27\x22\x65\x69\x09\x9b\xda\x17\xcc\x5b\x0f\xeb\x0c\x77\x62\x25\x13\x96\x0b\xb3\x12\xac\xf0\xbc\x80\x7a\x1a\x5f\x5b\x85\xa5\x61\x85\x4e\xee\x7b\xf3\x89\xf0\xb9\x78\xfc\x64\xd1\xf5\xe8\xa5\x4e\x80\x41\xbf\x27\x04\xc8\xb2\x5f\x44\xec\x6e\x4c\x0f\xf9\x6b\x8e\xc1\xb3\xff\xc7\xb3\x48\x40\xf6\xff\xc7\x0a\x2e\x29\x15\x8e\x18\xbb\x60\x56\xaa\x55\x26\x5a\x6f\x07\xab\x4f\xf3\x43\xfe\x1b\x43\x02\xe4\x58\x20\xc7\x8a\x09\x14\x84\xfd\x0c\xb7\x25\x9f\x33\xf6\x08\x71\x64\x9e\xcd\x51\x22\xcf\x18\x1a\x8f\x4f\xee\xc5\xe6\xe4\x6c\x87\x2e\x9d\x5c\xa9\x93\x3a\xd0\xbc\x79\xeb\x09\x60\x2b\x89\x03\xac\xd2\x27\xf0\xf6\xc9\xd3\xc4\xa9\xa3\x4b\xd0\x68\x22\xb8\xcc\xb8\xb5\x03\x13\x72\x5a\xfe\xdb\xdb\x06\x9c\x3a\x0e\x97\x94\x8f\x01\x4e\xa6\x63\xda\x36\x12\x3f\x89\x3e\x1f\x0c\xf1\xaa\x20\xcc\x0f\x3a\x1d\xb2\x33\xf5\x4b\x95\x03\xf0\x11\x04\xae\x60\xfe\x0b\xa6\x9d\x5e\x56\xb4\xb5\x8f\x71\xa7\x3e\xc7\xe8\xca\xef\xab\xc2\xee\x90\xac\x96\x43\xc6\x41\x0f\x4c\x08\x8d\x56\xda\x31\xa9\x92\xac\x4c\x31\xf7\x0d\x00\x83\xea\x19\xb8\x12\x90\x80\x85\x70\x95\xb7\xa6\x1b\x33\x07\x6d\xe6\x40\x34\xfb\x5c\xbd\x14\xc5\xd8\xa0\x79\x35\xa2\x43\x48\x61\x21\xd7\x15\xa6\x20\x48\x28\xa5\x80\x29\xe7\xd2\x86\xbd\x7d\xfa\x2a\x29\x5e\x64\x28\x21\x3f\x20\xaf\xda\x95\x3b\x16\xc5\xe0\x25\x6b\x06\xf5\x9d\x23\xdc\x8e\x25\xe8\x25\xe3\xac\xbe\x30\x11\x0f\x03\x5a\x35\x52\x15\x7f\x6b\x1e\x65\x9e\xb8\x92\x67\xb1\xa6\x18\xf8\x70\xe9\x16\xda\x1a\x8d\x04\xbb\xfe\x7c\xc9\xd6\x7c\x7f\xed\x86\x5f\xa9\x63\x39\xe1\x05\x4f\xa4\xeb\x51\x4e\x7f\xbe\xb4\x9f\x9b\xf6\x45\x09\x47\x5b\x9b\x00\x03\xc3\x2a\x55\x2a\x4c\x46\xc8\x1c\xc7\x73\xa0\x50\x86\xfe\xdc\x6f\xad\x70\x17\x86\x60\xed\x65\xb8\xe9\x97\xf1\x65\xbf\x82\x43\x97\xb8\x67\x2d\x57\xcb\xc6\xba\xf7\x00\x91\xb6\xf2\xf2\x58\xf9\x4f\x01\x42\x0f\x25\x09\xae\x9e\x5b\xf4\xe8\x62\xdc\x34\xb8\x44\xe4\x3f\xc5\xad\xe3\xc6\x89\xf4\xf4\xd8\x11\xcf\xdb\x24\xfd\xd2\x6f\x42\x3d\x19\xbc\xe3\x59\xbf\xc6\x97\x0a\x78\x8e\xf1\x85\x2e\xb1\xc5\x07\xf0\xd7\xe2\x21\xe9\x79\x75\x88\x11\x27\xe3\xd6\x5d\x1b\xbd\x10\x77\x72\x44\xb4\xdc\x7b\x6e\x5d\x48\xd4\x17\x58\xb2\x33\x8d\x11\xeb\xb8\x5a\x8a\x60\x3e\x2c\x9f\x1b\xc7\x20\x9d\xc2\xaf\xf1\xce\x70\x65\x65\x2c\x53\xf0\x84\x85\xb6\x96\xc7\x5c\x05\x96\x64\xf3\x0e\x45\x5d\xb4\x12\xb1\x65\x0b\x68\x0e\x60\x53\xff\x2a\xb6\x2a\x17\xd6\xf2\xd5\xf0\xfd\xf9\x4b\x99\x73\x35\x33\x82\xa7\x10\xd5\x1b\xc0\x34\x73\x6d\x03\x36\x93\x36\x09\x31\x3e\x83\x3d\xaf\x36\xf8\xe8\x01\xe8\x06\xb2\x83\x07\x2f\xf5\x47\xc8\xab\x0a\xb1\xc0\x75\x09\x10\xee\xff\xdb\xb8\x33\x96\xf3\x64\x2d\x15\x2d\x1c\x18\xe8\x9e\x85\x1a\x35\x7e\xdb\x82\xe5\x0a\xec\xa0\x2b\xf9\x10\xac\xb8\x38\x4f\x62\x13\xa6\x06\x3d\x3f\xb5\x3b\x5b\xe8\x69\xad\x74\x21\xb2\xc5\xb2\x93\x16\x21\xa4\x05\xc6\x63\x5d\x16\xc1\x83\x90\xd2\x43\xb9\x49\x20\x5b\xd4\xfd\xe8\xc7\xdc\x27\xd8\x8e\x04\x0b\x0f\x0f\xc5\x9d\x6e\xd6\x70\xb7\x29\x68\x68\x03\x8a\x10\x54\x2b\xa8\x93\xda\xba\x41\xcf\x89\xb0\x9f\x25\x4e\xb7\x57\x05\x60\x55\x75\x44\x92\xf0\x75\xa4\xd0\x5a\xc6\x8a\x35\xb7\x43\xb4\xbe\x6b\xff\xfc\x21\xa5\x07\x80\x1d\x3c\x89\x9f\x43\x89\xeb\x79\xc0\x94\xca\xb3\x8c\x5b\xe1\x3c\x41\x3e\x70\x23\xda\x52\x6b\xfb\x8d\x90\x6e\xec\x74\x55\x90\xef\xa6\x4e\x62\xfe\xa8\x53\x71\x1b\xfc\x36\x87\x7c\x0e\x17\x4b\xc8\xee\xdd\x9c\xb1\x3b\x9d\x85\xd4\xe4\x33\x50\xf1\xa4\x12\xd6\x82\x1c\xc2\x84\x4b\xc6\x16\xf5\xab\xbc\xbe\x87\xcf\x94\x26\x1b\x09\xf5\x30\x22\x07\x52\xa8\x07\x69\xb4\x02\x1b\xe0\x03\x37\xd2\xd3\xf4\xad\x92\xee\x7d\x56\xa7\xba\x30\xe7\x6e\x92\xe8\x91\xc5\xd4\x77\xea\xe1\x33\x6f\x7b\xa4\xd4\xde\x25\xf4\x92\x8d\x00\x80\x41\x6a\x7c\xd5\xd1\xf2\x98\x29\x6d\xa3\x52\x39\x9a\x96\xc0\x7d\xeb\x9a\x43\xee\x2e\x91\x43\xf9\x95\xfd\x74\xf5\xf6\xdd\xc7\xbb\xab\xef\xaf\xde\xdd\x1c\x9d\x4b\x91\x0b\xbe\xb7\x8d\x07\x9f\xc3\x5a\x6a\xb3\x93\x65\x7f\x78\xf1\xf9\xe2\x06\xaa\xae\xbe\x64\xbc\xb7\xbb\x27\x0e\xf1\xa5\xe0\x90\xb6\x5b\xda\x68\x35\x28\x8c\x78\x90\xba\xb4\xc1\x5a\x98\x36\xf7\x90\xe8\xd8\x8b\x57\x60\xbb\xfd\x63\xf0\x6e\x6f\x62\xdd\x88\xf1\xa0\x41\xa2\xe1\xd5\xbf\x1b\xc9\x79\x5e\xb7\xce\x1e\x30\x5b\x98\xb6\x07\x8d\xf4\x3b\x9c\xaf\x54\x05\x28\x5e\x20\x94\x45\x1d\xb2\x54\x18\x64\x4b\xcc\xcc\xbb\x5b\x8b\xd6\x81\xd8\x8d\x72\xfc\x4b\x28\xf1\xc1\x84\x4d\x78\x51\x17\xbf\x4b\x75\x49\xb9\x6f\x7e\xfc\xe1\x0f\x67\x4c\x8a\x37\xec\x0f\x0d\xe0\x73\xf6\x2e\xc0\x6b\x60\x83\x9f\x37\x09\xa2\x12\x0f\xc2\xc0\xa4\x02\x2e\x9c\x31\x23\x56\xdc\xa4\x19\x94\xb4\x5f\xb2\xc7\xb5\x08\x21\xae\x82\x4e\x1b\x18\x20\x57\x74\x59\x2a\xed\xe6\xad\x64\xc5\x93\x13\x42\x81\xe7\x31\x57\xe9\x7b\xa3\x09\xad\x6f\xb6\x2b\xa9\x63\x4c\x69\x0c\x55\xde\x47\x34\x4e\x69\x22\x6d\x08\x6e\x6a\x10\x71\x68\x6e\x11\x9c\xf5\x31\x76\x19\x5d\xae\x04\x80\x43\xc3\x32\x30\x4a\xea\x03\x2f\xfe\x2a\x36\x37\x82\x50\xcb\x1a\x47\x7b\x33\x80\x99\x87\x38\x05\xb4\xd2\x5e\x46\xb0\x54\x3f\xee\xd0\x79\xb3\x61\x21\x25\x3b\x73\xbe\x0b\x41\x2f\xc0\x73\x33\x42\xdd\x81\xe6\x18\xe1\x45\x1e\xd6\x4e\x64\x67\xba\x1d\xc9\x86\x03\x40\xb2\x01\x26\x5d\xfd\xe0\x29\xae\x78\x3c\x0f\x4d\x7e\x67\x9e\xf2\xcc\x42\xd9\x05\xac\x2a\x71\x8e\x09\x8b\x83\x26\x80\x85\xec\x2f\xd2\x34\x44\xc1\x97\x56\x2c\xcb\x0c\x3d\x9d\x76\xde\x48\xd4\xa3\x47\xa3\xb0\x10\xd8\x7e\xc6\x4a\x99\xfe\x4f\x0a\x91\x88\x63\xd4\x39\xc6\xd2\x5b\xa3\xcf\xf2\x36\x88\xc4\x4d\x2a\x59\xdd\x97\x41\xab\xd6\x86\x49\x67\x01\x8f\x63\xe8\x08\x3d\xaa\x32\x8e\x61\x19\xc3\x38\x86\x44\x39\xb0\x01\x91\x0e\x6c\x68\x00\x03\x83\x04\x7c\x91\xa5\x63\x69\xd7\x69\x4d\xbc\x30\x51\xac\x2a\x98\x9f\xbe\x89\x99\x38\x74\x0c\xaf\x4a\xc5\xfa\x8b\x71\xd6\xfe\x67\xa8\x83\x53\xfd\x0d\x2b\x56\xd1\xd1\xbc\x7a\xb1\x51\xd2\xf5\x0c\x9d\x9e\x4a\xa7\xe0\x61\x0c\xff\x0c\xb2\xd2\x45\x92\xe8\x52\x39\xf8\x81\xfc\x15\xd4\xc0\xe7\x6b\x6d\xdd\xd5\xf5\x59\xfc\x67\xa1\x53\x52\x83\x05\x1c\x63\x68\xf9\xb0\x52\x14\x71\xb4\x3d\xad\xed\x72\x14\xa1\xc8\xba\xff\xcf\xef\xfd\xc9\x5e\xf3\xde\x3a\x90\xed\x21\x2d\x7b\x34\xd2\x39\xa1\x40\xcc\x13\x26\xf7\xc2\x4d\xab\x43\x19\x3b\x79\x78\x7d\xf2\xec\x9c\x63\x19\xa7\x3f\x7a\x6b\xa0\xeb\x50\xec\x79\x0f\x68\x5e\xf1\xbd\x81\xec\x63\x2b\x31\xaa\x51\x06\xe4\x99\xb7\x61\x38\xc9\x59\x0e\x3c\xf5\xc1\x84\x27\x3a\xe5\xbe\x3f\x12\x01\xaa\x52\x95\xc2\x49\x11\x8c\x14\xdb\x03\x22\x75\x6a\x67\x21\x66\xb5\x84\xc2\xd6\x21\x5b\xe0\x05\xfe\x71\x9e\x14\x25\x9d\x2c\x84\x77\x72\x91\x6b\xb3\x39\x8b\xff\x14\xc5\x5a\xe4\xc2\xf0\x6c\x16\x1c\xc0\x67\xd5\x67\x86\x81\xaf\xde\xc2\x0f\xb4\x26\xbc\xfb\x95\x97\x74\xaa\x62\x44\x23\x21\xb7\xca\xab\x7d\x56\x4a\x56\x9d\x5a\x7f\xa0\x48\x7b\xb4\xd1\xa2\xb2\x8e\xa0\xe0\x58\x07\xd3\x50\xad\xfb\x71\x04\x47\xfc\x59\x5d\x6d\xd8\x6b\x2d\x42\x3d\x78\x4d\x85\x54\x92\x21\x8e\x51\xc4\x2b\x95\x0f\xd2\xd2\x83\xa1\xd9\x7e\x69\x29\xf6\x70\xd5\xa5\xf3\x9a\x36\x7a\xb7\x86\xc9\x4a\xc1\xbc\xf3\xa5\xd0\x16\xf4\xde\xca\x1e\x39\xac\xe3\x64\x3d\x4e\x5e\xd3\xfc\x20\x38\x46\x6d\x5e\x9c\xe5\x78\x34\xba\x89\x64\xb3\x51\x2f\x3f\x92\xfe\x67\x3e\xfb\xe1\x14\x7b\x40\xc6\x2f\x1b\x43\xb0\xad\x48\x8c\x70\xc7\xd5\x74\x11\x26\xcd\x68\x5b\x8f\x42\xa7\xa7\xb6\x2e\xed\xf5\x95\x2b\xc9\x51\xa2\xc2\xa5\x8e\x13\x1d\x96\x46\xe7\x73\xd6\x28\x82\x88\x5e\xa9\x00\xf3\x5e\x90\xac\x1b\x71\x4c\x0a\xf8\xa4\x80\x1f\x57\x01\xbf\x05\x3c\x9c\xb4\xef\x81\x34\x75\x60\xd6\x2e\xcd\x0b\x4c\xa8\xae\x74\x64\xf7\xae\x50\x0f\xfd\x66\xe0\xbd\x9e\xbc\x28\x69\x3b\xcd\x8a\xd0\x44\x63\xbf\x77\xaf\x67\x41\xdb\x8e\x8f\x79\x24\xbe\xb5\x57\xa5\xaa\x29\x1d\xf8\x38\x21\x6d\x67\xd7\x1b\xc5\x2e\xb2\x8c\x49\x85\xc4\x17\xc0\x6f\x17\x31\xe9\x01\xd9\x28\x71\x12\x7b\xae\x34\xfd\x35\xd2\x32\xeb\x38\xb4\x75\x9b\xb3\xbf\x41\xbd\x53\x02\xf6\x05\xbb\xbf\x54\x2c\x2f\x33\x27\x8b\x4c\xb0\x4a\x3c\xab\x0b\xf2\x72\x6b\x75\x22\xa1\xb6\x3d\xa1\xa9\x03\x66\x0c\x5a\x17\xb7\x0b\xd6\xe9\xf8\x3d\xf8\xab\x12\x91\x0a\x95\x88\x10\x8c\x6e\x89\x17\x77\x01\x55\x44\xdf\xa9\x87\xca\x0d\x53\x62\xa5\x73\x64\x93\x7b\xbf\xd0\x03\xf2\xe7\x70\xde\x7a\xd4\x0e\x0e\x8b\xad\x88\x84\x4a\xdf\xec\xbd\xea\x55\x0e\x61\x65\xa9\xec\xc3\xe8\x21\xc2\x4a\xe5\x85\x20\x0a\x66\x3b\x52\x4a\x35\xab\x5a\x3a\xa1\x16\xdb\xfc\xd9\xda\x82\xf7\x16\x0c\x24\xb3\x8d\x5f\x48\x7c\x78\x06\xd1\x61\xb8\xd8\x30\x22\x1d\x77\x98\xb8\x40\xb7\xd5\x0f\x4e\x9c\x1c\x26\x1e\x0c\x15\x0d\x06\xb1\x6e\xec\x38\x34\x3c\xb1\xbd\xd1\xb4\xa8\xae\xee\x08\xdc\xcf\x40\xdd\x63\xaa\x12\x2d\x78\xb2\xc6\xdc\x6e\xd5\xde\xd4\x79\x43\x45\x78\xd6\x38\x0a\xd4\x3c\xc6\x12\x9c\xdb\x2d\x5d\x68\xa2\x36\x13\xb5\x61\xcf\x41\x6d\x02\xa2\xfd\xcb\x92\x9a\x23\x4b\xea\x52\x2b\x39\xa8\x06\xe4\x69\x15\x93\x88\xf5\x51\xa0\x26\x8c\x60\xff\x81\x80\xfe\x03\x73\xef\x8c\x76\xae\x37\x44\x05\x04\x4a\xcd\x53\xa6\x15\x4b\xa5\xbd\xdf\x5b\x0f\x57\x28\xb5\xb1\x4e\x24\x6b\xc7\xb3\xfb\xf9\x22\xd3\x2b\x5b\x68\x37\x4f\x74\x7e\xfe\xcd\xab\xd7\xdf\x9d\xbf\xfa\xe3\x79\xf8\x9c\xbf\x25\x49\x51\xce\x4a\xcb\x57\x02\xef\x4b\x26\x55\xf9\x65\x96\x40\x41\x39\x3b\x5f\xbb\xbc\x2f\x1e\x67\x4f\x9a\x96\xe6\xf7\x8b\x8d\xbf\xa3\x8f\xda\xa4\x90\x55\x1c\x3f\xfe\xcd\xf9\xab\x3f\xf9\xff\xc3\xaf\xd8\x64\x2d\xd2\x32\x13\x66\x96\x2c\xed\x8c\xab\x74\xe6\xf7\xa3\xa7\x08\x0e\x9d\x7a\x41\x12\x6b\xff\x25\x88\x69\x0a\x52\xb9\x6f\xfb\xab\x82\x0f\xe9\xa2\x0e\x13\x78\xdb\xd9\x00\xf6\xb9\x27\x41\x44\xfd\xaa\x3b\xff\x90\x32\x40\x09\x76\x54\xad\x0a\xa1\x60\x7d\x23\x50\x39\x43\x4a\x2d\x26\x1c\xf4\xe1\xb4\xd7\x56\xa4\x62\x46\xd8\x42\x2b\x1b\x9b\xf1\x07\x65\xae\x9a\x19\xea\x7b\x96\xd0\x37\x98\xb5\x7b\x07\x1f\x09\x9b\x0a\x6d\x1d\xe4\x1e\x0c\x2c\x2b\x74\x7a\x1d\x5f\xf4\x8a\x69\xc2\xb3\x4c\xa4\x4c\xe6\xb9\x48\xbd\x1a\x19\x9b\xa7\x11\x08\x1e\x6f\xab\xb8\x75\x5f\x51\xe4\xaf\x6b\xae\x52\x68\xba\xc1\x65\x66\xa9\x71\x84\x2d\x88\x4e\x98\x5c\x2a\xd0\x6d\xd1\xf9\x65\x31\xd5\x82\xf1\x24\xd1\x26\xa5\xb1\x1f\xa7\x19\x76\x7a\x86\x97\x59\xa1\x33\x99\x6c\xe6\xec\x13\x30\x93\x06\x86\x6c\xfb\x17\x09\xa0\xa1\x07\x83\xad\x7a\x10\x08\xb6\xd6\xfa\x1e\x2a\x94\x65\x20\x11\x8c\xa8\xce\x85\xdf\x6e\xfc\xe7\xac\xc2\xb7\x99\x87\x6e\xcf\x7f\x5f\xff\x04\x7f\xe8\xe7\xda\xc3\xc4\x2b\xf1\xa5\xab\x1e\x76\x73\xb4\x1b\x95\x28\xac\x7c\x0b\xce\x56\xad\x2a\x29\x6b\xa9\xb3\x4c\x3f\xd2\x4d\x99\x75\x4a\x50\xa3\x67\xde\xbb\x2f\x22\x69\x74\xea\x0f\x39\xa0\x94\xa6\x27\x38\xa0\x93\xfe\x7d\xaf\xdd\x01\xc7\x70\x87\x42\xa2\xf3\x9c\xd3\x9a\x06\xe0\x68\x27\x83\xe2\xdb\x31\x13\x3e\x00\x63\x99\x54\x62\x98\xf7\xcd\x9f\x5c\xe9\x3c\xc2\x59\x99\x8a\x36\x36\xa3\xc9\x28\x08\xa2\x43\x6c\xc4\xd2\x40\x4e\xc2\xa6\x0a\xeb\x8c\xf3\x83\xfa\x36\x5a\x3b\xf6\xe2\xf4\xfc\x94\xee\x7d\xde\xb5\xea\x9d\x5a\xb6\xac\x8a\x1e\xa0\x89\x2f\x7c\x63\x08\x50\xcb\xac\xcc\x8b\x6c\x03\xbb\x70\x8a\x9d\x30\x43\x9c\xa8\x29\x55\xdc\x13\x7a\x01\x1e\x8f\x89\x22\xcb\xb0\xf3\x8c\xe1\x31\xd3\x19\xff\x0a\xfd\x36\x4d\x89\xfc\x66\x00\xc8\x17\xa7\xff\xf7\xf4\x8c\x09\x97\xbc\x64\x8f\x5a\x9d\x3a\x38\x10\x68\x36\x52\x5a\xcc\x81\x83\x4f\x6e\x74\x39\x00\xa8\x0a\x8d\x99\x1b\x05\x07\x13\xe8\x02\x56\x3a\x14\xe4\xb8\x43\xc0\x43\x9c\x49\xef\xbe\x48\x17\x93\x2c\xf5\x92\xbd\x02\xec\x0c\x1d\x44\xb9\x65\x99\x7c\x10\xe7\x6b\xc1\x33\xb7\xa6\x1a\xd1\x59\xa8\x15\xad\xb4\x9a\xfd\x53\x18\x0d\x1d\x73\x55\x80\x41\x9f\xda\xc0\xda\x46\x23\xdd\x29\xc3\xea\x1b\x0d\xf6\x10\x78\x66\xf0\x83\x20\x30\x6e\xb6\x93\x29\x7a\x77\x77\xfd\x83\x70\x5b\xc4\xd0\xc3\x8b\xb1\x21\x74\x92\x58\x08\xe3\xa5\xbc\xe7\xa2\x8a\x6b\x6d\x89\x2b\x64\x3b\xab\xd4\xd6\x61\xb1\x62\x14\xbd\x94\x48\x3c\x2e\xd7\x61\x09\x43\xce\x5f\xc7\xd8\x45\x76\x75\x3d\x67\x7f\xd7\x25\xa4\x5a\xf3\x45\xb6\x61\x8f\x5c\x05\x73\xc5\x10\x2f\xd7\x89\x9f\xde\x09\x74\x40\x77\xae\xf8\x0b\x34\x88\xb5\xb1\x05\x2f\x1d\x93\x47\x20\x66\xe3\x7b\x63\x99\x4d\x69\x9d\xce\x43\x57\xdb\x61\xd9\x55\xcd\x11\x70\x6d\x0e\xf8\x88\x89\x6d\x50\xce\x04\x09\x44\x80\xfe\x8c\x97\x7a\xe7\x4e\xe0\xae\x34\xea\xcb\x72\x96\xc0\x52\x07\x79\x2f\x71\xe2\xa1\x81\x01\xe6\x1c\x28\x5c\x22\x64\xe7\x0f\x41\xbb\x31\x61\x09\x6c\x84\x43\x9e\xed\x33\xc4\x85\x75\x60\x54\x23\xc1\x73\xb8\x3d\x46\xd1\x4c\x36\x24\x0f\x8b\x3e\x7d\x00\xf9\xf3\xcc\x7f\xa8\x0f\x99\x51\x3d\xb3\xed\x17\x86\xae\x68\x70\x48\x0f\x1b\xc1\xc1\x18\x2b\x06\x05\xd3\xee\x86\xd2\x3a\x1d\x8b\xed\x84\xc6\xe9\x70\x71\x42\xf7\xf4\xe7\xa4\x8a\x85\xa6\xe8\xc0\x71\x70\xb5\xf9\x44\x0e\x74\x8a\x89\xd5\x54\x03\xcb\xee\x7b\x43\x23\x03\x77\x53\x30\x0d\x53\x65\xbe\x10\x75\xd7\x0a\x6d\x08\xfd\x2b\x9b\xa3\x7d\x2c\x0d\x77\xfa\x47\x04\x1c\x22\x35\x86\xcb\xf0\x86\xab\x95\x60\xaf\xfd\xd1\xff\xe9\xbb\xef\xbe\xfd\x2e\x74\x39\x8e\x91\x1f\xe4\xe0\x0d\x3f\xae\x2e\x3e\x5e\xfc\x74\xfb\xf9\x12\x92\xf1\xe8\xf8\xf2\x65\x56\x6b\xd4\x33\xa9\xdc\x4c\x9b\x19\xee\xf9\x1b\xe8\x3a\x47\x55\x3b\x93\xb5\x18\x42\x78\xdb\x26\x6a\x78\xd9\xef\x82\x17\xe3\xa1\x9b\x33\xca\x2c\xc3\xc8\x4f\x90\x54\xbc\xdc\xd4\x4e\xf3\xf3\x17\xe9\x19\x6f\xd0\x30\xb2\x37\x63\x84\x4e\x33\xcd\x99\xd0\xe3\x66\x92\xe2\x56\x27\xf7\xa3\xe4\xe2\xd3\xbb\xcb\x6b\x7c\xb9\x21\x1a\x73\x15\xcc\x04\x4c\xaa\x07\x9d\x3d\xd0\x8f\x83\xb3\xbb\xcb\x6b\x58\xe8\x1c\xfe\x0b\x2c\x2d\xa0\x4c\x6e\x84\x6b\xf4\x22\x02\x7f\x0c\x11\x66\x55\xea\x1d\xa2\xda\x79\x06\xad\xc2\x00\x7a\x6d\x52\xf4\xdf\xa1\xb9\x61\x7e\x56\x79\xfc\xf4\x53\xf4\xe0\xec\x15\xcd\x07\xe1\x78\x3b\x57\xa4\x21\x9a\xd3\x63\xe4\x26\x1e\xd1\xe0\x11\x81\x37\x98\xaa\xb9\xcb\xc4\x23\xb6\xc7\x51\x78\xc4\xd7\x41\x25\x07\x3c\x5c\x18\x71\xeb\xf4\xd0\xf6\x53\xa7\xd7\xf8\xda\x01\xdf\xc0\x42\x2c\x69\xd1\xbd\xfc\xa0\x29\x3f\x2d\x63\xf3\x8b\x8b\xeb\xab\x01\x56\x0b\xdd\x32\xd7\x63\xb0\x9d\x2d\x93\x75\xb4\x47\x29\x61\xed\x39\x18\xf9\xcb\x02\xf5\x35\x02\xd0\xd0\xb5\xec\xcc\xef\x96\xc8\x0b\x2c\xa9\x52\x65\x05\xf8\x25\x60\xbb\x55\xb0\xda\x81\x71\x92\x62\xde\x09\x9e\x8f\x60\x7f\x8c\xdb\xb8\xe5\x60\x60\x89\xe1\x76\x2d\x2c\xa5\x23\x36\x44\x03\xd6\x6d\x1b\x62\x45\xab\x6a\x5b\x81\xc7\x59\x56\x70\x6b\xab\x3e\x73\xf4\x89\x22\xd8\x6b\x9d\x9e\x9e\xda\x16\xc8\x95\xe1\x89\x60\x85\x30\x52\xa7\x0c\x12\x27\x53\xfd\x48\xb9\xb0\x0b\xb1\x92\xca\x06\x6c\xc1\x2a\x9a\x01\xad\x3c\x87\x13\x60\xec\x0e\xe6\xea\x74\xce\x6e\xaa\x42\x09\x14\x34\x58\xc6\xa4\x97\x44\xd7\x04\x2f\xac\xe4\x6c\x6b\x8b\x89\xe5\x1b\x00\x99\x4a\x9e\x65\x9b\x1a\x51\x63\x68\xa9\xdb\xbb\x35\x04\xa0\xcd\xcd\xfb\x59\xfc\x4d\xfe\x86\xd4\xbf\x8d\x9f\x2c\x56\xae\xe7\xc9\x7a\x5c\x13\xa4\xc9\x85\x35\xb9\xb0\x26\x17\xd6\xe4\xc2\x9a\x5c\x58\x07\xc6\xe4\xc2\x9a\x5c\x58\x93\x0b\x6b\x72\x61\x4d\x2e\xac\x7a\x4c\x2e\xac\xe3\xcc\x7f\x72\x61\x4d\x2e\xac\xed\x31\xb9\xb0\xf6\x8d\x5f\x99\x79\x72\x72\x61\xfd\xf2\xc6\xd9\xc9\x85\x35\xb9\xb0\xa8\x40\x26\x1e\x31\xb9\xb0\x26\x17\x56\xe7\xc3\xe4\x54\x21\xf4\xfd\x40\xfd\xfb\x21\x49\x70\xd7\x60\xed\x96\x09\x6a\x46\xd8\x5c\xbe\xce\xf2\x41\xa0\xf3\xba\x22\x7b\xcf\xc2\xea\x92\x11\x31\x4b\x25\x38\x7c\x10\x3a\x64\xc1\x0c\xae\x4b\xbf\x37\x9b\xad\xcb\xfe\xfe\xa8\xcd\x7d\xa6\x79\x6a\xcf\x0b\x8d\xff\xaf\xb6\xbe\x37\xcc\xee\xa8\x0b\x1e\x2b\xaf\x8d\x66\x6f\x1f\x66\x6b\xa7\xa5\x6a\x31\xcc\xac\xa2\xd8\xd9\xe9\x16\xf4\x61\x7c\x69\x90\xe5\x7c\x80\xd5\x3c\xda\xc2\xa9\xac\xb9\xcf\x62\x5e\xdb\xc1\x89\x10\xbb\xad\xe5\x7b\x6c\xe0\x54\xb8\xfb\x2d\xe5\x7b\xed\xdf\xd4\xc5\xef\x5a\xc9\xbb\x6c\xdf\xf4\x2d\xad\x2c\xe4\x7d\x76\x6f\xb2\x6b\x28\x5a\xc7\x29\x36\xef\x21\x40\xe7\xcf\x60\xef\x7e\xa2\xad\x7b\x90\x49\x6c\xb0\x18\x31\xc4\x3a\x30\x80\x3f\x85\x80\x80\xbb\xb5\x11\x76\xad\x33\xc2\xbd\x6e\xdd\xe9\x0f\x52\xc9\xbc\xcc\xfd\xb5\xb0\xfe\xfa\xca\x07\x11\x41\xda\x78\xa3\x08\xcb\x43\x9e\x81\x46\x3c\x0f\x4a\xa6\x02\xca\x5c\x72\x99\xf9\xd3\x5c\x3a\x61\xd8\x9a\x3f\x00\x9d\x2c\x93\x44\x88\x94\xd6\x51\xa1\xa9\x92\x7d\x3b\xaf\x66\x5b\x95\xd5\x7f\xdd\x0f\xe4\xf9\xb2\x93\xc9\x2e\x85\x81\xee\x04\x9a\x14\x49\x76\x25\x0c\x63\x0f\x74\x95\xe5\x59\xdc\x07\x44\xd7\x41\x70\x08\x90\x09\xe3\x78\xb7\xc1\xc0\x7b\x3e\xd8\x5d\x40\x76\x15\x54\x0e\x00\xe2\xa2\x9f\xee\x26\x18\x44\x0f\xe9\xee\x81\x30\x09\xba\xea\xf9\x44\xd7\xc0\x18\xb7\xc0\x93\xca\x4c\x3e\xd5\x1d\x30\x4a\x43\x1d\xec\x06\x38\xae\x0b\xe0\x67\x29\x2d\x3b\x60\x1f\x87\x99\xfc\x07\x9b\xfb\x87\x99\xfa\xe9\x66\xfe\xe7\x30\xf1\x0f\x3c\x1a\xba\xd9\x66\x80\xc9\x66\x8c\xb9\x66\x84\xa9\x86\x6e\xca\x0f\x9b\x4a\xc4\x8f\x3e\x13\x4d\xcb\xf0\x42\x84\xd9\x61\x9e\x19\x63\x74\x39\x82\xc1\x65\x88\x41\x9e\x6c\x8c\xa7\x07\x77\xb2\x20\x7d\x8c\x35\xc4\x0f\xec\x06\x4b\x25\x3e\x44\xb3\xd2\x00\x12\x22\x95\x74\x92\x67\x6f\x45\xc6\x37\xb7\x22\xd1\x2a\x25\x70\xa6\xad\xba\x60\x15\x4e\x5b\x04\x10\x64\xec\xa1\x11\x9a\x6b\x1e\x4a\x7d\x8a\x34\x06\xbf\x46\x4b\x52\x60\xb2\x50\x7e\x1f\x67\x4c\xb0\xfe\xb0\x5f\xd4\x02\xc4\x9e\x55\xdc\xc7\x60\xd3\x71\x07\xf6\x17\xfd\xc8\xf4\xd2\x09\xc5\x5e\x48\x15\xcf\xec\x65\x23\x22\x68\x88\x9e\x55\x5d\x10\xff\xfe\xeb\x57\x11\xdc\xd7\xa6\x1e\x81\xa2\x67\xed\x31\x35\xd3\x00\xf2\x18\xaa\x69\x00\xb5\x2c\xb3\xb6\x7a\x8a\x2a\xeb\x50\xdd\xf4\x75\x5d\xf1\xf0\x35\xcc\xad\xba\x45\x5c\xa5\x2c\x04\xf9\x93\x2e\xcf\x57\x75\x84\x03\xdc\x83\xcf\xe5\x1a\x1c\xe4\x16\xac\x1d\x7e\x24\xc8\x4f\x73\x09\xfe\x2c\x7a\x75\x8f\x1b\xd0\xab\xd8\x64\x05\xed\x09\x2e\xc0\xdf\xac\x0c\xd9\xe5\xea\x9b\x64\xc8\xed\xf1\x4b\x4a\x55\x4e\xe6\x42\x97\xee\xc8\x02\xd5\xe3\x5a\x26\xeb\xda\x2d\x46\xd8\x46\x3f\x0f\xcb\x74\xb9\x25\xc7\xbe\x0e\x80\x77\xb9\x34\x01\xe6\xeb\xc1\x79\x2d\xff\x22\x52\x15\xf1\x7c\x8f\x54\x2e\xf4\x29\xc5\x42\x93\xa2\x9c\x6a\x85\x76\x0c\x9e\xfe\xa3\xb4\xce\xb3\xde\xaf\xbe\x56\xa7\x69\x75\xa0\x3f\x96\x07\x3e\x36\xb7\xae\xa0\xf7\x76\x0d\x68\x65\xfd\xa1\x2b\x3e\xd7\x0f\x22\x85\x32\xd4\x8d\x66\xd9\x69\xa1\xa5\x72\x96\xc9\xbe\x0a\xff\x04\xef\xfd\xe4\x9f\xef\x1d\x93\x7f\x9e\x4d\xfe\xf9\xc9\x3f\x3f\xf9\xe7\xfb\x9e\x9d\xfc\xf3\x93\x7f\xfe\xf0\x98\xfc\xf3\x93\x7f\xbe\x6b\x4c\xfe\xf9\x30\x26\xff\xfc\x88\x29\x4f\xfe\x79\xc2\x0b\x93\x7f\xfe\xab\xb6\xad\x4e\xfe\xf9\xc9\x3f\x7f\x68\x4c\xfe\x79\x18\x93\x7f\x7e\xf2\xcf\x4f\xfe\xf9\xc9\x3f\x7f\xe8\xd9\xc9\x3f\x7f\x78\x4c\xfe\xf9\x83\xe3\xd7\x23\x43\x4e\xfe\xf9\xc9\x3f\x3f\xf9\xe7\x7f\x79\x8f\x6a\xe8\xf4\x3e\xc4\x99\x7a\xa9\xf3\xa2\x74\x82\xdd\xc4\x97\x2b\xf4\x64\x8b\x4d\xe3\x1e\xf6\xb9\x51\x9f\xec\xe3\x8c\x11\x02\x50\x7b\xf4\x1c\x4b\x9e\xce\x12\x9c\xdd\xac\x5a\xda\xac\x9a\xd1\xd1\x7c\xe6\x99\xcc\xa5\x23\x5c\x05\x9e\x46\x7f\xd3\xf5\x20\x9e\x36\x88\xb6\xb6\x0f\xe7\x3d\x4c\xad\x61\x1d\xc4\xfe\x94\x5f\xe0\x66\xf0\x5c\x97\x24\x16\x0e\x0e\x72\x3c\xe5\x6a\x1f\xd1\xe6\xf9\xcb\x1f\x13\x1b\x46\xbe\x82\x75\xf7\xeb\x3c\xad\x9b\x30\xb9\xed\xf3\x0a\x94\xec\x69\xe7\x15\x6f\x25\x34\xca\xac\xbe\x24\x2d\xd3\xb9\x74\x8e\xd4\x9e\xd8\x4b\xdc\xbc\xe9\x47\x96\xae\x25\xef\x04\x6c\x83\x02\x04\xdc\xd1\x68\x6e\xc3\xcf\x59\xb9\xeb\xcf\xb0\xcd\xf4\xa3\xb4\xb1\x64\x77\x25\x70\x02\xd6\xcc\xe8\x1d\x95\x81\xfa\xff\x4b\xe1\x28\xf1\x41\xaf\xac\x19\xe9\x36\x97\x5a\x39\xf1\xa5\x47\x0c\xdc\x0e\xab\xc2\x57\x43\x83\x6c\x5b\xc9\xa9\xa1\x82\xb0\x29\x15\x54\xa1\x3e\x72\x8d\x08\x6c\x81\x7a\x1e\x27\x0e\xbb\x27\xbe\xb8\xf3\xa3\x7c\xc5\x71\x7b\x5f\x9f\x9b\x98\x79\x4e\x5c\x1f\xcf\xce\x37\x8f\x16\x2e\xe5\x89\xe0\xb5\x91\x0f\x32\x13\x2b\xf1\xce\x26\x3c\x03\x9c\x19\x2a\x17\x5d\x1c\x80\x03\x97\xcd\xe8\xcc\xc6\x3e\xe4\x24\x85\xab\x30\x1a\x4c\xd9\x09\x57\x6c\xc5\xa5\x62\xb9\xdf\xc3\x22\x82\x87\x56\xc5\x0a\xda\xd3\x16\xdc\xd0\xb4\xb8\x00\x72\xce\xee\xd6\xd2\x42\x77\xf2\x10\x38\x92\x6d\xea\x39\x86\xca\x23\x4a\xff\xa4\xc4\xe3\x4f\xfe\x7b\x14\x0a\xb0\xcc\xf8\xaa\x8a\x9d\xb2\xc2\xed\x88\xf0\xf5\xc7\x0f\x6d\x13\xe1\x2b\x10\xf5\x50\x0a\xc6\xb3\x47\xbe\x81\xed\xdc\xfe\x8a\xb4\x6f\xd8\xeb\x97\x80\xfd\x9c\x32\xef\x6a\x1e\x29\xfb\xe6\x25\x98\xf8\x2e\x2f\xae\x7f\xba\xfd\xfb\xed\x4f\x17\x6f\x3f\x5c\x7d\xa4\x92\x04\x5a\xa7\xf7\x84\x17\x7c\x21\x33\x49\xe3\x42\x3b\x4e\xa7\xe6\xeb\x40\x52\xd3\xf4\x3c\x35\xba\xc0\x7d\x30\xa5\x52\x34\xbd\xad\xae\xb3\xde\x16\xbb\xfd\x4e\x06\x4e\x80\x47\xb8\x6c\x7d\x92\x00\x79\x65\xb8\x72\x28\x33\xb6\x8f\xc5\x94\xca\xcb\xfa\xc7\x76\xc0\xf3\x74\x4c\x6c\xd6\x45\x9a\x8a\x74\xe8\xd2\x9e\xe2\xe2\xbd\x8c\x9f\xda\x30\x23\x0a\x23\xac\x50\x8e\x5d\x7f\xba\xbd\xfa\xdf\xc3\x67\xc1\x02\xce\x0d\xf2\xd6\x3d\x53\xe8\x0d\x63\x1e\xfd\x46\x9c\xc0\x4d\x08\xae\x9c\xce\xa0\xe3\x85\xa3\x87\x3f\x55\xbc\x63\xa8\x79\xf9\xa6\x54\x4d\x12\xab\x1a\x90\x58\xae\x53\x31\x67\xd7\x48\xdc\x49\xfb\xd7\x7e\xbf\x26\x46\xe0\x3d\xf1\x40\x94\x93\xd0\x4e\xc3\xcb\xba\x0f\x3c\xa3\xf1\x36\xa7\x31\x80\x31\xf0\x9d\x5d\xe7\xd8\x92\x67\x96\x40\x80\x86\xd0\x73\xcf\xd2\x3e\x78\x71\x7e\xe0\x7e\x56\xef\xb1\x54\x28\xed\x82\x86\xe0\xbf\xec\x69\xae\xff\x95\x51\xb5\x84\x86\x1f\xb1\x45\x71\x43\xbb\x97\x48\xce\xa5\x8d\x7b\x71\x1d\xbf\x4d\x00\x8e\x06\x9d\xd2\x0a\xbb\x9f\x9c\xd7\x7a\x83\xff\xbe\x11\x3c\xd5\x2a\xa3\x3a\xf9\xd1\xdc\x9f\x73\x7b\x2f\x52\xfc\x43\x90\x4b\x82\x8e\x63\x43\xeb\x97\x30\xdd\x3b\xda\x7d\x5b\x0a\xee\x4a\x23\x50\x1e\x41\x47\x86\x50\x7c\x41\x72\x53\x0c\xb8\xa7\x7e\xad\x9f\x54\xb6\xb9\xd1\xda\x7d\x5f\xc5\xbc\x0e\x44\x83\xbf\xa1\x34\xc8\x9c\x5f\x75\xbd\xb9\x5e\x08\x01\x7b\x7b\x3a\x23\x6e\x27\x20\x7e\x33\xf4\xf6\x6d\x7d\xec\xcf\x80\xf6\xa6\x54\x17\xf6\x07\xa3\xcb\xa1\xfd\xa1\x3c\x46\xfe\x70\xf5\x16\xee\x6a\x89\xf7\x54\x28\x67\x36\x10\x53\x1f\x0c\xc6\x43\xe4\x97\x5a\xa6\xfc\xd1\xe3\xe8\x16\x56\x7a\x49\xb6\x54\x56\x90\xa2\xc0\x3e\xf0\x0d\xe3\x99\xd5\x51\x7c\x95\x8a\x5d\x83\x03\xb3\xa9\x9f\xcd\x99\x57\xbb\xf1\x67\x02\xcc\x85\x76\x6b\xb6\x05\x02\x90\x7e\x17\xf2\x19\x71\xe9\x68\x07\xad\x74\x6c\x3f\xcd\xed\x0f\x38\x7e\x2f\x2c\x2b\x8c\x48\x44\x2a\x54\x42\x38\xfb\x86\xc1\xf2\x4f\x7f\x3c\xaa\x4f\x0c\x30\xe5\xa3\x56\xfe\x9a\x0c\xc4\x95\x2b\x95\xca\x84\x23\x6d\xe4\x6e\x8b\xfe\x80\xe9\xde\x94\x94\x43\x80\xcb\xa4\xb4\x9a\xc1\x25\x29\xad\x30\x60\x3b\xf1\x6a\x04\x86\xd0\xff\xb5\x5c\x88\x4c\x38\x54\x5e\x1e\x78\x26\x53\x4e\x0a\xcc\xf7\xef\xca\x9c\xaf\x04\xe3\xae\x42\x3d\xa7\x99\x50\xb6\x84\xbe\x55\xdc\x81\x69\x45\x0b\x70\xc1\x51\xae\x31\x28\x2d\xec\xc7\xab\xb7\xec\x15\x7b\xe1\xe7\xfb\x12\xd0\x65\xc9\x65\x06\xf1\x8d\x8e\x1b\x37\x38\x6c\x41\x2e\xe3\x34\x60\xe1\x70\x23\x98\x36\x48\x18\xce\x98\xd2\xd8\x08\x2d\xac\x9c\xa6\x87\x45\x45\x2f\x38\xe4\xc1\x80\x48\xbe\x40\x04\xf8\x01\xc0\x90\x0b\x44\x3c\xb1\x67\xb9\x40\x83\x89\xe7\x8f\x56\x98\x11\xb4\xf3\xc7\x67\xa1\x9d\x4d\x21\xc9\xdf\x8f\xd6\xee\x50\x10\x0c\x2e\x41\x2e\x1c\x4f\xb9\xe3\x81\xea\xd6\x49\x3b\xbb\x88\x41\x51\xcb\x3b\x69\xef\x5e\xc4\xa0\xd0\x82\xc3\xb4\x97\x80\x18\x14\x0c\xfb\x8a\x68\xaf\x15\xef\xa5\x2a\xbf\xa0\x4f\x7c\x8c\xb9\xe1\xf6\x1d\x00\x60\x49\xbc\x17\x70\x84\xbc\x28\x32\x09\xd9\x2d\xc4\x1b\xd7\x70\xe2\x5e\xb5\x50\x63\xbb\xdf\x5e\xa0\xa1\x54\xf2\xc3\xb3\x4c\x7b\x06\xe1\x65\x25\xae\x52\x9d\xef\x4c\xd8\x0b\xa5\x82\x27\xeb\x21\xd7\x62\x3e\x44\x14\xf8\xf5\x51\xb2\x61\xe6\x97\x4c\x3c\x88\x6c\x84\xfa\xff\xde\xbf\xe7\x85\xd3\x78\x62\x00\x88\x65\x7c\x21\xb2\x21\xc9\x51\x88\x8b\x95\xed\x8a\xec\xa6\xc4\x31\x50\x2d\x37\x3a\x1b\x13\xef\x79\xa3\x33\x88\x4d\xe2\xd5\x62\x3d\xa0\xaf\x7c\xad\xf0\xf8\xf0\xb5\x7a\x1d\xad\xbd\x56\xd0\x69\xbf\xee\xb5\x96\x24\x5e\xcc\xb6\xd7\xea\x59\x78\x7b\xad\xc0\x3b\xbf\xe6\xb5\x0e\x30\x15\x3d\x4a\x95\xea\x47\x3b\x9e\x79\xfc\x0d\x01\x44\xfa\x94\x78\x42\x88\x65\x00\x02\x03\xa1\xd9\x36\x78\x96\xb5\x6c\x1a\xfb\x38\x48\x74\x80\x2d\x0d\xa9\xdd\x55\xe8\xc9\xba\x4d\x2b\xa3\x48\x5b\xda\xe0\x5d\x6d\x50\x6e\x02\xd4\x01\x6a\x1e\x39\xdb\xe2\x17\xa5\xed\xab\xdc\xf2\x4b\xe3\x61\x3b\xc9\xb3\xdb\x62\x54\x57\xd4\x1f\x3e\xdc\x5e\xb4\x81\xf8\x2b\xf3\xb8\x16\xa1\xb1\xaf\xff\x9d\x7a\x4f\xd2\x5c\x5a\x2b\xb5\x62\x8f\x62\x01\xbd\x6b\x5f\x44\x4f\xe2\x4a\xba\x75\xb9\x80\x4a\x0b\x8d\x98\x2c\x2b\x57\xf6\x3c\xe0\xf1\xcc\xaf\x86\xda\xa4\x53\xaa\x4c\xaa\x86\xc9\x4b\x28\x67\x63\x34\x9b\x9f\x30\x4b\xaa\x15\x11\x21\xfa\x83\x84\xa0\xb8\xca\x33\xb2\xbb\x31\x10\x92\x06\xf9\x44\xd4\xa4\x35\x30\x96\x61\x06\x92\xa7\x43\x59\xb1\xe6\x33\x64\xa4\x21\xe3\x1a\xf2\xef\xd7\x5a\x69\x43\xba\x6e\x7e\x2c\x36\x21\x5d\x26\xa8\xdd\x68\x3b\x83\x29\x87\x1b\x0d\x3b\x10\xac\x6c\x44\xa0\xcb\x8c\xaf\x9e\x85\x74\xef\xe2\xe8\x47\x72\x2e\x5a\x0f\x9e\xc2\x71\x84\xe4\xfd\x01\xa9\x54\xfb\xd1\x04\x11\x00\xd5\xab\x79\xe3\xdc\xa8\x08\xd9\x7b\xba\x8d\x73\xa3\xfa\x24\xfa\x4f\xf7\xf9\xce\xad\xd2\x81\x47\x1e\x17\xe8\xc2\xe1\x75\x4f\x1b\x23\xb3\xa9\x75\x63\xe2\x2e\xec\x68\xd0\x5d\xfa\x31\x75\x67\x91\x91\xef\x68\xd2\x3d\x7a\x32\x11\x3a\x51\x39\x41\xfe\x45\x26\x78\xc7\xd6\x4f\xd8\x40\x1d\x85\x08\xb2\xc1\xed\xfa\xa8\xdf\x80\xea\x12\x07\x2e\xd2\xa1\x2b\x72\xd3\x44\x5e\x2a\x05\x7c\xde\x1b\x75\xdc\xb0\x24\xc2\x43\x85\xee\x70\x21\xd2\xe4\x0c\xbe\x5c\x4a\x25\xdd\x66\x40\xcc\x93\x47\xea\xb6\xe8\x57\xe8\xf4\xd4\xb2\x50\x4d\x49\xaa\x15\x24\xad\x38\xc3\xa5\xea\xb9\xae\x74\x59\x48\xe9\x54\x5c\x90\xe6\xba\x33\xdf\xb7\x55\x00\xa0\x07\x52\xad\xb8\x39\x5f\x53\x66\x24\xec\x8f\xfe\xbd\x42\x13\x28\xc5\x30\x41\xaf\x30\x62\x29\x8c\x11\xe9\xdb\xd2\x23\xdb\x6d\x35\xb9\xab\x15\x5c\x09\xfc\xf3\x3b\x28\x58\x43\x0a\x8a\xda\xd9\x07\x4f\xae\xab\x8a\x57\x28\x68\xe3\x47\xc1\xa8\x1d\x7e\xa0\x92\x00\x9d\x02\x9d\xf7\x3b\x1a\xae\xa8\xe5\x4e\xda\x25\xca\x55\xd5\x1e\x8b\x2f\x50\x7e\x6b\x40\x83\xf2\x9a\x4a\x81\x8c\x16\xa9\xcb\x19\x5b\x94\x60\xc8\xcf\xf9\x86\x25\x6b\xad\x07\x54\x84\x81\x63\x87\x39\x3e\x48\x9d\x81\x33\x03\xca\x21\x19\x8c\xe5\x0a\x2c\xa7\x31\x55\xba\xe8\x27\x1a\xc0\xa5\x65\xb9\xb6\xae\x3e\xc9\x28\xb8\xf8\x8f\x3d\x4a\x92\xfe\xc2\x02\xc5\x5e\x41\x51\x19\xeb\x98\x2d\x73\x3f\xc1\x47\x21\x57\x6b\x67\xcf\x98\x9c\x8b\x79\x65\x51\x83\x8f\x0f\x91\x34\x72\x21\x1c\x44\x1b\xc7\x45\x37\xef\x00\xfa\x7b\x73\xd1\x77\x69\xeb\xf1\x22\x86\x6f\xc6\x50\xe0\xb3\x2a\x32\x76\x1b\x8b\xa9\xea\xc5\x1e\xc4\x81\x92\x40\xf3\x97\x67\x55\x1c\x2e\x87\x5d\x59\x50\x4b\xec\x48\x27\x0c\xc7\xbc\xde\xb5\xd1\xe5\x0a\x73\x23\x04\xc6\xc0\x06\x95\x62\xa0\x28\xe8\x79\x1b\x4f\x53\x0f\xf3\x04\x8f\xe6\x24\x0a\x1c\x7e\x6a\x55\xec\x5e\x2a\x58\xce\x5d\xb2\x26\xb3\x56\x94\x7d\x8c\x11\xb6\xd0\x0a\xe0\xc3\xfb\xef\xea\xdd\xf8\xb7\x0a\xf4\x0b\x4b\x55\xa5\x3c\xf2\x61\x38\x86\x5c\xad\x23\x56\xf1\xa0\xfc\xb5\x71\xf6\xb9\xcb\x6c\x5c\x28\x26\xf2\xc2\x6d\x1a\xb7\xa4\x81\x83\x4e\x18\x7a\xab\xec\xb0\xb3\x88\xce\xc0\x26\x2d\xae\x54\xe6\x18\x06\x1d\x6e\x0d\x7b\x45\x06\xf9\x02\xae\x97\x74\xa7\xe8\xad\x9c\xe9\xe2\xe5\x9c\x5d\x30\x55\x56\xb4\xb2\x3d\x61\x32\x60\xbf\xb0\x6a\xc2\x4a\x57\xf3\x0d\x1f\xb4\x28\x4c\x56\xdf\x24\x0b\x62\xc3\xcb\x84\xe0\x32\xbc\xf0\x36\xba\xf2\xc6\x05\x62\xb6\x15\x19\x14\x3b\x83\xc5\x9d\x31\x6e\xad\x4e\x20\xe3\x7a\x00\xdc\x06\x6e\xb6\xd1\x1e\x8f\x8e\xde\x5c\x71\x7c\xab\xf3\xed\x0b\xf6\xa4\xbe\xe1\x17\x2c\x93\x16\xb4\x98\xd6\x16\x0d\x04\xc9\x5a\xc4\xd8\x33\x42\x0f\xed\xd4\xa2\x59\x73\x40\x47\x7b\x1c\x83\xfb\xda\xe3\xe8\x3c\xf3\xc6\x04\x07\x03\x46\x55\xba\x81\x3f\x9e\x35\x05\x8d\xcf\xa2\xb2\x62\xa9\xea\x4d\x73\x70\x76\x2f\x36\x67\x48\x9c\x15\xf3\xd8\xc0\x2b\xf0\x46\x00\xe3\x1f\x01\xd5\xe3\xe6\xbd\xd8\x00\x58\x9c\xdb\xd0\xfd\x1f\x8f\x9b\x38\xee\x05\x41\xe4\xdd\x37\x76\xc4\x3f\x34\x8b\xfb\xd5\x0c\x30\x8d\x6f\x0f\xe0\x72\xf1\xec\x6a\xbb\xf9\xf0\x5d\x61\x4f\xe9\xf1\x8f\x23\x1e\xf2\x11\xf6\xe7\x26\x86\xa3\x5a\x44\x24\x72\xb1\xc5\xed\x01\xa8\xe6\x29\xc9\x5a\x16\x60\x3c\x8f\x51\xdc\x63\xb1\x07\xc7\x67\x9e\xc9\xb4\x5a\x30\x86\x69\x5e\xa9\x33\xf6\x51\xbb\x2b\x35\xe6\xba\xf8\xf1\xee\x8b\xb4\x5e\xac\x7c\xab\x85\xfd\xa8\x1d\xfc\x73\xce\x7e\x70\x70\x8b\x46\xc2\x7c\x3f\x88\x6c\xd7\xe3\x89\xa8\x80\xbb\x7b\x04\x44\xb8\x50\x18\xf3\x0b\x99\xb5\x63\x67\x53\xcf\x08\xe3\x9c\xc0\x41\x12\x08\x92\xb4\xec\x6a\x48\xbf\xe1\xe6\xd0\x26\x1c\x78\x6d\xd8\xb1\x61\xba\x79\x69\xc7\x5e\xe9\x85\x80\xd8\x2c\x90\xcc\x76\xe6\x3b\x12\xa6\xb4\x01\xbb\xfc\x9c\x9b\xf8\x45\x0d\xb2\xdb\x37\x76\x16\x0c\x91\xa5\x30\xed\x91\x10\xf7\x1c\xce\x0f\x10\x98\xf5\x9e\x6c\x62\xdb\x1e\x7b\x4f\x86\xad\xf9\x03\x5d\x65\xdd\x1e\x56\xaa\x55\x56\x29\x2d\x67\x21\x24\x38\x38\xcb\xc6\x1e\x90\x72\xc2\x14\x46\x84\xe2\xa5\x5c\xc5\x88\x16\xb4\xea\x8d\x84\x8a\x2b\x86\xf8\xe1\x22\xe3\x89\x48\x59\x0a\xaa\xa0\x27\x83\xce\x70\x27\x56\x32\x19\x09\x3a\x17\x66\x25\x58\xe1\xe5\xb5\x71\xa7\x3d\x52\x10\xc2\xf1\x44\xf2\x34\x34\xa5\xa3\x3d\x86\x16\x9e\xab\xc7\xcc\xf3\xb2\x11\x6f\x8d\xbe\xfd\x83\x0b\xd3\x6d\xbf\x3a\x7c\x87\x40\x84\xff\xde\xeb\xef\x5f\xb5\xf4\x0e\x16\x86\x49\x7a\x3f\x30\x26\xe9\x7d\x6b\x4c\xd2\x7b\xf7\x98\xa4\xf7\x49\x7a\x87\x31\x49\xef\x93\xf4\x3e\x49\xef\x93\xf4\xde\x35\x26\xe9\x9d\x36\x7e\x76\xe9\x7d\xd4\x07\xd1\x3b\x30\xda\x81\xf1\x37\xf4\x0b\xd5\x1e\x0b\xf4\x42\x80\x1a\x31\x14\x3f\x76\x5d\x17\x5e\xd4\xbe\x0d\x12\xd6\x1d\xb8\x46\x48\xb9\x36\x6d\x90\x50\x52\x8f\xbd\x9e\xbd\x7e\xf5\x6a\xc8\x6d\x19\x56\xf4\xac\xf1\xc9\xc1\x65\x0a\xc7\x14\x43\xaf\x7d\x4f\xe4\x57\xf0\xa4\xa9\xde\xd3\xe7\xad\x89\x7e\xc8\xb7\x7d\xb4\x08\x8d\xc0\xcd\x2a\x27\x78\x4b\x8f\xac\x02\x23\x88\x9b\xd1\x0a\x9f\x00\x79\x53\x69\xc7\x72\xe1\x18\x77\x2d\x9f\xab\xcc\xc5\x90\x60\xb2\x42\xa7\xc8\xba\x42\x89\xb9\x18\x39\x92\x32\xad\x82\x0f\xdc\xdf\x00\x2a\xd6\xd2\xd6\x1c\x57\x43\x04\x8a\x6b\x4e\x04\xb7\xb1\x8c\x6e\x5c\xb7\xce\xfd\x0a\xa4\x72\x91\xb1\x15\x9a\xba\xa1\x22\x9e\x2c\x7b\x21\xe6\xab\x39\x4b\xcb\x58\x51\x0b\xab\xec\xbd\x44\xa9\x0e\x93\xbf\x89\x30\x73\x2f\xa8\x1a\xf8\x1f\xbf\x9d\xce\x6c\x20\x77\xf5\x41\x28\x57\x62\xf1\x85\x07\x99\xb8\xb8\xef\xd4\xd5\x1b\x9d\x43\x45\x22\xfa\x39\x0c\x57\x71\xb7\xa9\xdc\x00\xce\xbc\xa5\xb8\xc5\x52\x6a\x4f\xb7\xbe\x38\x3f\x0f\xac\xb8\x00\xff\x09\x58\xff\xe9\x86\x1e\xd6\x39\x42\xc8\xd8\xb6\xb3\x94\x59\xe6\x4f\x14\x83\x1c\xc6\x9b\x91\x0e\x04\x0c\xe0\xe2\x46\x84\xea\xe0\xc0\xa8\x1f\x8c\xfd\xb8\xf8\xf8\xd6\xef\xba\x87\x77\xa7\x0b\x9d\xe9\xd5\xa6\x79\x9e\xc3\x66\x0b\x19\x47\xb1\xae\x1c\x98\x87\xca\x45\xd0\x9b\x3d\xee\x7e\xdc\x42\x96\xc9\xaf\x3f\xf9\xf5\xe9\x63\xb2\x0c\x6e\x8d\xc9\x32\xd8\x3d\x26\xcb\xe0\x64\x19\x84\x31\x59\x06\x27\xcb\xe0\x64\x19\x9c\x2c\x83\x5d\x63\xb2\x0c\xd2\xc6\xe4\xd7\x9f\xfc\xfa\x93\xf4\x5e\x8f\x49\x7a\x3f\x38\x26\xe9\x7d\x92\xde\xc3\x98\xa4\xf7\x49\x7a\x1f\x31\x26\xe9\x7d\x92\xde\x49\x63\x92\xde\x69\xe3\x5f\xc3\xaf\x3f\xf4\x53\xc3\x0e\x60\xb6\xeb\xb4\x1a\xe0\x25\x26\x2e\x65\x48\x21\x78\x9d\x3e\xb9\xa4\x41\xa1\xd3\x27\x55\x34\x40\x57\x66\xa2\x67\xa1\x8a\x23\xb8\x8c\x3d\xd0\xd0\xda\xcf\xf2\x1c\xfd\xb9\x67\xec\x9f\x5a\x91\x1c\xc5\xc2\x25\x73\x4f\xba\xc0\xd7\x0a\xcd\x87\x3c\xc0\x17\xf6\x25\x21\xaf\x75\xaa\x99\x30\xd5\x4c\x98\x6a\x26\xfc\xd6\x6b\x26\xac\x49\x3d\x83\x58\xbc\x53\x28\x76\x45\x67\xf9\x6e\x40\x56\x83\xce\x7a\xa2\xff\x6f\x03\x70\x2a\xd4\x59\xe8\xaf\xa0\x40\x9d\xef\xcf\x55\x67\xc1\x5f\xb3\x70\x01\xfc\x69\x35\xd0\x17\xf7\x89\xae\x46\x62\xb0\x9c\x48\xaf\xdb\xbb\x18\xac\x5e\xb0\x09\x1c\x3a\xf9\x14\xc2\xcc\x06\x5c\x2e\x28\xd1\xb5\x94\x2a\xdd\x53\x85\x62\x60\x7d\x8b\x51\x75\x10\xda\xcb\x19\x1d\xf2\xd1\x8c\x5f\x69\x31\x63\xa8\x8a\x30\x48\xd4\xda\x8e\x47\xfc\x25\xab\x22\x80\x4d\x2a\x8a\x4a\x4f\x35\xbe\x82\x7d\xeb\x3f\x4b\x61\x36\x4c\x3f\x08\x83\xb6\x97\xc1\x22\xac\x5e\xd6\x1d\x18\xcf\x50\x3e\x91\x96\x25\xdc\x42\x6c\xd4\x60\x0b\xce\x53\xac\x7f\x4f\x8d\x2d\x61\xdb\x9b\xb4\x0d\x90\xd6\xef\x71\x77\xf0\xca\xd2\x8d\x9b\xbe\xcf\x32\x3c\xd2\xd6\xb5\x1d\x78\xd4\x08\x22\x1a\x63\x6b\x1e\xaf\xf4\xed\xc5\xae\xd1\x36\x7d\x1c\x8d\x85\xed\x31\x83\x8f\x04\xba\x6d\x3c\x6f\x98\xc2\xc7\xaa\xf1\x07\x0c\xe8\x4f\xb0\xdd\x3c\xd5\x88\xce\x9e\x6c\x48\x67\x4f\x31\xa6\xb3\x6d\x84\xf0\xeb\x09\x32\x24\x60\xc6\x68\xa8\xac\xb2\xc8\xef\xb5\xad\x3f\x01\xee\x58\xab\x3c\x3b\x86\xbd\xe3\xa9\xd6\x79\xb6\xbd\xe1\x15\x42\x56\xfd\xdc\x9e\xb2\x37\xc1\xc8\xbf\x6d\xae\x7f\x12\xc4\xb6\xa1\x7f\xdb\x64\xff\x14\xd0\x2d\x63\x7f\x34\xac\x8e\xbf\xde\x7e\xb4\x6c\xfe\xbf\x24\x9a\x3c\xc5\x72\xcf\xb6\x91\x24\x18\x5e\x3d\x69\x1d\x6b\x63\x67\x95\x19\xb3\xf2\x00\x3c\xd1\x77\xc3\xf6\x1b\x9a\xaf\x14\x1b\xcd\x47\xfc\x38\xe0\x09\x78\x02\xc4\x68\x52\xdf\xf1\x06\x3c\x01\x66\x73\xc5\x07\x3c\x02\x4f\x21\x71\x7b\x8d\xed\xa3\x8d\xe2\x7e\x84\x85\x43\xc1\xd9\x1d\x73\xf6\x13\xe0\xee\x1a\xc2\xd1\xa4\xfd\x04\x90\x4f\x30\x86\xb3\xa7\x1a\xc4\xd9\x71\x6e\xff\xd3\x0c\xe3\xec\x49\xc6\x71\x36\xda\x40\xce\x9e\x66\x24\x67\x4f\x33\x94\xb3\x27\xee\x1a\x28\x01\xef\x21\x14\x7c\xcc\xa6\x8d\x6d\xb2\xbf\x3b\x9e\x88\x3f\xbb\x9a\x0d\x2e\x0a\x25\xeb\x9c\x17\xa3\x26\xa5\x97\xec\xff\x78\xf1\x19\xc8\xca\xff\x63\x05\x97\xc6\x7a\xa5\x1b\x9d\x70\xa3\x40\x36\xe1\x05\x7b\x77\x63\xba\xa3\x40\xe6\xbc\xf0\xcb\xac\x7b\xa6\x86\x14\xa1\x60\x3a\x1b\xbb\xf2\x6d\xfd\xf0\x8c\x3d\xae\xb5\x15\xa3\x2f\x49\x55\xb1\xfb\xe4\x5e\x6c\x4e\xce\xb6\x79\xe0\x28\x98\x27\x57\xea\x04\xe3\x7c\x76\xa8\x7f\xd4\x84\xc6\x2d\x5f\x65\x1b\x76\x02\xf0\x4e\x9e\x98\xff\x12\xc7\x93\x54\xd7\x27\xbb\xd2\x46\xbc\xaa\x78\x2e\x6c\xc1\x93\xe1\x37\xba\x75\x19\x6b\x30\x95\xcf\x20\x98\x4f\x07\xef\x43\x03\x54\xa5\x6b\xdd\x3e\x55\x47\x72\x9a\xbd\xa8\xca\xba\xae\x3c\xc6\xb8\x97\xff\xd6\xce\xa9\x1a\x0c\x13\x0c\x22\xb9\xe0\xca\xb2\x93\xe8\xdd\x3a\xb5\xf5\xfc\x4f\x06\x42\x1c\xc9\x9d\x9f\x40\x53\xc7\xf2\x14\x17\xd2\xba\xfe\x3a\x5c\xb9\xde\xb2\x25\x07\x9f\xa0\x5d\xeb\x32\x4b\xbd\x24\x5a\x39\x0c\x87\x4b\x5e\x2f\xa2\x85\xf4\xa5\x3f\x53\xa5\x5d\x03\x18\x7b\xc1\x95\x93\xb3\xea\x89\xc1\xc0\x2b\xbb\x29\x38\x06\x62\x42\xf7\x2e\x86\x0e\x06\x1c\xdd\xa1\x95\xa7\xad\xc6\xff\x33\xec\xa4\x33\x18\x64\x63\xd9\xd2\xb2\x54\x2c\xa5\xc2\x98\x0f\x53\x2a\xe5\x67\x4d\xea\x01\xda\x1e\x1c\x1d\x28\xc8\x1c\xb0\xed\x43\x30\xfb\xa3\x99\x6c\x80\x4b\xad\x1e\x60\x07\xa9\x71\xa9\xe1\x69\xe1\xa0\x58\x73\x35\xfc\x56\xc2\x34\xb5\x0a\xbe\x1b\xae\x36\x95\x77\x0d\x4e\x68\x04\x5e\xc1\x89\xcb\x6a\xf7\xe6\xec\x1d\xa4\x60\x36\x26\x3e\xfc\xd0\xa1\x65\x2c\xb4\x38\x7c\x1c\xce\x2b\x46\xde\xf8\x31\x72\xf3\x6c\xe4\x32\x7f\x89\xe2\x0b\x8f\xcf\x5a\x7c\x61\xcb\xad\x33\xd5\x5e\xc0\x31\xdb\xde\x18\xf2\x7b\x53\x01\x86\xa9\x00\xc3\x57\x5e\x80\x01\x76\x04\xf9\x5b\xac\xc4\x30\x60\x3b\xb1\x5e\x43\x6f\x25\x06\xea\x1c\x9b\xf5\x1a\xb6\x2a\x31\xb0\xbf\xad\x05\x88\x11\x46\x78\x74\x20\x42\xcc\xcb\xcc\xc9\xa2\x0e\x33\xb5\xa8\xad\x65\x68\xb2\x5b\x86\x70\xa2\x16\x15\xa4\xae\x5e\x63\x44\xcc\x16\x69\x00\x54\x85\x30\x54\x0b\x9c\x18\x03\x68\xa8\x51\x1e\x59\x16\x6a\x2f\x44\xa3\x25\xc6\x38\x91\x7b\x6b\x8d\x0f\x79\x78\x0b\x12\x94\xad\x0d\xfe\x20\x11\xbc\xf0\x82\x5a\xe6\x91\x57\x5b\xba\x8c\x76\x58\x72\x0c\x9e\x89\x07\x11\x82\x57\xc8\x20\x57\xf2\x41\xa8\x5a\x6c\x7c\x61\x5f\xbe\x8c\xde\xa5\x6d\xf1\x9a\x0c\xb3\x25\x39\x3f\x83\x58\xed\x39\x73\x10\x6f\x7b\xc5\x55\x32\x50\xad\x48\x62\xea\x20\xdb\xc6\x7f\x6f\xc8\x3f\xff\x63\x9f\x80\x1a\x05\x4e\xfa\xd2\x51\x30\x85\x83\xa9\x44\xd3\x1a\xad\xe4\xd0\x75\x8f\xf1\x91\x8e\x0e\xc2\x20\x05\x60\x30\x4d\xe9\x9c\x5d\x8f\x63\x05\x5f\x7c\x15\x05\x3d\xf6\x04\x5c\x84\xe0\x89\x31\x71\x29\x5d\xc1\x16\xec\x6e\x84\x9f\xe6\x38\x81\x16\xc7\x49\x31\x3c\xbc\xb8\x31\x71\x1f\x53\x8e\xe1\x80\x71\x9c\x1c\xc3\x23\x85\x44\x3c\x47\x38\xc4\xbf\x7e\x82\xe2\xf1\xc2\x1f\x0e\x84\x3e\x8c\x8c\x96\xc3\x71\x38\xec\x61\x80\x04\xba\x3d\xf6\x86\x3c\x1c\x21\x70\xe1\x6b\x49\x35\x6c\x06\x2b\x3c\xc9\x77\xbf\x13\xa8\x70\xbc\x24\x3e\x08\x52\x38\x72\xa8\xc1\xc1\x30\x83\xdf\x48\xd2\xe1\xfe\xd0\x82\xa0\xa7\x8e\xbe\xd4\x5b\x61\x05\x53\xa6\xdc\xb0\xf1\xeb\xcf\x94\x7b\x92\xe3\xff\x38\x4e\xff\x27\xe0\x46\xaf\xb3\x7f\xa8\x9a\xc1\xb6\x1c\xf3\x5b\x8e\xfe\xe6\x6f\x63\xbd\x38\xcd\x69\xee\x38\xec\xc7\x38\x2d\x6b\x07\xff\x5e\x67\xfd\x70\x37\x56\x74\xee\x77\x3a\xea\xc7\xf8\x33\x9e\xc3\x49\xdf\xed\xa0\x1f\x25\x68\x8c\x52\x77\x46\xde\xdc\x51\xaf\x8d\x73\xc8\x3f\x87\x33\x9e\xe2\x88\x1f\x1a\x41\xdb\xe7\x84\x1f\xae\x28\x1f\xc9\x01\x3f\x82\x03\x8e\xa4\x6d\x63\x68\xf9\x48\x87\xfb\x33\x39\xdb\x9f\xcd\xd1\xfe\x2c\x4e\xf6\x7e\x07\xfb\xd8\x7d\x38\xe4\x5c\x6f\x59\x21\x07\x41\xec\xb0\x58\x8e\xf6\x37\x77\xd8\x2c\x6b\x27\xf9\x20\x88\x5b\x0e\xf5\x03\x0e\xf2\xb1\x11\x25\x4f\x70\x8e\x8f\xb8\x91\xc3\xfd\x9d\xc3\xcf\xe1\x59\x9d\x97\x03\xcb\x02\x28\x27\x8f\x53\x1a\xa0\x79\xcb\x87\x35\xae\x86\x0a\x02\xc1\xd3\xc6\x1f\xb4\x4c\x59\x51\xba\x90\x12\x7c\xa8\x46\x00\x01\x2c\x54\x11\x98\x6a\x04\x1c\x9a\x6d\x4f\x8d\x80\xe6\x71\x92\xbd\xa6\xb5\x91\xbb\xa7\x50\x00\xd5\x23\xd9\x28\x27\xd0\x53\x28\x80\x08\x71\x4f\x39\x81\xbe\x42\x01\x44\xc8\x5b\xe5\x04\x3a\x0b\x05\x50\x41\xee\x94\x13\xe8\x2d\x14\x30\x8c\xca\xa1\xd8\xfc\x0c\x85\x02\x5a\xc4\xa0\xb3\x5a\x00\x11\x22\xd6\x14\x20\x56\x0b\x18\x14\x3a\x40\xaa\x16\x40\x84\x18\x6b\x0a\x90\xaa\x05\xd0\x2f\x6a\xab\xa6\x40\x67\xb5\x80\x01\xbb\xd9\xac\x29\x30\x55\x0b\x68\x8e\xa9\x5a\x40\x7b\x4c\xd5\x02\x3a\xc7\x54\x2d\xa0\x7f\x4c\xd5\x02\xc6\x40\x9c\xaa\x05\x4c\xd5\x02\xf6\x4f\x6a\xaa\x16\xb0\x6f\x4c\xd5\x02\x02\xe8\xa9\x5a\xc0\xe1\x31\x55\x0b\x98\xaa\x05\x4c\xd5\x02\xc6\x8c\xa9\x5a\xc0\x54\x2d\x60\xc4\xa7\xa7\x6a\x01\x43\xc7\x54\x2d\x60\xaa\x16\x30\xfc\xe5\xa9\x5a\x00\x9b\xaa\x05\x0c\x5f\xda\x54\x2d\x00\xc7\x54\x2d\x20\x8c\xa9\x5a\xc0\x54\x2d\x60\xcf\x98\xaa\x05\x0c\x98\xff\x54\x2d\x80\xf6\xfc\x54\x2d\xe0\xd0\xd8\x5b\x2d\xa0\xe5\x56\x1f\x21\x6d\x1e\x88\xca\x38\x5c\x32\x80\xba\xbf\x32\x17\x67\xc4\x92\x01\x03\x5c\xe9\xf3\xfe\x85\x3f\xb1\x56\x42\x67\xdd\x00\xaa\x7f\xbb\xaa\x2e\x40\xa8\x1b\x40\x84\x19\xab\x0b\x4c\x75\x03\xa6\xba\x01\xfb\xc7\x54\x37\x00\xc6\x54\x37\x60\xaa\x1b\x50\x8d\xa9\x6e\xc0\xfe\x31\xd5\x0d\x18\x32\xa5\xa9\x6e\xc0\x80\x31\xd5\x0d\x38\xf4\xde\x54\x37\x80\x34\xa6\xba\x01\xb4\x31\xd5\x0d\x98\xea\x06\x4c\x75\x03\x28\x00\xa6\xba\x01\x7d\xaf\x4e\x75\x03\xa6\xba\x01\x53\xdd\x80\xa9\x6e\xc0\x9e\x31\xd5\x0d\x98\xea\x06\xec\x8e\xa9\x6e\xc0\x54\x37\x60\xaa\x1b\xd0\x39\x7e\x3b\x75\x03\x88\x0f\xf2\xd2\xe9\x5c\x97\xca\xdd\x0a\xf3\x20\x13\x71\x91\x24\xfe\x5f\x77\xfa\x5e\xf4\xb8\x40\xdb\xd6\xbd\x0e\x30\x4c\xaa\x54\x26\x90\x68\xf4\xb8\x16\x6e\xdd\xeb\xa6\xe6\xcc\x22\x14\xc6\x11\x0c\x73\x00\xa7\xa6\x64\x30\x6b\xee\x64\xc2\xb3\x6c\xc3\xe0\xc3\x7d\xa8\x83\xfb\xb1\xd0\x3a\x13\x9d\x49\x04\x42\xf1\x45\x26\xc2\x32\xde\x4b\x75\xdf\xc3\x26\x5a\xdb\x70\xfa\x6e\xe7\xed\xdd\xd5\x33\xa9\xd0\xd9\x2f\x7b\xdd\x08\x7c\xa1\x4b\x17\x77\xc3\x36\x36\x40\xaa\x7f\xe0\x65\x94\xca\x69\x60\x84\xa7\x96\x09\xf5\x20\x8d\x56\x04\x8b\xea\x03\x37\xd2\x4f\xd4\x9e\xb5\xc9\xae\xdd\x28\xc7\xbf\xf8\x1b\xff\x56\x27\xf7\xc2\xb0\xcc\x2f\x61\xce\x3e\x15\xa8\x1b\xf4\x5d\x9b\xb7\x62\xc9\xcb\xcc\x41\xc9\x02\x67\x4a\x31\x3f\x3d\xca\x99\xc8\x9c\xaf\xc4\x75\x99\x65\xb7\x22\x31\xc2\x0d\x3a\x91\xab\xad\x77\x83\x39\x46\x87\x15\xc5\x8c\xc7\x9e\x85\x41\x6a\xb1\x50\x20\x1c\x69\x66\x23\xa8\x66\xbd\x8b\xc8\x66\xfc\x03\xa5\x15\x6c\xd9\xcb\xb8\x8a\x32\x83\x82\xff\x8d\xf8\x25\x58\xa9\xf5\xef\xd7\xce\xff\x6b\x9d\xde\x94\xca\xc9\x5c\xdc\x0a\x28\xb8\xd1\x6b\x3e\xbe\x5a\xd6\xfc\x0f\x44\x7d\x2b\xaa\x39\x83\xdb\x7f\x21\x58\xc1\xad\xff\x88\xd3\x80\xa0\x0f\x32\x2d\x79\x9f\x41\xd7\xcf\xd7\xa3\x6f\x5e\xa0\x8e\x82\xd6\x45\x28\x7d\xe0\xd6\x22\x0f\x0b\x9f\xb3\xef\xbd\x78\xf7\x85\xfb\xc7\xfa\x54\x96\xb0\x83\xe0\xff\xd1\x4b\x96\x02\xd6\x9d\xa1\x26\x80\x28\x78\xa9\xd5\x52\xae\x00\x55\xe2\x1a\xfa\x2e\x8d\x11\x6c\xad\x21\xa6\x63\xce\x3e\x68\x70\x42\x2f\xf5\x1b\xb6\x76\xae\xb0\x6f\xce\xcf\xef\xcb\x85\x30\x4a\x38\x61\xe7\x52\x9f\xa7\x3a\xb1\xe7\x89\x56\x89\x28\x1c\xfc\x87\xd7\x5d\x84\xb1\xe7\x78\x14\xbf\xc7\x8d\xdc\x48\xb5\x9a\xc1\x5f\xfc\x26\x84\x79\xcc\xb4\x9a\xf1\x99\xbf\x7c\x9d\x33\x22\xc9\x9a\x2d\xa4\x7d\xaf\x13\x9e\x7d\x02\xd2\x7d\x13\x11\xaf\x76\x6f\x08\x05\x25\x15\xe8\x54\x04\x54\xcb\x4c\x38\xb6\xd1\x25\x43\xc9\x07\x23\x95\x22\xec\x34\xf0\x09\x26\x95\x95\x50\xbe\xa2\x5f\x8e\x69\x23\x7d\x1f\x46\x0e\x71\x5f\x78\xa0\x14\xfe\xdc\xbe\xe7\x1f\xfd\x7c\xc2\x2d\x0a\x0b\x73\x83\x8f\x5f\x3f\x78\x52\x2b\x1e\xcf\x1f\xb5\xb9\xf7\x47\xee\xc5\xb1\x19\x6e\x8e\x3d\x87\xd5\x9e\xff\x1e\xfe\x87\xc4\xd8\xef\x3e\xbd\xfd\xf4\x86\x5d\xa4\x69\x28\x69\x53\x5a\xb1\x2c\xb3\x50\xfb\x60\xce\x78\x21\x3f\x0b\xe3\x55\xfb\x33\x76\x2f\x55\x4a\xd3\xef\x4b\x99\xfe\xcf\x6e\x84\xc3\x31\x40\x3a\x1a\x28\x54\xf4\x49\x2a\x5e\xdc\xfc\xd8\x7b\x88\xad\xe3\xfb\x18\x5e\x41\x6b\x4f\x28\x70\xd2\xac\x97\x53\x45\x37\xf4\x2c\x05\xe2\x97\x78\x24\x7f\x49\x1d\xa0\x24\x1d\x4a\x9a\xc1\x24\x7d\xd6\xac\xc8\xd2\x2b\x91\x58\x4f\xf3\xaa\x7a\x49\x20\x5d\x07\xed\x2a\xc4\x4b\x71\x87\x05\x8f\x18\xb7\xb6\xcc\x91\x9d\xf6\x66\x7e\x4b\xc7\x96\xd2\x59\xd6\x2a\xec\x42\x4b\xb3\x27\x1e\xae\x9f\x13\xcd\xef\x3f\xc6\xfe\x47\xc6\xb0\xad\x9b\xda\x98\xd4\x96\x1f\x37\xd4\x62\x21\x65\xfb\x79\xf9\x22\xf2\x1e\x38\x0a\x28\x08\xe2\x6a\x85\x6c\xce\x6e\x77\xe1\xf6\x00\x05\x69\x28\xbc\xef\x45\xaa\x0c\x8d\x7b\x5b\x9f\xd9\x8a\x98\xeb\x9b\x68\xc4\x8e\x31\xdc\x68\x29\x57\xa5\x01\x22\x7f\xce\xad\x95\x2b\xe5\xf9\x0d\x14\x4a\x39\xa7\xc8\x56\xbd\x77\xba\x30\x52\x9b\xde\xaa\x62\x3b\xc5\x61\xe2\x6b\xa8\xc2\xce\xd9\x67\x6e\xa4\x2e\x6d\x0c\x82\x4b\x74\x5e\x68\x45\xf0\x61\x7a\x41\xa9\x11\xe8\xd7\xac\xe9\x52\x7d\x22\x10\xf5\x42\xa7\x18\xf9\xd6\x03\xf2\x3a\xbe\x77\x91\xe6\x12\x0c\xa7\xec\x52\x2b\x67\x34\x0a\x2f\x36\x48\xf8\xe9\x99\xbf\x7f\x85\x81\xc8\x3c\xc2\x34\x8d\xc5\x28\x3c\x2b\x1a\x45\xcf\x60\xd6\x68\xaa\xe4\xd5\xd7\x92\xea\x6b\x7d\x4c\x51\x17\x65\x2c\xc0\x50\x6d\x01\x7c\x24\xae\xe1\x32\xe3\xd6\x7a\xba\x88\xdf\x80\xf2\x41\x7d\x50\x2b\x7b\xec\x59\x5d\x72\xc8\xb4\x76\xb4\x9b\xb4\xd0\x03\x91\xa9\xa1\xc7\xc5\xf6\x6a\x06\x20\x5b\x5b\x94\xad\x75\xa9\x80\x11\xa7\x96\xb8\x2a\xc6\x4e\x10\x37\xe1\xee\xcc\x12\x23\x41\x7b\x3c\x01\x13\x76\xfc\x29\xc9\x4a\xeb\x84\xa9\x7f\x25\x48\x9a\xee\x51\xe3\x0c\x79\xc6\xee\xc5\xe6\x51\x9b\xaa\xa6\x54\x9c\xed\x80\xd2\x4f\x61\x31\x60\xc1\x8d\xd6\x31\x7f\x20\xc2\xb0\x85\x88\x5a\x5a\x00\x45\x5e\xf9\x85\xd7\x2f\x40\x00\xf1\xa2\x4b\xe5\xe3\x8c\xc6\xac\xc5\x86\x25\x46\x60\xbd\x2e\xde\x46\xbd\x3e\x66\x8b\x52\x63\x98\xa9\xa7\x72\x80\xaa\x57\x4b\xb0\xe8\xb4\x55\x10\xa0\x9d\x71\xc6\x3d\x70\xa3\x8e\x92\xa2\x3a\xc9\xb4\x61\xff\x14\x46\x87\x2a\x5f\x46\x20\x27\x8f\x3f\x1f\x85\x53\x1a\xc1\x53\xa9\x84\xb5\x3f\x78\xf4\x1a\xa4\x60\xb6\x30\x94\x67\x59\x0d\x8b\xad\x50\xef\xc7\xe5\xf4\x2c\x5a\xf8\x4b\x0b\x36\x55\xcf\x6d\xfc\x6e\x55\x70\x62\x75\x28\xf0\x26\xf3\x74\xc3\x1e\xd7\x42\xf9\x4f\xf5\x0a\x18\x96\xd5\x1a\x0d\xa0\x2b\xbe\x7f\xf1\xf1\x2d\xcc\x34\xd1\x0a\xd9\x3e\x3d\x42\x3b\x68\x6c\xdb\x6b\x5c\xf3\x07\xc1\xac\xe3\xae\x04\x1f\x18\xcf\x3c\x2d\x3f\xb9\x33\xa5\x38\x01\xae\xd7\x0b\xb5\xc9\x13\x57\xd2\xcd\xef\xff\x2b\x30\x44\xa1\xd6\x5c\x25\x28\x12\x9d\xdf\x8b\xc2\x9e\x5b\xb9\x9a\x29\xe1\xbc\x84\x7e\xfe\xea\xd5\xab\xff\x1f\x30\x44\x58\xd6\x7f\xf9\xe6\xcf\xff\xe5\x9b\x3f\xcf\xf3\xa3\xeb\x63\x5e\x03\x6f\xe2\x47\xad\x8b\xb5\xd4\x28\x8a\x1a\x86\x81\xa0\xd5\xbe\x1f\x51\x6d\xaa\x60\xde\x79\x8c\x1f\xaa\x3f\x5d\x36\xdf\xc6\x25\x59\x9c\x2f\x75\xae\x38\x02\x7a\x20\x69\xae\x5e\x45\x2b\x4b\x2b\x53\x07\x2e\x26\xc5\xda\x3b\x40\x8f\xa1\x5a\x77\x67\xed\xcd\xfa\x79\xb5\x23\x83\xb6\x9c\x31\xcc\xf0\xf4\x66\xeb\xdd\xd6\x41\x35\x7f\xa4\x11\xee\x70\x58\x20\x9b\xe2\x7d\x63\x2b\xa3\xcb\xe2\x2c\x30\xb0\xda\xde\x58\xda\x5e\xc2\xe0\xb4\x5f\x5a\xa5\x19\xcd\x19\xf2\x81\xd6\xb4\x6a\x55\x27\xb8\x29\x08\xb2\x8c\xe7\x29\x29\x4b\xfc\xeb\xfb\x93\x57\x4c\xa9\x80\xe7\x94\x0a\x82\x91\xfb\xe4\xa3\x86\xfa\x77\x92\x89\x15\x4f\x36\x27\xed\x39\x46\xee\xe3\xd7\x7c\x46\x72\xa4\xa2\x49\xd1\xeb\x88\x32\x91\x0e\xe7\x8a\xd8\xce\x55\x70\x74\x02\xb3\xc5\xbb\x00\x9c\xb2\xb4\xa4\xc5\x47\x0e\x18\x90\x86\xad\xb9\x4a\x33\x61\xf6\x6a\x12\xfd\x54\xd3\x6b\x0d\x01\xd2\x0c\x26\x39\xcf\xfb\x4e\x15\xdc\x88\x21\x82\x2d\x2b\xd6\x9c\x2d\x05\x77\xa5\x11\x20\x37\x61\xe1\x57\xc8\x77\x0b\xa8\xb4\x2c\xfd\x8f\x24\xb3\x6f\xef\x8d\xae\x94\xf3\x27\x89\x8c\x2d\x8c\xf1\x32\x85\xb4\x05\xa9\x86\xe5\x62\xd3\x70\x22\x56\x73\xe9\x92\x6e\xfc\x27\xfa\x80\x36\x27\xe0\x3f\x11\x0f\xb8\xfe\xc0\x51\xb6\x4e\x24\x25\x08\x71\x5a\x39\xf1\xa5\x27\xdb\xb2\x4d\x62\x6e\xc3\xab\xc1\x42\x5e\x49\xda\x91\x18\xf8\x3b\xee\x51\xbb\x8f\x74\x0f\x54\x75\x0b\x9d\xc9\x64\x73\x1e\x27\x3e\x4b\x70\xe6\xe7\x47\xf9\x8a\xe3\xf6\xbe\xd6\xa6\x05\x48\x0c\x95\x5c\xb4\xfb\xcd\x6e\xec\xa5\xf3\xe4\xa5\xfd\xc1\x53\xd3\x81\x05\xbb\x4f\x2e\x2a\x7d\xc2\x96\x45\x34\xb5\x67\x48\x99\x91\x78\xd0\x63\xa5\x3d\x63\x40\x39\x2f\x0a\x81\x52\xa1\x0c\x32\x67\xb7\x3a\x17\xec\x41\x67\x65\x2e\x00\xaf\x2c\xfa\x60\x29\x50\xd7\x82\xfd\xb5\x5c\x88\x4c\x80\x8d\x2e\x90\x00\x08\x29\x7a\xf4\x1f\x59\xcb\x02\xb5\x76\xee\xc2\x07\x68\x53\x5d\x20\x80\xe0\xfa\x00\xb4\x7b\xc3\xfe\x5d\xb1\xd7\xa8\xfe\xea\x47\xf0\xb8\xff\x70\xf5\x96\x72\xd5\x18\x5e\x37\x0f\xe7\xfb\x5b\x38\x08\xf6\x0d\xc2\xb1\xc2\xad\x64\xca\x16\x68\x12\xf4\x4c\xe3\x85\x12\x8f\x6c\x29\x33\xd2\x9e\x82\xb2\x24\xaa\x6a\xe7\x61\x07\x23\x7d\xa9\x16\x10\x3e\x4a\x09\x89\xf8\x16\xe7\x55\x08\x13\x6d\x08\x0b\x19\xf2\x35\x3e\xdd\x9c\x86\x14\x67\xf3\x38\x33\x8f\xb3\xd9\x6c\xc6\xfe\x9d\x22\x8a\x45\x86\x78\xd6\x3a\xad\x8a\x6f\xe6\x3a\x95\xa1\x88\x78\x75\x66\x04\xa8\x9e\xea\xd7\xd3\xb4\x31\xc0\x00\xf7\x60\xde\x1f\x81\xd3\x30\x2e\xfc\xe9\x8f\x44\x67\x37\x2d\xb7\xd9\x94\xea\x62\xd4\x7d\xf3\x3b\xef\x51\xaa\x92\x5f\x04\x13\xca\x99\x0d\x36\xa5\xd6\xd4\x4a\x69\xd5\x15\xf3\x04\x22\x01\xa5\xed\x47\x2b\x6c\xc5\xb9\x23\xa1\x97\xe1\x5c\x28\xa2\xef\x07\xbe\x61\x3c\xb3\x68\x70\x14\x20\xaf\xdd\xb6\x29\x3b\x4a\x59\xe1\xb7\x85\x26\x95\x67\xd8\x02\x01\x67\x7a\xad\xd3\xad\x3f\x37\xa2\xc1\x09\x30\x6b\x4e\xb9\x3b\x47\xe6\xf8\xbd\xb0\xac\x30\x22\x11\x29\xb8\xb2\xfa\x5d\xa3\x2c\xda\x4d\xab\x6d\xed\xdf\xaf\x67\xc6\xad\x8f\x5a\xdd\x68\x4d\xa8\x5c\xd0\x16\x46\x1a\x16\xab\x90\xf2\x52\x63\x0a\x58\x62\x4c\x49\xb9\xce\xdc\x82\x55\x5a\xcd\x8c\xd6\x20\x3d\xa2\x24\xe2\x4c\xb4\xf3\xb5\x6e\xf8\x03\xcf\x64\xca\x1d\x89\xec\x46\xaf\x33\xe3\xb5\x98\xe9\x34\x13\xca\x96\x26\x16\xdb\x77\x2c\xd5\x02\xe2\x74\x08\x10\xfd\x2d\xe2\x96\xfd\x78\xf5\x96\xbd\x62\x2f\xfc\x7c\x5f\x02\x8e\x2d\xb9\x04\xab\x80\x75\xdc\x6c\xed\x04\x01\xaa\x5c\xc6\x69\xb4\x84\x7d\xb6\xe4\x99\x15\x67\x5e\xd1\xb0\x65\xb2\x8e\x2b\xa7\xa9\xab\x95\x2f\x5c\x18\x30\xb2\xa5\x73\xea\x95\xa3\x5c\x89\xfa\x52\x52\xaf\x1c\xf1\xb8\x30\x6c\x6c\xd0\x95\xeb\xbf\x3d\xd4\x58\x0c\x16\xef\xc3\x8f\x56\x10\xf2\x9e\x76\x48\xed\x8f\xcf\x42\x6a\x9b\x81\x27\xfe\x72\xb4\x76\x87\x82\x5d\x70\x03\x72\xe1\x78\xca\x1d\x0f\x44\x3a\x82\xd8\x87\x15\xc3\xe9\xec\x0e\xa9\xde\x7e\x80\xc8\x7e\x3b\x49\x75\x27\x56\x50\xd0\x6b\x0f\xa9\xfe\x8a\x08\xb1\x15\xef\xa5\x2a\xbf\x60\x38\x12\xc1\x26\xb6\x83\x7d\xb7\xef\x00\x00\x4b\xe2\x3d\x81\x23\x45\x79\x3a\xa5\x45\x37\xb7\xe5\xe9\x48\x8c\xda\xda\x60\x8d\xa1\x81\xa2\x52\x89\x91\x97\xc0\xc1\x65\xc0\x99\xe1\x2a\xd5\xf9\xce\x8c\x63\xa3\x91\x21\xf7\x64\x4e\x16\x25\xfe\xd5\xe8\x1a\x01\xf2\x18\x0c\x1e\x96\x6d\x9b\x89\x07\xd1\x1b\x1a\x87\xa3\x1d\xe6\xe3\xdf\xf3\x2a\x48\x3c\x63\x00\x14\x02\x81\x07\x54\x8e\xaf\x83\xf3\xdb\xc8\x47\x8b\xa5\x1d\x18\x45\x6b\x74\x46\xb2\x2e\x6f\x37\xba\xd0\x59\x08\xee\x88\x8b\xf5\x80\xbe\xf2\xb5\x3a\xa2\x25\x7d\x9b\xd0\x6c\x8a\xad\xb5\x42\xf4\xda\xd7\xbd\xd6\x92\xc4\xce\xd9\xf6\x5a\xbd\x14\xd0\x5e\x2b\xb0\xdf\xaf\x79\xad\x03\xe2\xb3\x9b\x06\x18\xd0\x2d\x87\xf2\x9c\x8b\xaa\xa3\x06\x98\x6f\x6c\x83\xd5\xa0\xbd\x54\x1a\x52\x02\x4c\x10\x74\x40\x6c\x92\x0a\xcb\xed\x54\x7b\x04\x75\x34\x62\x00\x0f\xbd\x9c\x4c\xf5\x3e\x3a\xd1\x73\x6e\x36\x5e\x11\x9e\xb3\x1d\x96\xa6\x82\x5f\x80\x62\x1d\x89\x32\x35\x76\xf5\x81\x9c\xb6\xcd\x90\xe3\x24\x67\xe6\x0c\x93\x32\x86\x16\x4a\xa3\xc7\xe4\xdb\x8d\x4d\x1c\x25\xe1\xb2\x85\x18\xb7\xf8\x16\x5b\xeb\x2c\x6d\xf4\x5d\xa9\x02\x2a\xd3\x08\x97\x76\x75\xd3\x66\x88\xd2\xdc\xf3\xe0\xe0\x80\x28\x95\xc7\x61\x6d\xdc\x20\x88\x2f\x82\x01\x6e\x47\x8e\x79\xc9\x72\xa8\xbf\x17\x75\xb9\x8c\x97\x8a\x92\x85\x4c\x3e\xd5\x3d\x9b\x14\x02\x15\x2c\x14\x36\x30\x4a\x64\xac\xe0\x86\xe7\xc2\x41\x47\x3d\x12\x7d\x40\xa1\x87\x76\xcf\x06\x25\xbf\x52\x63\x55\xd9\x4e\xc0\x63\x08\x57\xe5\xf1\x93\x1b\x0c\x2c\x1f\x56\x2b\x6f\x40\xee\x0b\x08\x57\xa3\xa6\xfa\x39\x66\x29\xfd\x4c\x73\x1d\x92\xa3\x33\x83\x13\x20\x3d\x48\x35\x65\x0d\x4a\xdf\xa1\x93\x89\x47\xa9\x52\xfd\x68\xc7\xab\x2e\x7f\x43\x00\x75\x68\x6b\x88\x44\xab\x78\xca\x18\x77\xc0\x7e\xf5\x25\xba\x7e\x3c\x05\x21\xa9\xba\xbc\xc5\x4c\xb6\x85\xf6\xa6\x43\x75\x1e\x94\x60\x8a\x4e\xfe\xb5\x28\x19\xc7\xd6\x17\x56\xb9\xe5\x97\xc6\xc3\x76\x92\x67\xb7\x85\x48\x46\x08\x5e\x3f\x7c\xb8\xbd\x68\x03\xf1\x62\x18\x26\x38\xfa\x75\xfa\xdf\xa9\xb2\x57\x15\xba\xf8\x28\x16\x6b\xad\xef\xd9\x8b\x86\x4f\x79\x5d\x2e\xe6\x89\xce\x1b\x7e\xb5\x99\x95\x2b\x7b\x1e\x10\x7a\xe6\x57\x43\xcd\xfb\x94\x2a\x03\x4a\x1e\x79\x4b\xdd\x0e\x12\x27\xcc\x92\x6a\x45\x44\x88\xfe\x20\x43\x88\x40\xe0\x59\xbb\x1b\x03\xb4\x16\x43\x35\x89\x50\xef\xea\x78\x4c\x2f\xdb\x66\xc5\x9a\xcf\x50\x39\xf3\xc8\x27\x2d\x26\xa8\x84\x24\x13\x22\xcc\xc5\x06\x12\xb9\x20\x5c\xc3\xab\xa3\x18\x86\x0a\x53\x0e\x57\x1b\x76\x20\xf8\xd7\x89\x40\x97\x19\x5f\x3d\x8b\x3a\xb0\x8b\xa3\xfd\x5e\xf8\x38\x7a\xf0\x34\xc6\xf9\xc7\xe0\x0e\xe2\x52\xf7\xa3\x09\x22\x40\xcc\x3c\xaa\xcf\x8d\x8a\x90\xbd\xa7\xdb\x38\x37\x2a\xbb\xeb\x3f\xdd\xe7\x3b\xb7\xca\x34\x3b\xf2\xb8\xc0\x44\x1b\x5e\xf7\xb4\x31\x72\x9d\xda\x64\x4b\xdc\x85\x1d\xc3\x6e\x97\xd9\x96\xba\xb3\xa8\x34\xed\x18\x78\x7b\xcc\xb7\x44\xe8\x7b\x4c\x64\xbb\x6c\x66\x00\xff\x62\xcf\xc2\xc3\xd8\x40\x3e\x46\x04\xd9\xe0\x76\x7d\xd4\x8f\xbc\xf6\x83\x17\xe9\xd0\x15\xb9\x69\x22\x2f\x95\x02\x3e\xef\x8d\x3a\x76\xbe\xb5\x6d\xe5\x47\x0f\x8d\xff\xbb\xdd\x79\xbb\x49\x48\xe3\x45\x6b\x3f\xd5\xb3\xc4\x90\xad\xba\x13\xbd\x77\x8c\xc8\x9a\xfa\xef\x61\xd9\xb3\x90\xd0\x4d\xca\x5d\xe9\x3d\x21\xa7\x33\x81\xb9\x31\x43\x02\xb6\xf7\x86\x87\x9d\xda\x26\xb4\x6e\x3c\x1a\x1e\x3f\x7c\x17\x53\x87\xfc\xee\xde\x55\xdf\x81\xdb\xe5\x1c\x87\x58\x30\x82\x26\x1b\x66\xe8\x35\x61\xb5\x61\x7e\x8f\x5d\xe8\x34\xde\x68\x5e\xed\x0c\x14\x79\xfe\xef\x55\x75\xa3\x33\xb1\x5c\x8a\xc4\xfd\x8f\x5e\xf0\xa5\x8d\x09\x06\x55\x8c\x6e\x55\x94\xf0\xbf\xc7\xff\xfa\x1f\xc7\xcc\xf4\xc4\x99\x0d\x36\x0b\xbc\x83\xd7\xb6\x92\x41\x70\x3b\x10\x22\xd5\x2c\x00\xeb\x8c\xad\x1e\xb0\xb2\x4c\x48\x00\xcb\xb2\x16\x40\x4b\xca\x3c\xc2\xd1\x4e\x06\xd0\x8f\x22\xad\xcb\x23\x09\xf6\x51\x87\xc2\xf3\xe2\x8c\x5d\x43\xf4\x6e\xfd\x17\x12\x78\x4f\x82\x3f\x6a\x2c\x53\x7f\xec\xf8\x69\x72\xa1\xd0\xd6\x71\xfc\xb5\x2e\x0b\x8a\x7b\xd6\x2a\xf0\x59\x5f\x2b\xda\xf2\x2a\x3b\x70\xf7\xb9\xdc\x8b\x0d\xb1\x8a\x6a\x28\x3d\x18\x8a\x97\x86\xe8\xdf\x0a\xb1\x63\x32\x0c\xd6\x15\xfc\x37\x1a\x03\x81\x92\xc5\x3a\x5f\x48\x85\xf7\x18\xa7\xe8\x74\x63\x96\xf1\xc8\x89\xdd\x3c\xfd\x2b\xd4\x25\x0d\x3a\xd0\x21\x15\x4a\x5b\xa7\xfa\x69\xb7\x1e\xe9\xde\xca\xa2\xb4\x1d\xd3\xb5\xcc\xb2\xb7\x82\x68\xb3\x00\xe8\xbb\xff\x2c\x79\x46\x3b\xdb\xa6\xdb\x1f\x5f\x8b\x80\x76\xba\xa8\x3d\xca\x2c\x4d\xb8\xa1\x1d\xc7\x52\x9b\x98\x43\x67\x43\x7a\x6f\x48\xdc\xe0\xaa\x22\xc3\x35\x36\xd2\x84\x2c\xb4\xa0\x71\xe3\x64\x52\x66\xdc\x30\x4f\xbb\x56\xda\x90\xca\x4c\x0e\x93\x59\xaa\x2b\x77\x2b\x12\xad\xd2\xe1\x86\xd7\xbb\x6d\x08\x4d\x2c\x70\x18\xaa\x28\x7b\x73\xb1\xab\x65\x63\x4c\x51\x8b\x18\xb0\x17\xad\x5c\x5f\xff\x14\x92\x5a\x12\xcc\x8a\x00\x9e\x61\x62\xdb\xa3\x6c\xe7\x91\x4a\xcb\x24\x76\xf5\x78\x59\x73\x4d\xe2\xdd\x0e\x54\x6c\xce\xfe\x5c\x45\x67\x9f\x55\xd9\xe3\x8e\x41\x48\x65\x98\xbb\xbf\xf6\x44\xfc\x0f\x28\x53\x13\xc9\xa5\x36\xe2\x41\x18\xf6\x22\xd5\x00\x17\x1a\x3e\xbc\x9c\xb3\xff\xbf\x30\x34\xe6\xe5\xaf\x8a\x12\x2b\xec\x21\x10\xc8\x4d\xb4\xb4\xb9\x10\xa2\xca\x2d\x7b\xc5\x5e\x00\x68\x12\x4c\x99\xe7\x22\x95\xdc\x89\x6c\xf3\x32\xda\x53\x30\x37\x92\x82\xa4\xcf\xeb\x91\x21\x1b\xb0\xf7\x18\xaf\x5b\xec\x09\x35\xa7\x11\xbc\xa9\x12\xb3\xf4\x4e\x41\xdb\xba\x34\xed\xb0\xb8\x49\xd6\xc8\xb1\x89\xac\xa9\x42\xe8\x7f\xf8\xbb\xc1\x99\x11\x2b\xa0\x17\x78\xfb\x8f\x4c\x2d\x8e\x9a\xdc\xd4\x0b\xac\xe7\x01\xc7\xcd\x4a\x1c\x90\x07\xdb\xf4\x09\x1e\x0c\xa2\x16\xa2\xe9\x82\x27\xf7\x65\x11\x40\xec\x85\xd0\x2f\x99\x16\xdc\xad\x3b\x88\x65\x3b\x27\xd0\x3f\xdb\x9a\xc1\x52\x66\x02\x41\x40\x58\x11\xcc\xe7\x20\xac\x5e\x25\x82\x74\x86\xfd\x87\x62\xc4\x92\xb8\xa0\x1b\xb1\x6c\xa4\x93\xd1\xb6\x94\x91\x05\xfe\xba\xd6\x49\xf7\x15\x26\xa2\xee\xbd\x54\x3d\xfe\x21\x6a\x85\x8c\x5e\x0d\x7c\xc0\x41\x74\x5e\x23\x23\x8a\x4c\x26\x9c\x8a\x5f\xf1\x71\x4c\x32\x87\x54\x30\x2b\x8d\x48\x99\x2a\xf3\x85\x30\x9e\x61\x56\x8f\xf4\x55\x1e\x04\xa3\x58\x4d\x68\xfc\xb9\x8a\x94\x95\xc5\xae\xf7\x27\x6d\x08\x54\xaf\x0f\x93\x1a\x5a\x8d\x00\x0a\x7d\xb7\x8a\x17\x76\xad\x1d\x21\x1d\x72\xaf\xff\xd4\xef\xcc\x67\xc8\x3e\xb8\x6d\x42\x6a\x54\xd0\xda\xfe\xbd\x8b\x80\xee\xe6\x76\xf1\x3a\x43\x2b\xbc\x5f\xa5\xf7\xd5\x4e\xad\x0e\x88\x32\x56\x9e\xe1\x0f\x5c\x66\x7c\x91\x09\xc8\x0b\x68\x0a\x2b\x60\x24\xc3\xd4\x76\x76\x92\x1a\xf9\x20\x4c\x57\x22\x45\x25\xe1\x58\xcc\xbe\x39\x79\x68\x2d\xcf\x09\x73\x72\x78\x89\x04\x64\x46\x70\x1f\x74\xa9\xba\x0a\xad\xb5\x99\x6c\xe3\x95\x46\x0d\xda\x3a\x3b\x06\x95\x23\x28\xe5\x87\x25\xa6\xba\x2c\x64\x8e\xdb\x35\xf3\x0f\x25\xdc\x9c\x4b\x25\x1b\x91\x7b\xec\xb6\x41\x6f\x2b\xd0\xcd\xe6\x1f\x5d\x14\x15\x24\x00\x60\x1c\xa9\x34\x50\x18\xa6\x2b\x89\xaa\x97\x42\x1f\xda\x82\xf0\xc3\x02\x22\x16\x60\xd1\x60\x4a\xf1\xd2\xff\xe7\xfe\x64\x28\xf4\xb9\x36\x3d\xaa\x5d\x08\x4b\xb5\xb6\xc0\x34\x3c\xcb\x1a\x96\xf7\xce\xdd\x3a\x4e\xa8\x6d\xc1\xe7\x2e\xc8\xc0\x14\x87\x40\xc8\x90\xaa\x09\x50\x2c\xd8\xc8\xd8\x07\x2f\xe2\x60\x49\x59\x00\xcd\x4e\xdf\x9c\xf6\x49\x38\x64\xe9\x06\x17\x6d\x74\xc1\x57\x9c\xd2\xd2\xaf\x5d\x82\x7c\xeb\x65\x96\x0a\x27\x4c\x0e\xee\xcb\xb5\x7e\xc4\xdf\xfb\xa5\x7f\x4f\xbd\x8b\x00\x45\x84\xea\x2e\x50\xc3\x43\x63\x7d\xab\xc6\x96\x62\xdd\x9b\x7e\x8d\x1e\x2a\x79\x3c\xf2\x0d\xe3\x46\x97\x2a\x14\xc5\xa9\x75\x93\x0f\x5b\x13\xff\xa8\x55\x3f\x50\x69\x83\x77\xbe\x6d\xfb\x5f\x08\xc7\x99\x54\xec\xf5\xfc\x75\x6f\x33\x4b\xf2\xb1\x50\x62\x66\x76\x4b\x19\x83\xa2\x88\xf6\x15\xbf\x7f\x75\xfc\x0c\xde\xa9\xa3\xcd\xce\x08\x9e\x7e\x52\x59\xaf\x19\xac\x35\xc3\x0f\x88\xd0\xf0\xf2\xac\xa2\xe7\x90\x9b\x03\x7f\x7a\x34\xd2\x89\x5a\xb2\xef\x3d\x8e\x17\x90\xd5\xc2\xb4\x69\x72\xe7\x97\xed\x34\x07\x78\x84\xb6\x6c\x4a\x56\x87\x2d\x17\x4f\xa6\x0f\xe1\xa2\x03\x92\x57\xe4\xa1\x19\x1a\xf2\x04\x52\xd1\x5c\xfa\xc9\x09\x7b\x81\x4f\x12\x40\x42\x02\xd2\xd1\xd0\x23\x6c\xd3\xbb\x2f\x45\xaf\x49\xad\x6d\xb3\xfe\x52\x70\x95\x8a\x14\x14\x84\xce\x3d\xeb\x37\xef\xb4\xf7\xb4\x63\xcf\xfe\x2c\xd6\xfc\x81\x60\xf8\xb0\x32\x97\x19\x37\x19\xc4\x75\xdd\xe2\x0a\xd9\xa2\x74\xcd\x8a\xb2\x55\xcd\xd8\x46\x2d\xd4\x5e\xc0\x7f\x78\xf1\xf9\xe2\xe6\xa7\x8f\x17\x1f\xde\xbd\x04\x4a\x28\xe2\x2e\xd4\xbe\x86\xe6\x4a\x1a\x9f\xeb\x57\x73\x0f\x21\x44\x38\xf0\xb8\x0e\x7f\x52\x40\x5b\xc3\xbf\x49\x14\x3b\x2f\xb1\x59\x27\x13\x5f\x92\xac\xb4\xf2\x61\xc7\x2b\xda\xa0\x8c\xdf\x1d\x09\xb9\x28\x71\x6f\xb3\x9a\x93\x77\x3e\xd5\x13\x57\x41\xd2\xfa\xfb\x94\xcb\x5e\x65\xde\xde\x93\x54\x79\x7b\xdf\x52\xa3\xe1\x0f\x89\x49\x51\xae\x6b\x4b\x93\xd6\x89\x83\x41\xc8\x5e\x69\xe5\xf7\xa2\x4b\xf1\xee\x97\x96\xba\x79\x13\xe1\x20\x21\x34\xb5\x43\x18\x1b\x26\x55\x5e\x7b\x68\x2c\x15\x49\xc6\x0d\x88\x93\xc1\x76\x55\x55\x18\x86\x5d\x81\xa7\x3a\x71\x30\xe1\x59\x26\x52\x60\x9a\xc7\x90\x26\x29\x1c\x9c\x4c\x51\x49\x76\xbd\xa3\x5e\xa1\x9e\xcb\xd1\x1f\x2a\x7a\x94\xeb\xd3\x3d\xd7\x8e\x59\xf6\xdd\x3b\x91\x17\x6f\xe5\x01\xee\xd4\xbe\x7a\x22\x2f\x2a\x55\x08\x82\xf4\xeb\x6a\x93\x80\x5c\xcb\x52\x25\xe0\xe7\x39\x0f\xea\xd8\x81\xc5\x5e\x28\xf6\x1f\xe0\xac\x7b\x2b\xcd\x7f\xc4\x44\xb6\x47\xbe\xb1\x0d\x6e\xe4\x55\x86\x73\x97\x17\xb1\x5a\x1c\x2a\xb0\x10\xc0\x3a\xf2\xae\xa6\xd2\x7a\x7e\x74\xc9\xc1\x57\x4d\x54\x55\x4f\xf7\x17\xce\x89\x41\x8e\x46\x58\x27\x93\xf8\x3f\x8b\x4c\x2f\xce\x73\x6e\x9d\x30\xe7\xa9\x4e\xce\x73\xae\x4a\x9e\xfd\xe4\x7f\x9d\x1b\xeb\x7e\x9f\xe0\xa7\x0f\x07\x33\x50\xc4\xaf\x5c\xa4\xb2\xcc\x89\xd3\xbf\x75\xda\xf0\x95\xf8\x00\xef\x54\x81\xf1\xb0\xd5\x48\x2e\xf1\x77\xf0\x53\x75\x56\x9c\x8b\x89\x86\x98\xa2\x11\x0b\x38\x3c\x85\xf2\x59\xf9\x4f\xf1\x5e\xe6\xb2\xc3\x9f\xdf\x0b\xa5\x13\xb5\x3b\x7e\x3c\x74\xd7\x0a\xee\xb5\x9a\xed\x09\xf5\x25\xe8\xff\x19\x38\xc8\x65\xeb\x3a\x48\x1b\x80\x05\x15\x8e\xdf\xef\x5b\x03\xf2\x9e\x4a\x58\x0d\xe4\x5a\x5a\x76\x0a\xd2\xfa\x36\xa2\x1c\x46\x0f\x23\x0a\x6d\xa5\xbf\x96\x9d\x93\xbf\xa9\x1e\x43\xa9\x2c\x5a\x6e\x1b\x7f\xaf\x38\xe9\x5a\x67\xa9\x45\xdb\xdf\x1e\xa7\xf4\xe1\x6a\xe2\x5d\x17\xf1\x10\x23\xf8\xfa\x4a\x73\x0f\x2d\xc5\x7d\xb0\xcc\x76\x07\x0e\x1f\x44\x50\x23\x9c\x50\x7e\x33\xae\xa1\xca\x51\xcf\x91\xb6\x9e\xdd\x29\x79\x0a\x7f\xf4\xea\x9f\xce\x32\xfd\x08\x26\x84\xbd\xc4\x45\x7b\x5d\x00\x0d\xf8\xd1\x72\xb9\xbd\x33\x5d\x27\x9b\x9a\xcd\x4d\xb9\xd7\x62\xd2\x4d\xd3\xee\x85\x28\xde\x72\xb9\x5f\x7f\xee\x73\x10\x76\x1b\x8c\x3d\xe8\xbf\xe8\xd2\x3c\x17\xec\xf7\xdc\xee\xa5\x5d\x4f\x87\xfc\x41\x2b\xb7\x7e\xae\x69\xdf\xf1\xd5\x5e\x16\xd9\x21\x69\xf6\xd0\xe1\x2e\xc9\xc5\x7f\xf1\x6f\x42\xdc\x3f\xd7\x6a\xfe\x2e\xf8\xb3\x1c\xf0\x21\x4a\xd5\xb9\x15\x85\x29\x55\xc7\x5b\xfb\xef\xc0\x21\xb9\x6e\xaf\x44\x37\xc3\x6f\x90\x09\x49\xbb\x0f\x48\x37\x21\x69\x3f\x8b\xc1\x68\x90\xb8\x15\x94\xad\x9b\xba\x0f\x7b\xb3\x24\xfb\x6e\x10\xf2\x45\xe8\xee\x75\xd6\x88\x0b\x39\x63\x55\x45\xd4\x6b\xa3\x17\x82\x09\x97\x60\x3f\xc0\x32\xb4\x15\xc1\x32\x59\x31\xe0\x75\x07\x68\x6c\xed\xe3\xe5\xcc\x4b\xa3\xd5\xff\xd2\x8b\x6d\xf1\xa3\x8b\x3e\x55\x66\x83\x7d\xc7\xd3\x27\x3b\x0a\xf5\x70\x50\xa8\x6c\x25\xe8\x87\xac\xcc\x7d\x66\x90\xd0\x08\xa6\x2a\xa2\x49\x30\xd7\x5f\x72\x15\x4a\x56\x96\x45\xca\x3b\x3a\x16\xf5\x28\x89\x6d\xc3\x92\x7a\xf8\xcc\xdb\x51\x5a\x6a\xbf\xdd\x26\x3c\xd0\x21\x14\x82\xdf\xe1\xb2\x7f\x21\x34\x3d\xb1\x5f\x4b\x3c\xe8\xd1\xdb\x37\xff\x39\x3a\x0b\x7a\xeb\x28\x73\x76\xf9\xd3\xd5\xdb\x77\x1f\xef\xae\xbe\xbf\x7a\x77\x73\x94\x72\x8a\x04\x15\xb5\x2d\xf1\x7c\xde\xb5\x95\x1d\xb4\x85\xf5\x2c\xa7\xb6\x94\x15\x46\x3c\x40\x91\xfd\x58\xb8\x7b\x3f\x5a\xf6\x26\xec\x6d\x79\x72\xa0\xd7\xfd\xa6\x6a\xb9\xb5\x17\x28\xa1\xe1\x10\xaf\x11\x2d\xa9\xf0\xdc\x08\xab\xb3\x87\x18\x67\x5d\x6d\x46\xb8\x33\x3d\x40\xa5\x2a\x4a\x17\x1b\x5f\x57\xee\x56\x85\xd5\x06\x43\xd5\xfd\xe6\xa6\x62\xf3\xaa\x1e\xa0\xa8\x18\x31\x61\x13\x5e\x88\x50\x59\x8f\xb3\x54\x97\x7e\xe2\x7f\xf8\xc3\x19\x93\xe2\x0d\xfb\x43\x03\xec\x9c\xbd\xc3\x67\x7b\x00\x37\x4e\x1a\x8b\xec\x41\x74\xd7\xa2\x3e\xe7\x33\x66\xc4\x8a\x9b\x34\x13\x16\x72\xde\x68\xbd\xd0\x30\x98\x28\x6c\xac\xa8\x9a\x5f\x2b\xed\xb6\x4d\xe2\xc7\x29\xba\x0a\xa8\xfe\xbd\xd1\x1d\x0a\x29\xdb\x51\x4a\xb1\xa4\x6f\x34\x47\xed\xc3\xa0\x53\x1b\x82\x3f\x7b\x96\xdb\x20\x91\x9e\x8d\xc8\x65\xad\x42\x41\x90\x5c\x7f\x5b\x6e\x7a\xfc\x39\xda\x3b\x3e\xf0\xe2\xaf\x62\x73\xd3\x15\x26\xb3\x7f\xd1\xc0\x2e\x43\x4c\x2c\x7a\xa2\x2e\x23\xc0\x63\x27\x8c\x12\xa3\xb2\xf7\x64\x1d\x60\x27\xc9\xd0\x60\xe5\x59\x12\xce\xe8\x19\xf0\xc3\x94\x42\x12\x48\xf6\x4b\x74\x75\x7a\xa6\xbe\x4e\xf4\xce\x4e\x83\xcf\x48\x13\xdb\xf7\xe1\x68\xa3\x79\x10\x16\x63\xef\x42\x7f\x5c\x15\x9e\xf7\x17\xdb\x8e\x43\x3a\x0b\xb8\xb8\xd5\x7b\x62\xc0\x62\x69\x95\xe9\x86\x54\x0f\xa0\x75\x84\x1f\x50\x0e\x00\xce\x7f\x38\x25\x39\xad\x49\x49\x08\x08\x5a\xd6\xd5\x6f\x43\xf5\x0e\x0a\x66\xc6\xf4\xc7\xb9\x47\xe5\xb3\xf6\x3f\xa1\xa6\x48\xe3\x6f\xd8\xd7\x88\x82\x98\xd5\x2b\x40\x99\x31\xec\xff\x0c\x74\x88\x79\xec\xf3\x15\xfe\xb9\x9b\xda\x46\x81\x8f\x3d\x23\xe6\x6b\x6d\xdd\xd5\xf5\x59\xfc\x67\xa1\xd3\xab\xeb\x1e\x8e\xc6\x06\xd3\x51\x6a\x10\x62\x1c\xed\x08\x1f\x7c\xb3\x6a\x87\x9b\xac\x45\xce\xb1\xbc\xb0\x3f\x35\x92\x6f\x11\x87\xb4\xec\xd1\x48\xe7\xa0\x35\x2a\x73\xc2\xe4\x5e\x20\x68\x07\xdf\x9d\x3c\xbc\xee\x08\xe3\x6a\x8e\x81\xb4\x60\x19\x27\x3b\x62\x0b\xc0\x2f\x1c\xd6\x5f\x35\x6c\x42\xde\x42\x13\xe9\xe2\xa8\xd3\x56\x2f\xae\xaf\xd8\x03\xee\xec\x33\x2c\x77\x08\x31\x58\x92\x4f\x71\x00\x49\x88\xfd\x0e\xbe\x7f\x32\x69\xa8\x3a\x27\x6c\x67\x53\x53\xce\x11\x42\x52\x22\x04\xcb\x32\x99\xcb\x90\x6c\x13\x5a\xed\x59\xf6\x02\xff\x38\x4f\x8a\x92\x72\x6d\xc3\xd3\xb9\xc8\xb5\xd9\x9c\xc5\x7f\x8a\x62\x2d\x72\x61\x78\x36\x0b\x8e\x88\xb3\xea\x03\x54\xc0\xd5\xf3\x08\xba\x35\xc9\x5d\xf8\x94\xc2\x13\x5e\xd9\x4a\x4a\xe3\x05\x8c\x6c\xc3\xaa\x72\x48\x47\xa7\x2e\xd5\x89\x8c\x4c\xbd\x3f\xad\x34\x6f\x14\xaa\x2a\xec\xc5\x74\x24\x8c\x76\xa4\xca\x12\x55\x7f\x5b\xa8\x17\xa9\x1e\xbc\x24\x6e\x9f\x45\xb8\x48\xe5\x83\xb4\xb4\x04\xb3\xbd\xb2\x45\xf4\xed\xeb\xd2\x79\x7d\x0f\xcd\x7c\xf4\x62\xb0\x7e\x88\x2f\x85\xb6\x10\x7e\x55\x59\xb4\x5a\xb4\xf4\x75\x7f\x61\x72\x36\xa6\x4e\x11\x7e\x6d\xcc\x51\xdf\x44\xc2\x54\xdf\xeb\x8a\x94\x3e\xc3\x29\x0d\xa1\x83\x71\x42\xc7\x24\x83\xd8\x30\xf7\x58\x7a\x16\x42\x6b\xb5\x1a\x22\x2a\x2a\x20\x06\x7d\x55\xca\x59\xd5\x5c\x1f\x96\x54\xb3\xd3\xa5\xd1\x79\x88\x8f\x25\x5e\x82\x85\xc0\xf8\x10\x99\x46\x68\xf7\x82\x94\x5b\x38\xa9\x7c\x84\xf1\x1b\x57\xf9\xb0\x79\x3a\xd3\xc6\x6b\x72\xc4\xb5\xfd\xca\xf5\x3d\xd2\x83\xfd\xb3\xeb\x09\x47\x22\x7c\xa5\x2f\xd0\x48\xa8\x87\x2e\x83\xde\x5e\x8f\x47\x94\x14\x9d\xae\xba\x94\xee\xb7\x0c\x1f\x9c\xf8\x8e\x5b\x24\x92\xbc\xda\x7e\x5d\xa5\x3a\xc4\x9e\x60\x3d\xf6\xfd\x2d\xcb\x3e\xbb\xc8\x32\x26\x15\x92\x3c\x00\x1c\x8d\xc4\x46\x84\x8a\x97\x1c\xbd\x21\x0f\x5d\x6e\x0f\xe8\xa5\xd8\xb6\x89\x4b\x8b\x4d\x0a\xa4\x5a\x85\xe8\x7a\xe4\x3e\xc1\xfe\x2a\x15\xcb\xcb\xcc\xc9\xa2\xa3\x64\x43\x25\x88\xd4\xb5\x7a\xb8\xb5\x3a\x91\x10\x73\x53\xf5\xf6\xcc\xb8\x75\x71\xf9\x30\x7b\xc7\xef\x0f\x03\x6d\x16\xe9\xf9\x8c\x19\xbf\x8d\x26\x9e\x5c\xb1\x77\xea\xa1\x32\x69\x97\x90\x1c\xe6\x44\x27\xd6\x57\xdf\x6c\xc1\x7e\x2e\x47\x95\x47\xc3\xdb\xd8\xea\xba\x95\x4f\x5e\xeb\x36\xbc\xa7\xba\x92\x5e\xd6\xf6\xa7\xc3\xd8\x47\x63\xe1\x95\x05\xb8\x57\x2c\xd9\xe1\xdd\xb5\x0d\xac\xcd\xb3\x8f\x64\x9b\xa6\xb1\xd8\xaf\x2f\xcc\xa6\x3d\x9e\x81\x69\xd2\x18\xe6\x00\x66\x49\x67\x94\x03\xec\xa2\xb4\x0e\xe6\x08\x94\xc6\x18\xe9\x4c\x91\xdc\xf8\x5b\x2c\xe5\x97\x01\x58\x7f\xa1\x6a\xa5\x52\x42\xf5\xbd\xa5\xc4\x88\xb3\xc2\x88\x42\x28\x30\x06\x11\x3a\x13\x40\x21\x16\xd5\xde\xb0\xca\xb7\xfb\x1c\xde\x5b\x94\x86\x87\x5f\xf1\xdb\x7d\x32\xf9\x74\xbf\x1b\xe3\x37\x76\xbf\x03\x42\x0c\x95\x69\x8f\x7c\x75\x8f\x20\x11\x4a\xad\xe4\x61\xbb\xc5\xb6\x05\x32\xc4\x0f\x61\xb2\x22\xd6\x73\x63\xff\x81\x20\xfe\x03\x03\x4e\x8d\x76\x0e\x2b\xf9\x1d\x9c\x75\xa6\x79\xca\xb4\x62\xa9\xb4\xf7\x3b\x48\xeb\x71\x56\x28\xb5\xb1\x4e\x24\x6b\xc7\xb3\xfb\xf9\x22\xd3\x2b\x5b\x68\x07\x41\xd9\xdf\xbc\x7a\xfd\xdd\xf9\xab\x3f\x9e\x87\x0f\x79\xac\x4d\x8a\x72\x56\x5a\xbe\x12\x88\xbf\x99\x54\xe5\x97\x59\x82\x45\xea\xe7\x6b\x97\x1f\x2e\x1f\xbb\xe7\xbe\x68\x7e\xbf\xd8\xf8\xdb\xf2\xa8\x4d\xea\xc5\x12\x1b\x3f\xfb\xcd\xf9\xab\x3f\xf9\xff\x43\xf8\x55\x8f\xce\x59\xb2\xb4\x33\xae\xd2\x99\xdf\x83\x83\xb5\xec\x28\xd4\x00\x72\xc9\xbb\x50\x93\xda\x8d\x9f\x56\x4b\x05\x3e\xf7\x96\x3b\xfe\x73\x7d\xb2\x17\x59\x33\xb9\x14\xc9\x26\x39\xdc\x53\xa4\xcd\x83\x92\xd8\x93\x34\x84\x6a\xe7\x5c\xf1\x15\x34\x68\x08\x75\x6a\x62\x1a\x5c\xa7\x1c\x2d\x15\x33\xc2\x16\x5a\x61\xe1\xc3\x5a\xf0\xaf\x66\x83\x3a\x83\x1d\x20\x0a\x53\x4e\xbb\xd0\xd6\xdd\x7a\xc5\x82\x9c\x00\x74\x7a\x1d\x5f\xf1\x4a\x49\x48\xe3\x69\x54\xe9\x61\x7c\xe9\x84\x69\x66\x8b\x77\x12\x18\x0f\x03\x4b\x03\x55\x15\x6c\x42\x47\x61\xa8\xe8\x6f\xb7\xbb\x17\x49\xcb\x30\xe9\xd9\xbf\xd2\x09\x19\xcd\xf4\xa0\x35\x79\xbd\x2b\x49\xb4\x49\x21\x70\x49\x83\xef\x37\xfc\x14\xe2\x97\xe7\xec\x13\x10\xd5\xfa\xf4\x3a\x61\xef\xd4\x8f\x5d\x64\x3a\xb9\xb7\xac\x54\x4e\x66\x21\x9b\x5a\xdf\xb3\x44\xe7\x45\x06\x5c\xaf\xbf\xe3\x3c\x9d\x61\xd6\xb5\xd2\xeb\xff\x9c\x55\x78\x32\xf3\x5f\xb6\xe7\xbf\xaf\x7f\x82\x3f\x74\x71\x30\xaa\x90\x20\xbe\xf4\xd7\x05\x6f\x57\x6c\x53\xd8\x95\x19\x9c\x3d\x5a\x55\xb2\x02\x46\x8a\xfb\xc3\xc0\xbb\xd1\xcb\xb0\x16\x8d\xba\xb2\x73\xf6\xee\x8b\x48\xb6\xd2\xf0\x78\x52\x75\x1a\xe1\xf7\xbd\x31\x3d\xc3\x9a\xd8\xe7\x39\xef\x2b\xed\xb2\x67\xed\x97\xf8\x5e\x2c\xf4\x14\xc0\xb0\x4c\x2a\x6c\x66\x88\xd5\xc2\x48\xe6\x27\x2c\x50\xd1\xc6\x38\xbc\x17\x41\x64\x6a\xa4\x4c\xd1\x1a\x59\xb2\xd6\x9c\xfc\x1c\xa1\x89\xe3\x8b\xd3\xf3\xd3\x97\x3b\x76\x12\x92\x2d\x9b\x61\xb3\x5a\xac\xcc\x05\xc2\x6a\x52\x6f\x80\x95\x79\x01\xa9\xab\x22\x39\x4d\x43\xe9\x32\x12\x4c\x4f\xe8\xb0\xc1\x0c\xec\x00\x67\x76\x2d\xb2\x0c\x4b\xe0\x19\x8e\xed\x65\x78\x86\x7f\xf5\x0f\x39\x53\x22\x3d\x26\x41\x7f\x71\xfa\x7f\x4f\xcf\x98\x70\xc9\x4b\xf6\xa8\xd5\xa9\x83\xed\x9c\xb3\x3b\xcc\x65\xac\x3e\xb6\xd1\x25\x53\x82\x6a\x2a\xf4\x47\x8b\x5d\xd7\xb3\x0d\x90\x47\xa6\x4b\x87\x42\x09\x77\x08\x12\x4a\x02\xba\x10\x58\x40\x82\xaa\x97\xec\x15\x60\x52\x5d\x45\x2d\x93\x0f\xe2\x7c\x2d\x78\xe6\xd6\xe8\x92\x54\x5a\xcd\xfe\x29\x8c\xa6\xee\x6d\xa9\xc2\xdb\x14\x8b\x3c\xb9\x5b\xca\xb8\x8e\x56\xa4\x7e\x15\x64\x3b\xa8\x27\xa2\x3f\x1c\xaa\xda\x55\x8f\xd6\x75\xfd\xcb\xdd\xdd\xf5\x0f\x62\x3b\xbb\xd7\x43\x8a\xbe\x5e\xd0\x2b\xb1\x2d\xe7\x31\xe9\xcb\x5a\xef\xcf\xf1\xe8\x9e\xad\xb6\x0e\x0b\x2c\xa3\xb0\xa0\xb0\xc4\x6c\xcb\xc9\x48\x26\x03\x85\x4e\xd9\xd5\xf5\x9c\xfd\x5d\x97\x7e\xe6\x0b\xbe\xc8\x36\xec\x91\x2b\x17\xe3\xc9\x4f\xfc\xe7\x4e\x68\x2d\x26\x71\xf7\xff\x22\x78\x8a\xad\xbd\xad\x13\x9c\x54\xef\x7c\x10\xda\x34\xbe\x31\x9c\x30\x97\xd6\xe9\x9c\xad\xc3\x14\xdb\x31\xf3\xe1\xac\x69\x4e\x2a\x8f\x33\x98\xc4\x00\xd5\x28\xf1\x6a\x06\xb8\x47\xbe\x54\x3b\xb8\x8a\xab\x6f\x15\xf6\x49\x9a\x0b\x23\x7a\x44\xb0\xdb\x24\x46\xb6\x2a\x5c\x90\x47\x01\xa2\x13\x6a\x68\x6f\xa2\x61\xdd\x89\xf6\x18\x40\x70\x6d\x21\xd2\x67\x40\xa7\x86\x11\xdd\x89\x06\xf6\x27\xea\x9b\x2c\xbd\xfc\xe2\xa8\xd9\x0e\xe9\x50\x34\xa0\x47\xd1\x90\x2e\x45\x03\xfb\x14\x0d\xa1\xfc\x58\x07\x71\xf0\x4d\x87\xe0\x30\xa7\xbd\xec\x0f\x11\xee\x78\xc5\x01\xc9\xb1\xec\xff\xd1\xe9\x52\xa1\xbb\x35\xa9\x38\xb8\xda\x7c\x22\x84\x1d\xf8\xed\x1f\x56\x92\xb4\x7e\x83\x1e\x2d\xb3\x9b\xf2\x62\x1a\x25\xfd\x90\x43\x18\x57\x6f\x24\x4d\x62\xd9\x71\xb6\x7d\x44\x90\xd1\x56\x15\x09\x2e\x57\x2b\x1a\x76\xbd\xf6\x33\xf8\xd3\x77\xdf\x7d\xfb\xdd\x1c\xa7\x19\x21\x71\xc5\xae\x2e\x3e\x5e\xfc\x74\xfb\xf9\x12\x12\x24\x28\xa7\xfa\x65\xd6\x68\x1e\x24\x95\x9b\x69\x33\xc3\x1d\x7b\x03\x55\x92\x7a\x41\x40\xb0\xe5\xf0\xe2\xaf\xb7\xf0\x5a\xb3\x5c\x46\xe0\xde\x41\x33\xa5\x46\x18\x79\xa9\xa1\x9d\x6e\xe1\xd1\xfa\xc8\xf8\x4c\x25\x2a\x33\x40\x90\x63\x49\x6f\x2e\x29\x6e\x75\x72\x3f\x50\x7e\x3b\xbd\xbb\xbc\xc6\xd7\x1a\x22\x1c\x57\x51\x31\x94\xea\x41\x67\x0f\x94\x0b\xc1\xd9\xdd\xe5\x35\x2c\x68\x0e\xff\x05\xda\x33\x28\x22\x1b\x0f\xbb\x6a\x5d\x88\x96\x66\xaf\xd8\xf4\x9b\x0b\x10\xae\x11\x3c\x93\xd6\xc9\x04\xe0\xd6\x86\x1d\xff\x85\x3e\x03\xf3\xb3\x4b\x94\xa7\x9f\xa2\x55\xfa\xa0\x70\x49\x14\x54\x6a\x94\x6c\x08\x97\x94\x88\x92\xdf\x18\xa5\x0d\x14\xd6\xb4\x1a\xa5\x4c\x94\x76\x6b\xfc\x12\x34\x88\xf4\x58\x61\xc4\xad\xd3\xc5\x00\xbb\x29\xbe\x70\xc0\x6a\xba\x10\x4b\x6d\xc4\x10\xb3\x69\x6d\x06\x65\x29\x56\x60\xe2\x0a\x82\xd7\xa3\xbe\xaa\x9b\xe6\xcc\x9e\x90\x13\x06\x85\xe4\x92\x75\xb4\x2c\x28\x61\xed\x39\x18\x48\xcb\x02\x35\x02\x30\xc7\x96\x46\x9c\xf9\x95\x8b\xbc\xc0\x94\x6b\x52\x68\x66\xe8\xab\x07\x2f\x08\x97\xa0\x79\x28\x5a\x79\x43\x1e\x5d\xdc\x92\x2d\xc3\x6a\x37\x5c\xc3\xed\x5a\x40\xf6\xa1\xf8\x22\x9d\x45\xc0\x46\x70\x1b\xaa\x05\xc5\x2d\xaa\xca\xa5\xd8\xee\xd2\xb8\x55\x5b\x88\x30\x39\x04\x78\xad\xd3\xd3\x53\xdb\x02\xb6\x32\x3c\x89\x2d\x07\x18\x24\x97\xa4\xfa\xb1\x5b\x3d\x5e\x88\x95\x54\x36\x9e\x33\x14\xc9\x0a\x08\xe1\xe9\xbf\x00\x3b\x59\x30\x0a\xa6\x73\x76\x53\x25\x66\x52\xec\xd0\xba\x74\x89\xae\x89\x48\x98\xfd\xb6\xe9\x1c\x22\x6b\x00\x0d\xa0\x92\x5c\xf7\x3e\x44\xe4\x6a\x16\x06\xec\xd9\x88\x6e\x6a\xb0\x6d\x5f\x27\xda\xd0\x7b\x10\x2b\xd8\xd7\xb1\x2e\x65\x7c\xef\xe0\x49\x49\xaf\xa7\x43\x73\xa3\xee\xb9\x0e\xf4\x60\x4f\x06\xf9\xc9\x20\x3f\x19\xe4\x27\x83\xfc\x64\x90\x3f\x30\x26\x83\xfc\x64\x90\x6f\x8d\xc9\x20\x7f\x68\x4c\x06\xf9\xc3\x63\x32\xc8\x4f\x06\xf9\xdf\x9c\x99\x68\x32\xc8\x4f\x06\xf9\x38\x26\x83\xfc\x64\x90\x9f\x0c\xf2\xbd\x6f\x4c\x06\xf9\xae\xf1\xeb\x34\xc8\x13\xc2\xba\xd1\xaa\x0d\xb5\x41\x69\x89\x06\xd7\x60\x35\x94\x49\x30\x80\xeb\x65\x2b\x2e\x1b\xc1\xcd\xeb\xea\x94\x07\x17\x50\x27\x81\xc6\x68\xe4\x60\xe6\xae\x0d\xeb\x7b\xe3\xba\xbb\x83\x86\xe9\xf6\xc9\x47\x6d\xee\x33\xcd\x53\x7b\x5e\x68\xfc\x7f\xb5\x75\xb2\x61\x96\x44\x3d\xe3\x29\xb9\x03\x7d\xf6\xc8\x51\xb6\xc8\xbe\xac\xb5\x63\xd9\x21\xa9\x14\x9d\x68\x7f\x7c\x0e\xdb\xe3\x40\xbb\x23\x49\x78\x21\xdb\x1c\x9b\xf6\xc4\x5e\xa8\x04\x7b\xe3\x96\x2d\x91\xc0\xaf\xa9\xb6\xc6\x86\x1d\xb1\x17\x2a\xc5\xce\xd8\xb6\x21\xf6\xef\x68\xbf\x8d\x71\xdb\x7e\xd8\xbf\xf8\x6e\xfb\x22\xdd\x76\x48\x34\x71\x0c\xee\xd7\xdb\xa7\x35\x92\x28\x7d\x70\x31\xde\xad\x8d\xb0\x6b\x9d\x75\xde\xb1\x76\xb7\x33\xa9\x64\x5e\xe6\x1e\x5d\xad\xbf\x4a\xf2\xa1\xf2\x57\xda\xaa\x0a\x28\xd0\xb7\x3e\xef\xdf\x02\x70\xde\x23\x24\x94\x39\xe2\x32\x13\x69\x48\x69\x59\xf3\x07\xa0\x4a\x65\x92\x08\x91\x36\x3b\x80\xf5\x01\xfd\x76\x5e\xcd\xb0\x2a\x1e\xda\xd1\xcb\xf4\xd8\x39\x56\x04\xf3\xeb\xf3\x98\x5e\xa9\x24\x95\x22\x20\x0f\x36\xb7\x92\xa8\x1f\xdd\xd4\xda\x34\x71\x52\x08\x35\xc5\xcc\x4a\xbe\x65\x03\xcc\xab\xc3\x4d\xab\x70\xde\xfd\x14\x68\x9c\x59\x95\x48\x6f\x9e\xc3\x9c\x3a\xde\x94\x3a\xcc\x8c\x3a\xb2\xf8\xd0\x78\xf3\xe9\x40\x2d\x67\x80\xd9\xf4\x58\x26\xd3\x67\x2b\x05\x46\xda\x23\xaa\x89\x74\x80\x79\x94\x6a\x1a\xa5\x98\x45\x8f\x6b\x12\x25\x6f\x35\x45\x41\x27\x29\xe7\xc3\x14\xf3\x41\x4a\xf9\x60\xd3\x27\xdb\x69\x0e\xb4\x3b\xe8\xca\x78\x53\xd1\xee\x05\xfb\x24\x45\xfc\x49\x4a\x38\xcd\xd4\x39\xd4\xcc\x89\x26\xcc\xde\x65\x0f\x35\x71\x1e\xb5\x4f\x5e\x8f\x49\x81\x74\xa1\xa5\x92\x4e\xf2\xec\xad\xc8\xf8\xe6\x56\x24\x5a\xa5\xf4\xee\x87\xa7\x1f\x2b\x5c\xb4\xf8\x6a\x90\x0d\xdb\x91\x4c\x6b\xde\xcd\x63\xa2\x19\x20\x04\x83\x45\x5b\x42\x60\x4f\x50\x1e\x14\x67\x59\x59\x01\x08\xe5\xe8\x7e\x36\x4b\x00\x3b\xba\x80\x8a\xe1\x59\x43\x0f\xe3\x2f\xfa\x91\xe9\xa5\x13\x8a\xbd\x90\x2a\x9e\xc7\xcb\x86\x68\x5a\x4b\xfd\xdd\x48\x1a\x7b\xa3\x39\xcd\x5e\xbf\x8a\x80\x7e\x59\x91\x1d\x94\x0c\x6b\x8f\xa3\x09\x05\x60\x4f\x53\x85\x02\x90\x65\x99\xb5\xd5\x21\x54\x91\xe8\xba\xd0\xeb\xba\xb2\xce\x6b\x98\x4f\x85\xfd\x5e\xa7\x0d\x21\xa7\x5b\x9b\xdf\x09\xf3\xe7\x3d\x18\x92\x33\x64\x94\x23\x84\xf1\xce\x65\x1e\xdf\x09\x32\xde\x01\xf2\x6c\x7a\x1d\xc1\xe9\x51\xa9\x78\xfd\x7c\x7f\x90\xc3\xe3\x57\x2c\x47\x11\x1c\x1b\xbf\x41\x39\xea\xe7\x93\x38\x9c\xcc\x85\x2e\xdd\xd1\x84\x8d\xba\x91\x3d\x3a\x10\x3c\xfc\x9e\x38\xf1\x72\xcb\x39\xfd\x3a\x80\xdc\xcb\xe5\x7e\xf5\x12\x47\xef\xa9\x3d\xb9\x18\xd5\xde\x52\x54\x50\x72\xea\xe0\xd4\xb5\x62\x49\x51\x4e\x95\xa8\xaa\xc1\xd3\x7f\x94\xd6\x79\x36\xf6\xd5\xd4\x86\x32\xad\x0e\x83\x4f\xf7\x22\xc6\x16\x67\x15\xdc\x8e\x56\x7d\xed\x3c\x0e\x70\x27\xe6\xfa\x21\xb6\xff\xad\x9b\xa5\xa5\x85\x96\xca\xd9\x96\x8f\xb1\xd3\xe2\x7e\xd8\xf7\x38\xf9\x18\xc3\x98\x7c\x8c\x93\x8f\x71\xf2\x31\x4e\x3e\xc6\xc9\xc7\x78\xe8\xa9\xc9\xc7\x78\x78\x86\x93\x8f\x71\xf2\x31\xee\x8c\xc9\xc7\x38\xf9\x18\xf7\x3d\x3a\xf9\x18\xd9\xe4\x63\x8c\x63\xf2\x31\x4e\x3e\xc6\xc9\xc7\x38\xf9\x18\x9f\x65\x47\x26\x1f\xe3\xe4\x63\x6c\x8f\xc9\xc7\x38\xf9\x18\x27\x1f\xe3\xf6\x98\x7c\x8c\x93\x8f\x71\x6b\xb3\x8f\xe3\x4b\x0a\x1d\xf9\x68\x6e\xa4\x4b\x9d\x17\xa5\x13\xec\xa6\xea\x99\x5d\x35\x63\x5e\x6c\x9a\x77\x06\x7d\x39\x07\x67\xff\x04\x1f\x4f\xf4\x6f\x42\x65\xad\x73\x2c\xe5\x35\x4b\x70\x5e\xb3\x6a\x39\xb3\x6a\x2e\x4f\xf2\xfe\x61\xff\xee\x2e\xe4\xe0\x69\xb4\xcf\x5f\x13\x79\x05\x91\xba\xb5\x37\xfe\x3d\xb6\x26\xaf\xad\x44\xd8\xe5\xe5\x0b\x60\x34\xcf\x75\x89\xb5\xcc\xc2\x3e\x74\x7e\xbf\xee\x77\x0e\x96\xae\x5f\xf2\x08\xd8\x90\x7e\xa1\xc2\x7e\x15\x27\x71\x13\x3b\xc3\x6f\x9d\x45\xa0\x2e\x63\xcf\x22\xde\x23\x68\x40\x53\x7d\x43\x5a\xa6\x73\xe9\x5c\x68\x76\xde\x28\xcc\xd8\x9d\x77\x2d\x5d\xcb\x40\x1c\xb0\x07\x9c\xb1\xdc\x61\x91\xbf\xaa\x1a\x55\xe5\x56\xec\x06\x09\xad\xcc\x1e\xa5\x8d\x45\x1e\x2b\xd1\x0b\xb0\x60\x16\x1b\x6e\x02\x75\x3d\x2a\x61\xfd\xb9\xb1\xad\xf7\x11\xaf\x6e\x18\xe9\x36\x97\x5a\x39\xf1\xe5\xa0\x88\xb4\x1d\xa2\x81\x2f\x85\xc6\x6b\xb6\x92\xd8\x82\xef\xd7\x94\x0a\xaa\x1c\x1e\x2d\xdf\x16\x5b\x0a\x9d\xc7\xc9\xc2\xfe\x88\x2f\xee\xfc\x20\x68\x1a\x11\x70\xdc\xde\xd7\x67\x22\x66\x9e\xcf\xd5\x5b\xbf\xf3\xb5\x27\x85\x5e\x78\xf2\x74\x6d\xe4\x83\xcc\xc4\x4a\xbc\xb3\x09\xcf\x00\x07\xe8\x72\xc5\xc5\x01\x08\x70\x8d\x8c\xce\x6c\xec\x63\xd7\xa3\x3e\x14\x46\x83\xec\x98\x70\xc5\x56\x5c\x2a\x96\xfb\xbd\x2a\x22\x60\x68\xbc\xa5\xa0\xa1\x53\xc1\x8d\x50\x2e\xbe\xd0\x2d\xd4\xdd\xad\xa5\x85\xfe\x77\xc1\x99\x9d\x6d\xea\x79\x85\xb8\x09\xa5\x7f\x52\xe2\xf1\x27\xff\x25\xcb\x96\x19\x5f\x41\xdc\x45\x27\xd4\x85\x00\xd7\xc7\x76\xfe\x7f\x35\x25\x76\x68\x53\xfa\x74\x4f\x2f\x65\x32\x9e\x3d\xf2\x8d\xdd\xdf\x1c\xf8\x0d\x7b\xfd\x12\xf0\x98\x5b\x56\xc1\xef\xf6\xf8\x7e\xf3\x92\xad\xb9\x65\x97\x17\xd7\x3f\xdd\xfe\xfd\xf6\xa7\x8b\xb7\x1f\xae\x3e\xf6\x5f\xdf\xbe\x9e\x81\x09\x2f\xf8\x42\x66\xb2\x8f\x03\xec\x38\x01\x9a\x2f\x02\x99\x4b\xd3\xf3\xd4\xe8\x02\xd7\x6b\x4a\xa5\xbc\xfa\x5a\x57\xda\x24\x59\x5b\xaa\xa2\x17\x81\x22\xe3\xf1\x2c\xdb\x1f\x5b\x19\xae\xc0\x50\xd6\x53\x11\xb5\xb5\xe5\xa6\x54\x5e\x22\x3e\x86\x63\x92\xa7\xc3\xe2\x3c\x2e\xd2\x54\xa4\xad\x25\x3c\x83\x7b\xec\x32\x82\xdf\xd4\x7d\x91\xd9\xf5\xa7\xdb\xab\xff\x3d\xe4\xcb\x2c\xe0\x0d\xd1\x4b\x72\xc4\x50\x00\xc6\x3c\xf2\x0c\xda\xd7\x9b\x10\x4e\x35\xed\xec\xd3\x83\x2c\x2a\xfa\x4c\x37\x2a\xde\x94\xaa\x49\xd2\x54\x03\x06\xcb\x75\x2a\xe6\xec\x1a\xc9\x68\xcf\xde\xb4\xdf\xac\x09\x06\x58\xbc\xfd\xeb\xca\x49\x9e\x65\x1b\xe6\xa5\xbe\x07\x9e\x09\xf0\xc3\x77\x8b\x8a\x5a\x57\x54\x7d\xb7\xce\xd3\x92\x67\xb6\x93\x10\xd0\x28\xa7\x67\x12\x1f\xbc\x00\x4b\xde\xb1\xea\x0d\x96\x0a\xa5\x5d\x90\x86\xfd\xd7\x3c\x8d\xf3\xbf\x32\x94\x88\x7b\x96\x17\xbd\x35\x2d\x0a\x17\x8a\x69\x47\xc2\x29\x6d\x5c\xf3\x75\xfc\x6a\x27\x4c\x34\x1f\x94\x56\xd8\xfd\x84\xb3\x96\x91\xfd\x97\x8d\xe0\xa9\x56\x3d\x61\x4f\x05\x77\x6b\x34\xe0\xe6\xdc\xde\x8b\x14\xff\x30\x47\x5e\x1e\x64\x78\x1b\x0a\x6b\x87\x29\xde\xf5\xdd\x90\xa5\xe0\xae\x34\x02\xf9\x3b\x9a\xa3\x85\xe2\x8b\xac\xbb\x40\x34\xe9\x4e\xf9\x35\x7d\x52\xd9\xe6\x46\x6b\xf7\x7d\x15\xd5\x46\x3e\xdc\xbf\x55\x5d\x7e\xa5\x6d\x7b\x7d\xd0\xa6\x9a\xce\x20\xa6\xd1\xa3\x66\xf7\x0a\x1b\x45\x80\xdf\xd6\x87\x79\x24\xa4\x35\xa5\xba\xb0\x3f\x18\x5d\xd2\xeb\xe0\x7b\xac\xfa\xe1\xea\xad\xdf\x6d\x2f\xb0\xf8\xf3\x12\xca\x99\x0d\x44\xad\xee\x14\x05\xef\xc6\x88\x28\x57\xfd\xe8\xf1\x6c\x0b\xb3\xbc\x1c\x57\x2a\x2b\xdc\x9c\x7d\xe0\x1b\xc6\x33\xab\x83\x80\xd6\x47\x3e\xae\xc1\x4d\xd4\xd4\x33\xe6\xcc\xab\x86\x21\xac\x65\xa1\xdd\x9a\x6d\x3d\xd0\xcd\xe0\x55\xba\x07\x26\xc6\x54\xa2\x45\xac\xd2\x03\x3d\xfc\x21\xa0\x1d\xbf\x17\x96\x15\x46\x24\x22\x15\x2a\xe9\x3c\xd1\x86\x71\xeb\x4f\x7f\x7c\xb2\x8f\x02\x4e\xfe\xa3\x56\x1e\xbd\xc9\x67\x7f\xa5\x52\x99\x70\xa4\x54\xa1\x5d\x6e\x8d\xda\x60\x9e\x0d\x32\x6c\xb7\x9b\x42\x69\x35\x03\x9a\x5c\x5a\x61\xb0\x6d\xac\x29\x05\x6e\xe8\x5f\xcb\x85\xc8\x84\xc3\x20\xe9\x07\x9e\xc9\x94\xbb\xee\x3e\xd0\x7e\xc8\x9c\xaf\x04\xe3\xae\x42\x22\xa7\x99\x50\xb6\x84\x4a\xfd\x5e\x6d\x77\x2c\xd5\xa2\x0e\x27\xe5\x96\xfd\x78\xf5\xb6\x13\xe4\x2b\xf6\xc2\xcf\xf1\x25\x1c\xff\x92\xcb\x0c\x22\xa3\xa0\xe5\xec\x96\xf4\xbe\x8c\xe0\xfd\x52\xba\x29\xb5\x02\x01\xd6\xe0\xf5\x3d\x63\x4a\x63\xd3\x86\xb0\x4e\xaf\x5e\xc5\xe0\xf0\xe0\x9e\xec\xad\x74\xdf\xbe\x1a\x44\xf4\xef\x04\xb9\xf5\xf2\x10\xf4\xef\xbb\x99\xdb\xa0\x87\xa0\xff\x00\x82\xf6\xa3\x15\x66\x10\x3d\xfb\xf1\xc8\xf4\xac\x29\x5e\x78\x1c\x6f\x13\x08\x44\xd6\x5c\x38\x9e\x72\xd7\x7d\x53\x90\x06\xd6\xc1\xeb\xf4\xe3\xee\x04\xdb\x41\x09\xbb\x8e\xbb\x13\x66\x3f\x25\xfc\x05\xa9\x9d\x15\xef\xa5\x2a\xbf\xa0\xe7\x70\x98\x62\x7b\xfb\x0e\x5e\x65\x49\x5c\x04\x6c\x3e\x2f\x8a\x4c\x62\xd4\x77\xdb\xe5\xd5\xb9\x47\x57\xad\xe3\xdc\xee\xef\x11\x69\x17\x90\x00\x9e\x65\xda\x93\xda\x1e\x52\x6a\xb8\x4a\x75\xbe\x33\x49\x2f\x94\x09\x9e\xac\x9b\x7e\x85\x26\xf2\x50\xb0\xe3\x57\xca\x46\xa9\x6a\x7d\x26\x1e\x44\x36\x48\x01\x7d\xef\xdf\xf0\xc2\x59\x3c\x0d\x00\xc1\x32\xbe\x10\x19\xb2\x21\xc4\x1a\xb2\x57\x9a\x88\x55\x03\x94\x44\xa3\x0f\xb7\xc5\xdf\xbb\xa6\x1b\x9d\x81\xc3\x8f\x57\x8b\xf2\x20\xbe\xaa\x35\xc1\x83\x43\xd6\xe4\xb5\x8a\xf6\x9a\x40\xe7\xfa\x9a\xd6\x54\xf6\x70\xb0\x9d\x35\x79\x96\xd7\x5e\x13\xf0\x9d\xaf\x67\x4d\x24\xb3\xc3\xa3\x54\xa9\x7e\xb4\x63\xc8\xf4\xdf\xf0\xd5\x48\x43\x12\x4f\xa6\x30\xb1\xb3\x41\xaa\x79\x8f\x01\xb8\xa9\x3d\xef\xa3\xd5\xd1\x01\x01\x19\x7b\xa1\xa3\xd2\x10\x3a\x15\x85\xbb\xd2\x06\x6f\xd5\x08\x46\xdc\x6b\xe4\x3c\x32\x23\xa6\xd2\xcb\x55\x6e\xf9\xa5\xf1\xf0\x9c\xe4\xd9\x6d\x31\xb0\xb3\xd1\x0f\x1f\x6e\x2f\xda\xaf\x7b\x74\x7e\x5c\x8b\xd0\x6c\xcb\xff\xce\x78\x9a\x4b\x6b\xfb\x0c\xee\x7e\x3c\x8a\xc5\x5a\xeb\x7b\xf6\x22\xfa\x63\x56\xd2\xad\xcb\x05\xe4\xbe\x36\xa2\x41\xac\x5c\xd9\xf3\x80\x75\x33\xbf\x82\xfe\x64\x30\xa9\x32\xa9\x1a\x66\x11\xa1\x9c\x8d\x62\x22\x4c\x32\xa9\x56\x01\x87\x00\x01\x35\x84\x86\x4c\x9b\x0a\x42\x7b\x1b\x20\xf4\x05\x62\xeb\x83\xa9\x04\xe3\xec\x09\x3d\x69\x78\x56\xac\xf9\x0c\x99\x50\xc8\xb1\x03\x9b\xc3\x5a\x2b\x1d\xc2\x0e\x30\x7c\x3c\xa8\x73\x68\x39\xe9\x27\x10\xf5\x6d\x83\xf5\x36\x6d\x30\x47\x23\x80\xbb\xd8\xf4\x91\x90\x41\xd1\x83\x51\xb0\x95\x21\xbd\xb2\x11\xe6\xd4\xbb\xe2\xbd\xc7\x8a\xa2\xfd\xd6\x99\x34\xf7\xbc\xff\x7c\xc8\x67\xb2\xbd\xe7\xbd\xa0\x9f\xe5\x4c\x2a\xdd\x6a\xf0\x51\x80\x8e\x15\x5e\xf4\xf4\x28\x12\xeb\xbd\x3a\x57\xef\xe2\x76\x1a\xcf\xed\xd5\xbb\xfc\x23\x6d\xdd\x8b\x70\xb5\xb7\x74\xb3\x3e\xfd\x8b\x02\x71\x9f\x18\xfd\x04\x29\x9a\x3d\xaf\x24\xcd\xf6\x49\xd3\x87\x71\x1c\x71\x98\xb0\x0f\x83\xd1\xfc\xa6\x89\x6c\xbf\x04\xbe\x3f\x3d\xdc\xa1\xf3\xe7\x42\xef\x75\xad\xf4\x71\x5b\xbe\x5c\x4a\x25\xdd\x86\x14\x39\xe1\xd1\xac\x2d\xc0\x14\x3a\x3d\xb5\x2c\xd4\x7a\x08\x0e\x59\xeb\x0c\x97\xea\x60\xac\x2c\x85\xff\x2b\x9d\x8a\x8b\x9e\x99\xed\xcc\xee\x6d\x15\x04\xe4\x5f\xaf\x56\xd6\x9c\x9d\x29\x33\x0c\x48\xef\x15\x7a\x8a\xee\xf6\x95\x54\x21\xa6\x30\x62\x29\x8c\x11\xe9\xdb\xd2\xa3\xc7\x6d\x35\x95\xab\x15\x20\x2e\xfe\xf9\x1d\xa4\xe2\xf7\x84\x53\xec\xac\xd7\x13\xc1\xaa\xca\x06\x8a\x82\xf8\x39\x30\x2c\x86\x1f\xfc\x42\x48\x32\xba\xdf\xb3\x70\x79\x2c\x77\xd2\x2e\x51\x7e\xa8\x76\x51\x7c\x81\x62\x1f\x20\xae\xd2\x29\x20\x48\x21\xf1\xae\x9f\xb1\x45\x09\xa6\xd3\x9c\x6f\x58\xb2\xd6\x1a\xf2\xde\xe1\xb0\xe0\xbb\x0f\x52\x67\xdc\x11\x54\x0a\x28\xdc\x60\x30\xf2\x23\x10\xef\xc6\xf4\xd0\x51\x55\x83\x95\x96\xe5\xda\xf6\xd3\x94\xea\xac\x22\x4b\xf7\x9f\x79\x94\x0e\xa3\x5e\x57\x90\x34\x6f\x1d\xb3\x65\xee\x3f\xfa\x28\xe4\x6a\xed\x6c\x7f\xcf\x0d\x39\x17\xf3\xda\x7e\x52\x4f\x2b\x17\xc2\x41\xdc\x5f\x5c\x42\x8d\xa7\xbd\x30\x83\x77\x2b\x07\x59\xf1\x45\x0c\xbc\x8a\xa1\x79\x67\x55\x04\xdb\x36\xd6\xf5\x73\x82\x3d\xc7\x8d\x3d\x7a\x5f\x9e\xc5\x28\x3a\xc6\x61\x0f\x16\x1b\x26\x9d\x30\xdc\x51\xe0\xba\xb5\xd1\xe5\x0a\x77\x52\x64\x61\xe2\xb0\xee\x8a\x11\x78\xca\xcf\xd3\xd4\x5f\xd3\x13\xdc\xdc\x13\xaa\x6e\xe9\xa7\x53\x45\xe9\xa4\x82\xe5\xdc\x25\xeb\x4a\xa4\x36\x46\xd8\x42\x2b\x80\x0c\xbf\xbc\xab\xd7\xf6\x6f\x24\xe9\xd4\x03\x7d\x61\x5f\xd6\xc8\xb0\x96\xab\x75\xc4\x05\x1e\x14\x0a\x8f\x63\x35\x0e\x3d\x47\x8a\xf2\x85\x62\x22\x2f\xdc\xa6\x81\xa9\x0d\xda\xe6\x84\xc9\xe3\xca\x09\xc1\x02\x80\x78\xc0\x4a\x2c\xae\x4b\xe6\x18\x86\x18\x30\x9b\xbd\x62\x2f\x00\x75\xa5\x3b\xed\xf3\xbf\xe0\x50\x7a\xa6\x8b\x97\x73\x76\xc1\x54\x59\xd1\xa2\xa7\x4d\x52\xe9\x6a\x8e\x61\x32\x16\xc5\x25\x1e\xbf\x46\xb8\xd5\x43\xd2\xaa\x71\xd2\x5e\x48\x19\x91\xbb\x7c\x81\xd8\x67\x45\x06\xe5\x50\x60\xb1\x67\x8c\x5b\xab\x13\x49\x2a\xb8\x81\xa3\xc2\xb2\x36\xea\xe2\xb1\xd0\xfa\x1e\x0e\x6f\xfb\xb7\x7d\x31\x46\x76\xd5\xbb\x60\x99\xb4\xe0\xe5\x68\x6f\x45\x93\x60\x91\x21\x03\xfb\xf0\x70\x4e\x2d\x1a\x9e\x48\x3d\x1b\x71\x0c\xe8\xdc\xb8\x77\x19\x07\xa7\x3f\x00\x24\x43\x03\x5a\x8d\x0f\x9e\xec\x07\x2d\xc3\xa2\x60\x6d\xcf\x48\x57\xab\x1e\xf7\x62\x73\x86\xa4\x52\x31\x7f\xc6\xbc\x02\x6c\x44\x16\x3c\xa9\xf4\x2e\x86\x01\x22\x00\xc4\xf9\xd0\x77\x78\x0c\x96\x55\x5f\x1c\xf6\xc2\x1e\xc1\x07\x0d\x91\x7e\xee\xd1\x73\x3c\x10\x22\xab\xcf\x25\x58\x32\x99\xd3\x43\x56\xcf\xc6\xf5\xac\xc4\x11\x8f\xee\x49\xfb\x70\x13\xc3\xc5\x3c\x96\xdd\x8b\xcd\xa9\x45\x24\xf0\xf7\x77\x2d\x8b\xc1\x1b\xe2\x34\x60\x2b\x5c\xdf\x80\x0d\xec\x33\xcf\x64\x5a\x4d\x77\xc8\xdd\xc5\xe1\xb9\xe3\x95\x3a\x63\x1f\xb5\xf3\xff\xf3\xee\x8b\xb4\xce\x9e\xb1\xb7\x5a\xd8\x8f\xda\xc1\x3f\x87\x6e\x3a\x63\x3f\x38\xbc\x03\xef\x07\xbf\x3b\xfa\xc0\x70\x3f\x9e\x74\x5c\x17\x0a\x63\xe9\x20\xb7\x0a\x66\x30\xe2\xce\xe1\xb8\x0a\x6d\xfe\x23\x01\x90\x96\x5d\x29\x2f\x12\x87\x6d\x1e\x73\x1d\x70\x2e\x61\x8a\x31\x35\x4e\x69\x35\x03\x99\xa3\x37\x14\x61\xdf\xd8\x9e\x23\x9e\xbe\x9f\x67\xf3\xfc\x69\x6d\xeb\xb6\xe1\xee\x9d\xee\xf1\xa6\xfa\x03\x84\x55\xbc\x6f\x1a\x41\xc6\x20\x7f\x35\xb9\x35\x7f\x00\xc1\x59\xaa\x55\x56\x89\xc0\xc3\x57\x8e\x61\x74\xd1\xec\x2f\x95\x13\xa6\x30\x22\x34\x1c\xe7\x2a\xfa\xad\x87\x63\x14\x58\x64\x70\xbe\x10\x3d\x57\x64\x3c\x11\x29\x4b\x41\x81\xf0\x13\x77\x86\x3b\xb1\x92\xc9\x60\xc8\xb9\x30\x2b\xc1\x0a\x2f\x5f\x0c\x9d\xd6\x60\x26\x8e\x63\xf4\x25\x1f\xd6\xf1\xb6\x1e\xc3\x7a\xfb\xe2\x98\x79\x8a\x3d\xe8\xf9\x88\x9e\x03\x5e\x1a\xd8\xef\xb7\xf9\xd2\x90\x3d\xf8\xff\xd8\xbb\xda\x1e\xb9\x6d\x24\xfd\xfd\x7e\x05\x31\x8b\x85\x67\x80\xe9\x1e\x27\x77\xb8\x3b\x78\x83\x1c\xc6\x2f\x31\x8c\x24\xb6\xe1\x99\x24\xc0\xe1\xbe\xb0\x25\x76\x0f\x77\xd4\xa4\x56\xa4\x7a\xd2\x7b\xb8\xff\x7e\x60\x15\xa9\x77\x89\x94\xa6\x27\xb6\x77\xa9\x2f\x89\xa7\xa5\x12\x5f\x8a\xc5\xe2\x53\xf5\x94\xc0\x79\xfc\xc1\x9c\xe2\xbe\x38\xbf\x11\xce\x96\xd1\x6f\x8c\x7e\x63\xf4\x1b\xa3\xdf\x18\xfd\xc6\xe8\x37\x46\xbf\x31\xfa\x8d\x23\x57\xf4\x1b\xdd\xf5\x87\xf8\x8d\x33\x5f\x82\xf8\xe7\x02\x58\xf6\x37\xc4\xb3\x6b\x1c\x16\x11\x56\x70\x5a\x01\x93\x0e\x36\x7a\x6d\x40\xd6\xb8\x7a\x37\xd6\x17\xb8\x05\xa8\x77\xf6\x77\xbc\x09\xf9\x66\xf5\xcd\xf3\xe7\x61\xfa\x1d\x5a\x8c\xa4\xbe\xe6\x7d\x2f\x7d\x4e\x49\xcc\x1a\x27\x0f\xb8\x19\x67\xce\x1f\x69\x39\x7d\x65\xcc\xb1\x38\xd8\x09\xa2\xaf\x76\x2b\xad\x02\x66\xad\x90\xdc\xc2\x00\x29\x78\x3d\x42\x6a\xb2\x67\x9a\x50\xdd\x0a\x9c\xf0\x3d\x0b\xdb\x9f\x73\x99\xa2\xa1\xb7\x05\xfc\x5d\x24\x38\x25\x52\xd8\x78\x99\x00\xfa\x64\xa7\x07\xf3\x82\x8e\x75\x42\x48\xbb\x07\x09\xa3\x58\x96\x62\x03\x59\x2f\xfe\x80\xa3\x26\x4a\xee\x19\x41\x76\x84\xdd\x36\x4c\x17\x98\x9b\x15\x72\xce\xd6\xbb\x35\x49\x4b\x5b\xed\xc2\x2b\x12\xab\xd9\x5c\xe0\x0e\x8c\x54\x37\x88\x38\xcb\x02\xfe\x63\x86\x45\x17\x47\x60\xf4\x1c\x98\xd0\x25\xcd\x02\xea\xab\xb3\x03\x4f\x74\x55\x28\x02\xf2\x35\xb9\xc6\x4c\x03\xdf\xea\x9d\x73\xdc\xe9\xda\x94\xa0\x5d\xac\xe3\xdc\xbb\xe2\x25\x63\x67\x6a\x6d\xe4\x86\x99\x1c\x73\x62\x82\xdb\x41\x33\x3f\x7c\xf2\xc7\x35\xc9\xbc\xed\xb7\x7b\x7a\x2e\xb3\xcc\xcc\x13\x86\x39\xfb\xcd\x9e\x83\x47\x40\x1e\x88\x0b\x1f\x62\x4e\x40\x4b\x83\x31\xea\x1e\x2a\xd2\xf4\xff\xfa\xfd\x6b\x96\xa2\xa4\x5b\x99\xcb\x4c\xee\x8e\xcd\xb9\xc2\xac\xef\xaa\x16\x4b\xa8\xdb\x47\x89\x2a\x37\xf6\xf4\x64\xf4\xeb\x7d\x47\x05\x62\xc4\x2f\xec\x8a\xc8\xcd\x0c\x89\x11\xb9\x89\xc8\x4d\x44\x6e\x26\xaf\x88\xdc\x44\xe4\x26\x22\x37\x11\xb9\x19\xbc\xfe\xb9\x91\x9b\x18\xf1\x8b\x7e\x63\xf4\x1b\x67\x5d\xd1\x6f\xf4\x5d\xd1\x6f\x8c\x7e\x63\xf4\x1b\xa3\xdf\x18\xfd\xc6\xce\xf5\x8f\xe3\x37\xce\x7c\x49\xb8\xf8\xd0\x61\x5d\xf5\x01\xf6\xa0\x48\x93\xb7\xc9\x61\x45\x30\x65\xfa\x08\x52\x63\x2e\xd3\x09\x4e\x23\x04\x49\x26\xfb\x92\xc8\x95\xad\x00\x04\xe1\x1a\x23\xce\xc6\x2b\x15\xdd\x63\x4c\xe8\x92\xfc\x5d\x0a\x86\x7c\x2f\x63\x26\x94\xf4\x50\x65\xa1\x10\xb9\x11\x75\xae\x2e\x26\xb9\x38\x91\x2f\x19\xf9\x92\x91\x2f\xf9\xa5\xf2\x25\xef\x28\xd8\x03\x65\x9d\x86\x06\x7d\xd2\x2b\xb1\x9d\x12\xd1\xb0\x70\xc6\xb8\xfe\x65\x90\x3d\xe9\x95\xf9\x79\xd8\x95\x66\x11\x58\x25\x35\x23\xdd\x50\x34\x1c\x8f\xd4\x26\x92\xb0\xf4\x63\xbb\x97\x01\x3b\x19\x62\x12\xd0\x19\x0a\xd5\xba\x73\x56\xac\x50\xb5\x25\xd9\x72\x91\x0e\xf4\x31\x40\xac\x1d\xd9\x80\x95\x3a\x8b\x03\xd9\xee\xde\x82\x40\x6e\x33\x06\xdd\xda\xb6\xbe\x26\x46\x24\xe0\x06\xce\x55\x58\x0e\x72\x01\xfa\xf0\xb7\x92\x15\x47\x22\x0f\xac\xa8\xcf\xcd\xd5\xe7\x32\xe6\xf8\xf6\xb0\x63\x73\x45\x12\xaa\x70\xab\x0a\x77\x94\x97\x61\x30\xcb\xa3\xc4\xa4\x3b\x18\x5d\x51\x88\x79\x65\x3c\x60\xab\x69\x5f\x72\x6b\x87\x75\x10\x34\x84\xed\x6c\xa6\xc4\xd6\xfe\x50\x87\xfa\xe7\x21\x78\x4b\x8e\x20\x83\xda\xf2\x68\x30\x91\x84\x01\x8a\xf3\x4f\xa9\x7e\x50\x71\xd1\x71\x7a\x39\xb0\x48\x1e\x01\x2e\x92\x65\x00\x23\xe9\x4e\x9b\x69\xbd\xf5\x80\x2a\xac\x71\x81\x4c\x52\xd7\x40\x3e\x01\xde\x48\x1e\x77\xba\x5d\x8e\x3b\x92\xee\xf0\x54\x6a\x52\x7d\xdd\x60\xbe\x92\x10\xa7\x7c\x1d\xe0\xb2\x02\x22\x17\x49\x1c\x07\x2f\x8d\x0d\x58\x24\xb2\x07\x60\x82\x5e\x3f\x0e\xc3\x7c\xe4\x44\x2e\xc3\x23\x49\x77\x1a\x2d\x8a\xc6\xf1\x33\xa2\x33\x61\x8f\xfa\xea\x21\x9a\x5d\x84\x72\x91\xd4\x01\x54\xb3\x05\xfb\x2d\x12\x3a\x88\x6c\x9e\xa4\xad\x23\xe8\xe6\x22\x30\x96\x8c\x01\xb2\xb6\xc9\xb7\x77\x01\x95\xfd\x86\xae\x27\x81\xf8\xc8\xe3\x60\x3e\xb2\x1c\xea\x23\x8f\x5d\x47\x4b\x21\x3f\xb2\x10\xf6\x23\x0b\xa0\x3f\xb2\x14\xfe\x23\x4b\x21\x40\xb2\x78\x5c\xc0\x1d\xfc\x09\x92\xfc\xe6\x0d\xcb\xfc\x8f\x0b\x8e\x35\x79\x81\x26\xf4\x3d\x5a\xec\x02\xfa\x5b\x7b\x9a\x1b\x0b\xf7\xbf\xc6\x4d\x82\x45\xf9\x7f\x73\x7d\x19\xca\x0b\x65\x8e\x4d\x16\xfe\x6f\x48\x72\x68\x5d\xe3\xa5\x33\x85\x9b\xd6\x71\xd5\xfe\xce\x8d\xb1\xe6\x16\x60\x30\x2d\xef\xfa\xe8\x73\x7d\xc4\x87\x3b\xa9\xd0\x9f\xab\xaa\xfb\x9d\xdd\xb3\xe3\xd9\xe5\x63\xec\xa6\x11\xf2\x4e\x9c\xa1\xe3\xd9\x8b\xe8\x38\xaf\x76\xee\x21\x42\x64\x47\x72\x06\x92\xce\x06\xb2\x83\x17\x1e\x02\x1e\x01\xa3\xcf\x7a\x48\xd0\x3d\x53\x39\x9d\xf8\x58\x6c\xff\x6a\xa9\x6e\x2d\xa0\xf1\x81\x70\x84\x7f\xea\x9f\xe6\xc4\x0f\x9c\xf7\x7b\xd3\xf7\x5d\xc9\xb9\x43\x94\xe8\xce\xcc\x94\xbe\xf0\x97\xdd\x6a\x74\xb5\x95\x13\x0e\x49\x23\x7b\x46\x85\x22\x67\x0e\xc7\x7e\xa6\xea\x36\xfb\x31\x30\x77\xcd\xde\x47\x16\xd9\x8c\xf9\xb6\x51\xdb\xd4\xf2\x1f\xe7\x1c\x4d\x3a\x48\x96\xc5\xf7\xed\xf7\x2c\xe1\x9b\xfa\x16\xfc\x0f\x85\x5c\xcc\x75\xee\x70\x9b\x0b\xf8\x8e\xb7\xd4\x0d\x31\xe4\x9c\x0a\xcd\x57\xd5\x1d\x33\xc4\x56\x68\x0e\x40\x8e\x4d\x1a\x56\x5b\x83\xe6\xc2\x22\xcd\x2a\xa5\xb5\x0e\x5f\xda\x9a\xcf\x8b\x46\x80\x2b\xe2\x3e\xa6\x4a\x55\xf5\xd1\x41\x29\x1c\x0c\x8f\xe6\x0e\x8c\xc8\x0c\xa9\x16\x56\xc4\xc3\x22\x8c\x06\x64\xa7\xd4\xf3\x3e\xa3\x42\x9a\xbb\xe0\xec\x28\xb7\x84\x0a\xcb\x9b\x90\xc2\x2e\x67\xf3\x17\x87\x98\xc3\xc8\xce\x1a\x01\x98\x23\x5e\xf5\x7d\x4d\xde\xc0\x32\x6c\x36\x96\xc3\x67\x70\x66\xc8\x74\xdf\x3a\x9e\xb9\x88\x66\xac\xbc\x79\xfe\xd6\xaa\xd9\x9d\xa7\x08\x64\x2e\xa6\x2e\x3e\x3c\x11\x75\xb1\x03\xf1\xfe\x53\x31\x17\x67\x82\xf7\x91\xbe\x38\x75\x45\xfa\xe2\x4c\xfa\x62\x50\xff\x71\x67\x08\xe6\x31\x7a\x65\xd6\x3c\xc7\x49\x1e\x23\xf9\xcd\x7e\x4a\x38\x00\xfc\x32\x53\xbd\x2f\x33\xcd\xf3\x3a\x49\x49\x61\x53\x33\x04\x37\xb6\x36\x44\xde\xb2\x3c\x21\x11\x4a\x88\xfb\x76\x96\x29\xbc\x0f\x92\x98\x14\xec\x60\x97\x18\x26\xf6\x7d\x7f\x03\x24\x02\x7f\xd1\xa1\x22\x18\xab\xe7\x4f\x13\x42\x7c\x0d\xbe\x82\xaa\x63\x3c\xb0\x7b\x9e\x1b\x67\x24\x33\x6a\x66\x9c\x05\x67\xbb\x03\xcc\x60\xdf\xa7\x46\xec\xf3\xc0\x5c\x20\x77\xc7\x0f\x4c\xd4\xce\xce\xb9\xba\x08\x71\xc4\x2c\xce\x3c\xe1\x24\xb6\x5d\xbf\xa0\x48\xe4\x94\x73\x08\xbb\xd6\x22\x47\x6c\x86\x03\x16\xfa\xf1\x05\xd2\x75\xbc\xbe\x6b\xec\xfe\xdf\x37\x82\xdf\x95\x43\x15\x18\x89\x6d\xb8\x5c\x30\xb0\x95\xd3\x55\xab\x42\xed\x48\x9d\x38\x66\xbb\x20\x58\xf9\x74\x81\xca\x85\x41\xca\xcf\x46\x61\x1d\x0f\x4c\x12\x39\x27\x3f\xd4\x17\x94\x5c\xca\x6d\x58\x80\x45\x3c\x96\xd4\x70\xa2\x40\x64\x64\x35\x8c\xbc\xf1\x51\x71\xe2\xa1\x80\x23\x8c\xc1\xa2\xe0\xeb\x57\x4f\x6e\x18\x08\x30\xba\x60\xe1\xec\x01\x19\x0c\x2e\xf6\x02\x85\x8b\x83\xa9\x6a\x98\xe5\x60\xf4\x6f\xb6\xcc\xc7\x04\x15\x3f\x27\xb9\xa1\x1f\x48\xac\x83\x82\x0b\x83\x9b\xbd\xc0\x5c\x37\x20\xb8\x68\x61\x78\x68\x0e\xb3\x65\x0e\xb4\xf1\x8f\xa2\x39\x2c\x0a\x02\xc6\x1c\xff\x98\xe3\xbf\x98\x1b\x3a\x37\xb0\xf7\xd8\xa0\xde\xa2\x59\x7e\xc2\x60\xde\x93\x05\xf2\x9e\x38\x88\x17\x16\xc0\x0b\xf9\x5a\x60\x7d\x05\x04\xef\x20\x1c\x37\x47\xe4\x29\x03\x77\xb3\xd7\xc5\xcc\x07\xe6\x06\xeb\x9e\x2c\x50\xf7\x34\x41\xba\xa7\x08\xd0\xcd\xb2\xf5\xb3\xd7\xfe\x3c\x9b\x36\x3b\x20\x17\x1e\x8c\x6b\xe0\x2c\x81\x7d\xf5\x06\xe2\xda\xe1\xb5\x39\x26\x7b\x30\x08\xd7\x0b\xad\xcd\x0e\x50\xf7\x71\x9f\x61\x54\x27\x74\x00\x26\xb0\x9f\x0e\xb2\x33\x3f\xe0\x3a\x84\xfe\xb4\xb1\x9d\x40\x99\x03\x41\xb7\x80\x50\x5a\x28\xbe\x02\x01\xb7\x79\x61\xb4\x59\x6b\x64\x4e\x3c\x65\x4e\xf3\x4f\x1e\x22\x09\xa6\xdd\x09\xcd\x1f\x4b\xbd\x6b\xae\xb2\x1e\xff\x6e\xb2\x37\x18\x01\xa0\x07\xc9\x53\x92\x97\xf0\x15\xe9\x30\x0e\xde\xa4\x54\xcb\xcf\x8b\x1c\xbc\x3e\x07\xaf\x35\x55\x0d\x66\x96\x57\xe6\x48\x58\x68\x9c\x88\xe7\x6f\x65\x93\xa8\x17\x42\xc4\xf3\x4a\xec\x11\xf5\x02\x89\x78\xfe\xce\xb7\x89\x7a\x7e\x22\x9e\x57\x62\x8f\xa8\xe7\x23\xe2\x05\x5b\xa6\xae\x6a\x8e\xcf\xb9\x5f\xa6\x97\xad\x37\xc8\xc6\x0b\xeb\xfc\x14\x5b\xaf\xcf\xc6\x0b\x9b\xfb\x71\xb6\x9e\x87\x8d\x17\xa0\xac\x5f\xcc\xb7\x0e\x23\x1b\xcf\xdd\x1d\xd9\x78\x24\xb2\xf1\xec\x15\xd9\x78\xa1\x57\x64\xe3\x45\x36\x5e\x64\xe3\xc1\x15\xd9\x78\x91\x8d\x37\x72\x45\x36\x5e\x64\xe3\x45\x36\x5e\xe8\x15\xd9\x78\x03\x57\x64\xe3\x45\x36\x5e\x64\xe3\x45\x36\x5e\x64\xe3\xd5\x57\x64\xe3\x45\x36\x5e\x64\xe3\x55\x57\x64\xe3\x75\xaf\xc8\xc6\x83\x2b\xb2\xf1\x3a\x6c\xbc\x56\x10\xeb\xeb\xa5\xe4\x35\xbb\x11\xaa\x2e\x91\x97\x17\x79\x79\x91\x97\x17\x79\x79\x91\x97\x17\x79\x79\x91\x97\x57\x5d\x91\x97\x17\x79\x79\x91\x97\x17\x79\x79\x9e\x2b\xf2\xf2\x22\x2f\x2f\xf2\xf2\xa6\xaf\xc8\xcb\x8b\xbc\xbc\xc8\xcb\x6b\x5c\x91\x97\x17\x79\x79\x91\x97\x17\x79\x79\x91\x97\x17\x79\x79\x7f\x38\x2f\xcf\x7b\x0b\x2d\xb5\xdc\xcb\x52\xe8\x1b\x56\x1c\x78\xc2\xae\x93\xc4\xfc\xeb\x56\xde\xb3\xd1\xe0\x4a\x1b\x2d\x99\x10\x40\xb8\x48\x79\x02\xb8\xc4\xc3\x1d\xd3\x77\x13\x61\x2d\x73\xd4\x84\xe7\x09\x45\x01\x44\x83\x84\xda\x6e\x40\x4b\xa9\xe6\x09\x20\xf9\xf0\xca\xf1\xe9\xc7\x7e\x6f\xa4\xcc\x18\x15\x83\xf7\x30\x41\x37\x19\xb3\x8d\xfe\x89\x8b\xfb\x51\x83\xdb\xea\xee\xb3\x37\xbd\xe7\xfa\xbd\x24\x5c\x60\xf8\x8f\xcb\xe1\x97\x43\x8f\x37\xb2\xd4\xae\xd7\xaa\xd1\x51\x2e\xfe\x8a\x4b\x86\x0b\x2d\x61\x03\x79\xa6\x08\x13\x07\x5e\x48\x31\x89\x41\x1d\x68\xc1\x4d\xe3\xd4\x65\xdb\xa4\xa9\xa3\xd0\xf4\x77\xb3\x22\x5f\xcb\xe4\x9e\x15\x24\x33\xcd\x5e\x93\x0f\x39\xfa\x9c\xe3\x8a\xfe\x9a\x6d\x69\x99\x69\xd8\x21\x75\x51\xb2\xf5\xb3\xc5\xe3\xcd\xf7\x74\xc7\x3e\x96\x59\x76\xc3\x92\x82\xe9\xc0\xd1\x7e\xd7\x79\xca\x1e\x9c\xa5\x6d\x79\xf5\x75\x73\x20\x10\x31\x31\xe5\x0c\x68\x49\x94\x13\xd2\x64\x83\x3a\x53\x6d\x6e\x28\x15\x03\x2e\x5e\x5e\x66\x96\xef\x76\x9c\x02\x41\x8d\x10\xe8\x97\x32\x4f\xd6\xd1\xb4\x8f\x32\xfd\x54\x0a\xcd\xf7\xec\x86\x01\x11\x15\xcf\xe8\xd5\x2e\x32\xee\x92\xea\x3b\xa6\x58\xd5\x4e\xf7\x5d\xd9\x9c\x2a\x23\x5e\x4b\x50\xb5\x03\x4f\x4b\x9a\x41\x1b\x8d\xaa\xed\x73\xf4\x7d\x11\xb9\x19\x95\xbc\x05\xa4\x90\xed\x6d\x37\xd7\xe4\x07\xe3\xb4\xfc\x4e\xcd\xe3\x55\x2c\x1c\x30\x6b\xb9\x25\x29\xe8\xc9\xe5\xb4\x5f\x8a\xca\xf4\x4a\x8a\x2d\xdf\x81\x02\x54\xed\x36\x5e\xe8\x9d\x84\x78\xed\x9a\xfc\x2c\x21\x78\xb5\x95\x2f\xc8\x9d\xd6\xb9\x7a\x71\x75\x75\x5f\x6e\x58\x21\x98\x66\x6a\xcd\xe5\x55\x2a\x13\x75\x95\x48\x91\xb0\x5c\xc3\xff\x18\x9f\x98\x15\xea\x0a\x87\xf6\x4f\x38\x6c\x47\x2e\x76\x2b\xf8\x8b\xe9\xb8\x7d\xd3\x4a\x8a\x15\x5d\x99\x25\x32\xd2\x4a\x8f\x27\xd5\x52\xb6\x9f\x64\x42\xb3\x0f\x60\x2a\x3f\x39\x75\xaa\x5d\x74\x26\x80\x9c\x18\xb2\xb2\x41\xd7\x32\xa6\xc9\x51\x96\xa4\xfa\x1a\x28\xab\x95\x34\xb5\x16\x99\x70\xa1\x78\xca\x2a\x65\x9c\x90\x58\xa9\xe9\xf8\x86\x17\x06\xc8\x1a\x41\xd3\x3b\x5b\x7b\x05\xbe\x37\x8b\xc4\x6e\xe6\xb6\x03\x7a\xf6\xa4\xca\x83\x31\x73\xec\xe1\xea\x41\x16\xf7\x66\x22\x8d\x93\xb2\xc2\x41\x50\x57\xd0\xb7\xab\x3f\xc1\x7f\x3c\x1b\xe3\xed\x87\xd7\x1f\x5e\x90\xeb\x34\xb5\x84\xec\x52\xb1\x6d\x99\x59\xae\xe1\x9a\xd0\x9c\xff\xca\x0a\x73\xec\xbb\x24\xf7\x5c\xa4\x97\xa4\xe4\xe9\x7f\x8d\x29\x07\x5e\x41\xbe\x41\xf0\x56\x3b\xbe\x67\x1b\x47\xea\xfd\xc4\xe0\xb7\x86\xfd\xbd\xbd\x19\xcf\xe2\x96\xb8\xdb\x62\x6f\x57\x11\x4c\x29\x26\x62\xe0\xd4\x19\x9d\xa4\x4e\x1e\xe0\x1a\x7d\x28\x0b\xe5\x5d\x36\xd9\xc3\xac\x20\xca\x58\x94\xf1\x55\xef\x6e\x54\xed\x16\xa0\xcf\x88\xd4\x7a\xaa\x54\xb9\xc7\xcd\x87\x02\xa1\x7b\xcb\xb5\xaa\x02\x69\xa3\x92\x5b\x11\xa3\xc9\x41\x9e\x98\xac\xe6\x97\x87\xc7\x46\x7a\x1e\xda\x12\xa0\x1f\x9d\x15\xd3\x68\x42\x27\x06\x64\xb9\xc4\x16\x9e\x34\x3b\xaa\xcf\x5e\xc3\x00\x03\x61\x56\xd7\xce\xff\x9a\xdc\x0c\x48\x84\x3d\x7f\x22\xa0\x64\x9e\x34\xae\x44\x86\x28\x4f\xe7\x05\x9d\x8c\x93\x7a\x3e\x71\xb1\x8f\x4a\x9d\x65\xd9\xb7\x7c\x57\x16\x60\x3c\xaf\xa8\x52\x7c\x27\x8c\xed\x06\x52\xf0\xd5\xb4\x67\x31\xb1\xf2\xf2\x82\xcb\x62\xa2\xe2\x44\x8f\xf0\xec\x1e\xc0\xc3\xd3\x9a\xfc\x4a\x0b\x2e\x4b\xe5\x92\x4c\x12\xb9\xcf\xa5\x00\x34\xa5\x54\xe3\xfd\x6e\xa4\xcd\x34\xf9\xcc\x95\x70\x6b\x32\x73\x99\xda\xcc\x92\x8f\xf6\x97\x51\x89\xd7\xe9\x9e\x03\x64\x45\x5e\x49\xa1\x0b\x89\xdb\xbb\xb2\x9e\x6a\x7a\x69\x56\x52\x5e\x40\x36\x0b\x34\xad\x50\x98\xc1\xa2\xd0\xc7\x08\x68\x29\x02\x46\xb4\x7a\x4f\x52\xbf\x27\x97\x79\xe9\x22\x88\xee\xf6\x71\xdd\x34\xaf\x75\xfd\x79\x95\x51\xa5\x8c\xad\x42\xe9\x40\x64\x2f\x6a\xac\xeb\xb2\xa6\xb7\x17\x93\xd1\x49\x37\x72\x63\x4b\x3f\x24\xa1\xce\x9f\x42\x97\x77\x5b\x1d\xa4\x36\x2d\xe7\xad\xe1\xef\xdb\x19\x7e\xa6\xea\xd6\x93\x33\xd4\x23\xd0\xea\x55\x52\x70\x38\xb1\x8c\xe3\x3e\x54\xa4\xd5\x23\x49\x56\x2a\xcd\x8a\xfa\x29\x2c\x05\xf0\x20\xf1\xed\x14\x62\x9d\x0f\xb2\x70\x55\x09\x26\x16\x25\xb6\xb0\x55\x5a\xc0\x36\x11\x10\x34\x87\x92\x98\x41\x65\x05\xd9\x30\x5f\x66\x65\x47\xc8\x71\x4d\xae\x8d\x6f\x0c\x9b\xb0\xd9\xb8\x2b\xa3\xe6\xa0\x8d\xcd\x91\x24\x05\x9b\xfe\x0e\x33\x6d\x2b\x91\xf3\x8a\x6c\xeb\x8c\xfd\x01\xb5\x7a\xb7\x85\x13\x7f\x63\x06\x26\xf5\x48\xa6\xf5\x2a\x74\x1e\x74\x8a\x07\x19\x22\x0b\xf2\x77\x56\x48\x5b\x09\xa2\x60\xb8\x13\xba\x9f\x17\xef\x3a\x05\xa3\x29\x17\x4c\xa9\xb7\x46\x2d\x02\x8f\x36\x2d\x9d\xa2\x59\x56\x4b\x21\x3b\x3c\x4d\xda\xc6\x33\xb3\x90\x26\x53\x86\xe0\xcc\x22\xd3\x5a\x82\xab\x42\x00\xf1\x2b\x9a\x1e\xcd\xc9\x54\xc0\x4b\xcc\x56\x5c\xfb\xd8\xe3\x53\x53\x30\xfb\xe4\xf5\xfb\xd7\xf0\x60\x22\x05\x6e\x9b\xcd\xfc\x41\x97\x43\xdb\x6e\xf9\xb8\x16\xd1\x03\x23\x4a\x53\x5d\x02\x86\x4f\x33\x63\x3b\xcf\x6e\x8b\x92\x9d\x0d\xb9\x94\x3b\xae\xd7\xf7\xff\x09\x5b\x09\x13\x77\x54\x24\xe8\x1c\x5c\xdd\xb3\x5c\x5d\x29\xbe\x5b\x09\xa6\x8d\x47\x79\xf5\xfc\xf9\xf3\xff\x80\xad\x04\x9a\xfc\xe7\x6f\x5f\xfe\xf9\xdb\x97\xeb\xfd\x49\x4e\x05\xe6\x2c\xd7\x9c\xdd\xfa\x44\xd0\x72\xe9\x7d\xe9\x8d\x66\x32\xaa\x11\x7c\xa4\x0b\x5f\xc9\xb9\x35\x7a\x19\xee\xcb\xbf\x6a\x3e\x87\x4d\x57\x18\xe6\xaf\x24\xda\x09\xf5\x78\xe1\x68\xf2\xea\x87\xe0\x14\xde\xc9\xd2\x3e\xe6\x13\x47\x15\x12\xea\x77\xfb\xb1\xb8\x55\x7b\x38\x9e\xd2\x83\x2f\xf0\x4c\x3f\x6f\xeb\x78\xf6\xa9\xf3\x54\x6b\xe0\x9b\x3f\xfa\xa0\x41\xbb\xd6\xc0\x27\xc3\x55\x41\x76\x85\x2c\xf3\x4b\xeb\x04\xd6\x08\x52\x69\xd1\x82\xa2\xc4\x5c\xb4\x29\x5b\xb9\x26\x68\x5f\xdb\x4d\xa9\x6a\x06\x35\xeb\xde\x18\x6b\x9c\x92\xc4\xdc\x30\x89\x60\xf4\x52\x99\x8b\x52\x80\x15\x2f\x05\xe4\x93\xd8\x60\x09\x7a\x06\x67\x19\xdb\xd1\xe4\x78\xd6\x7a\xff\xa8\x74\x67\x12\x4d\x0f\x5d\xbf\x11\x12\x32\xa7\x16\x9e\x70\x8d\xed\x43\x6d\xa4\xc2\x86\x65\x60\x53\x9a\x5e\x7a\xb0\xdf\x94\xca\x76\xd5\xed\x17\x76\xca\xc9\x1d\x15\x69\xc6\x8a\xc1\x83\xaf\xdf\x4a\x19\xff\xd6\x4a\x5a\x41\xf3\xd6\xfb\x71\x5b\x0e\x21\x13\x9b\x1f\x92\xe5\x77\x94\x6c\x19\xd5\x65\xc1\xc0\x53\xc0\xd2\x58\x54\xec\x98\x53\x87\x6d\x69\x7e\xf4\x00\x73\x13\xab\xac\x3a\xf8\x2d\x74\x86\x5a\xf3\x6d\x76\x5a\xae\x72\x5b\x3b\x68\x73\x0c\x08\x9c\x54\xef\x1f\xd9\xe7\xc7\x85\x4f\xd8\x6f\x9c\xbc\x5a\xf4\xe2\xc1\x61\x49\x09\xee\x89\x14\x9a\xfd\x3e\xca\x66\x69\x2f\xf8\x1b\xfb\x90\x45\x29\x2b\x2f\xd1\x2d\x50\xb3\x2a\x8d\x7a\x9e\xec\x60\x95\xcb\x8c\x27\xc7\x2b\xd7\xd8\x55\x82\xad\xbd\x1a\x15\x1d\x86\xde\x68\xaa\xee\xeb\x53\x1b\x83\xfd\xb5\xf2\x1c\xfa\x6f\x1b\xd3\xc0\x90\x3d\x6d\xab\xde\x1a\x4b\x16\x5c\x34\xf0\xec\xba\xf2\x88\x55\x99\x3b\x00\x34\x43\x7b\x88\x4b\xd9\xc6\x76\xa7\xb7\x20\xe9\x3c\x1b\xeb\x0e\x99\x45\x45\xd1\x2a\xde\xc8\x3d\x23\x07\x99\x95\x7b\x06\x7a\xa2\x30\xe2\xe4\xdd\x1d\x7f\x2c\x37\x2c\x63\x80\xd5\xd8\x85\x0a\xa9\x03\x0f\x46\xfc\x1d\xcf\xf1\x5c\x48\x75\x25\x1a\x4e\xde\xe6\xe7\xe9\xd8\xe2\xe6\xe8\xd4\xe8\x05\xf9\x1f\x41\xbe\xc1\xc3\x96\x7c\x80\x8c\xf0\xb7\xef\x5e\x57\x4b\xc4\xdc\xf5\xc3\x0d\x0c\x27\xf9\x76\x7a\x07\xbe\xc5\xfc\xec\x1d\x4f\xc9\x06\x41\x21\x63\x9e\xcf\x05\x7b\x20\x5b\x9e\x31\x85\x0e\x7c\xed\xe5\x61\x93\x27\x45\xba\x56\x40\x87\x4c\xa3\x6d\x53\x2e\xc8\xbf\x62\x8b\x73\x56\xb8\xd3\xe7\x86\x5b\xa8\xf8\xc3\xa7\x67\xd3\x9d\x07\x63\x5e\x3c\xac\x8a\x87\xd5\x6a\xb5\x32\xfd\x77\x9b\x09\x9a\x08\x37\xe6\xd5\x9e\xb3\x97\x29\xdf\x4e\x47\xe4\xda\xb3\x62\x6c\x6b\xdd\x34\xe5\x82\x9f\xd8\xe3\xf5\x54\xd4\xbe\x71\x2c\xfd\xf7\x7f\xf3\x06\xeb\x7c\xec\xae\xa2\x14\xd7\x33\xd7\x82\x19\x55\xa3\x00\xd5\x7e\xcf\x08\x13\xba\x38\x22\x29\xc7\xc2\x10\x95\x8a\x4f\x8e\x49\x5e\xc8\x04\x0e\x0f\xbf\x98\x7d\xd0\xed\x7d\xce\x9c\x72\x3b\xe6\x6b\xf2\x33\x3d\x12\x9a\x29\x04\x8d\x3c\x3c\x21\x2e\xc8\x4d\xdb\x8a\xa2\xc7\x61\x54\x8d\x0b\xb2\x91\xfa\xae\x7b\x83\x37\x21\xf4\xa3\x4c\x3b\x8f\x34\xca\x9f\xb4\x4f\x27\x9d\xfb\xa6\x55\x82\xde\x33\x73\x92\x67\x09\x4b\xc1\xa7\xdf\x76\xd2\xb6\xc7\x77\x12\xf2\x34\x9a\xf0\x5e\x8a\x4f\x52\x4e\xb2\x28\xdb\x5b\x73\x03\x99\xb0\x75\x95\xaa\xa6\xe3\x09\xdd\xa8\x08\x55\x9e\xb4\x73\x21\xc5\xaa\x90\x12\xfc\x21\xdc\x97\x75\xe1\x90\x9c\xd6\x5a\x3b\xd0\x8c\xa7\x16\x67\x98\xd6\x82\x3d\xdd\x31\x42\x6b\x87\x4a\x4b\xc2\x84\x2a\x0b\x56\x81\xc4\xa9\x64\x18\xd9\xb7\x4d\xfc\xe5\xdd\xeb\x49\x91\xcf\xc9\xb9\x69\xe3\x05\xac\xdd\x2d\xe5\x70\x96\x54\x9a\x16\xdd\x7e\xf3\xad\x13\x6f\xba\x32\x29\xb3\x72\x50\xb7\x34\x53\xec\xd2\xb8\xc5\xaa\x4c\xee\x5c\x3f\x8d\xd5\xaa\x62\x72\xac\x00\xf0\xc4\x93\x81\xd0\x59\x2a\x4b\x96\xc3\xa4\x7c\xd3\xf9\x3f\x68\x39\x4c\x75\xd4\x1f\xff\x25\x4e\xa7\x7f\x51\x6c\x32\xe3\xbd\x67\xdc\x7e\x39\xb1\x71\x6b\x06\xb5\x8d\x82\xb7\x47\x08\x35\x75\xcf\x34\x4d\xa9\x9e\x5e\x26\x68\x10\xdd\xc3\x3d\xb3\x38\x36\xd7\x93\x32\x3d\x66\x71\x6c\xae\x27\x65\xfa\xf5\x60\xd0\xf4\x79\xb6\xcf\xcf\x63\x16\x15\xfb\x89\x8b\xf2\x77\x4c\x5d\x98\x44\x49\x7a\x7a\x74\xf3\x06\x1e\x25\x89\xeb\x33\x4c\x14\xfa\x89\x69\xdf\x17\x9c\x5e\xd7\xef\x5a\x73\x7f\xd9\x31\x39\xce\xca\x81\xb1\x30\x7e\x23\x80\xb1\xd3\xda\x54\x50\x91\xca\x7d\xaf\x95\x55\x69\xe0\x7a\xb0\x5b\x56\x25\x44\x9b\xbe\x56\x8b\x33\x73\x03\x0e\x65\x24\x65\xec\xc0\x26\x92\x5e\xf0\x6a\xa7\x06\x98\x27\x8c\x83\xec\x66\x07\x44\xd8\x84\xbb\xe0\xe3\x06\xc1\x23\x47\x4b\x55\x7c\xf9\x6b\xc1\x99\x6b\x85\xcc\x3c\x58\x60\xb7\x60\xad\xcc\x6c\x78\xd9\x75\xca\x88\xf8\xa2\xfa\xa4\xbd\xf8\x66\x77\x99\x1f\xf3\x4e\x9f\x20\x2f\xe5\x4b\xea\x53\xe9\xd9\xfe\x7a\x7d\x32\xfb\x65\xbb\x4f\xb0\x69\x7d\x39\x7d\x0a\xca\x6b\x6c\x1e\xd3\xe1\x7c\x13\x6e\xbb\xaf\xab\x2c\x2f\x38\xde\xab\xa6\xc9\x06\x04\x8c\x17\x10\x98\x82\xed\x7d\x7a\x8d\x94\x00\x70\xb7\xcd\x29\x24\x3f\xb9\x94\x80\xde\x18\x79\x58\x74\x79\xc1\xf7\xb4\x38\x9a\x03\xd8\xba\xbf\x29\x08\xe9\x9a\xec\xbc\x46\xa8\x84\xed\xc5\x24\xc4\x31\x6c\x92\x02\xf2\xc4\x43\x77\xdf\xf0\xf2\x23\x21\xb9\xa9\xea\xa8\x12\x3d\x4d\x80\x69\x4d\xf1\x0d\xde\x4f\xee\x64\x96\xd6\xe4\xe3\x3a\xe9\x29\x75\x12\x01\xf8\xf5\x75\xb8\x0e\xbc\x7f\x84\x02\xee\x5c\xdf\x99\x79\x29\xf3\x5c\x16\xba\x21\xeb\xdc\x82\x2a\x61\xfe\xa3\xdd\xd3\x2f\xc8\x1e\xea\xd3\xb8\x13\x47\x46\x4b\x31\xcd\xe6\x0a\x98\xa5\x81\xc1\xb0\x81\x54\x24\x73\x16\x82\x65\x24\xa7\x05\xdd\x33\x8d\x5f\x71\x08\x38\x79\x87\x13\x74\xfd\x39\x61\xbd\x46\xba\xb4\x30\xea\x5e\x73\xc4\x04\xcb\xd0\x9a\x31\x41\xb9\xd8\xe0\x4e\xcc\x6c\xd8\xaf\x2e\x23\xfe\x09\x5b\x16\x96\x21\xbe\x82\x71\xf5\xdc\xe2\xaf\xa3\x15\x98\x36\x1e\xb2\x2c\x1f\xb8\x48\xe5\x83\x5a\xe2\x3c\xff\x86\x8f\xd6\xe9\x64\x36\xeb\x44\x75\x1c\xe8\xc9\xae\x34\x9c\xeb\x41\x07\xda\x01\xe6\x66\xc5\x02\x12\x1b\x6a\x86\xbb\xc7\x99\x66\x98\x68\xfd\x95\x38\xbb\xa7\xf0\x6c\x77\x7b\x45\x5f\x15\x46\x9e\xe6\x34\xbb\xc9\x59\x32\xcb\xd5\x78\xfb\xf3\xcd\x75\xfb\x71\xe3\x78\x20\x81\xc5\xf4\xd8\xfc\x5e\xa7\x0f\x79\xd7\xd3\x03\xdb\xdc\x49\x79\x4f\xce\x1b\x91\xb2\xbb\x72\xb3\x4e\xe4\xbe\x11\x6f\x58\x29\xbe\x53\x57\x56\x35\x57\xa6\x07\x7e\x36\x10\x17\x19\xd8\x46\x67\xbd\x21\x25\xca\xa2\x01\xd0\xc8\xa4\xea\x05\x4c\x10\x86\x2e\xbd\x62\xed\x7e\xd0\x1f\x06\xb0\x76\x55\x0a\x55\x95\xf8\x15\xc0\x03\x84\x10\xde\x0a\x8f\x0b\x46\x99\x38\x92\xfd\x5c\x7a\x34\xc4\xc8\x58\x71\x80\x80\xb0\xf1\xe5\x30\xd9\xcb\x6f\xaa\xea\x25\x09\xfd\x75\x31\xc2\x6d\x46\x77\x27\x73\x55\xfb\xda\x34\x15\x23\x74\x97\x47\xa3\x5c\x56\xab\x0b\x28\x87\x16\xae\x19\x9c\x56\x97\xcb\xde\x9a\x93\xe6\x98\xfb\xe7\x27\x78\x4e\xba\x63\xee\x15\xfd\x24\x73\x52\x41\x68\xb3\xa7\x02\xa0\x34\xfb\xa0\xb1\x55\xce\xa2\x0f\x42\x6b\xde\xce\x75\xa1\xb7\x61\x78\xcd\xdc\xd2\x86\xd8\x02\x96\x76\x07\x82\xf3\xc1\x6c\x21\x12\xfb\x26\xfc\x51\xbb\x02\x79\xda\x9d\x81\x0c\xed\x0e\xe3\x3a\x8e\x3a\x1c\x30\x0e\xb3\xd5\xfc\x53\x53\xd9\x3e\x87\xbe\x9f\x82\xe1\xa6\x5a\xbc\xb4\xf0\xbc\x9d\x9b\xde\x73\x03\x66\x8b\xb4\xef\x1a\xed\x8a\xe5\x16\x35\x72\x72\xf0\x80\x72\x8a\x48\x7c\xfd\x77\xdb\xd5\x95\xa5\xd0\x79\x72\xaa\x27\x46\x5f\xcb\x8c\x61\x9e\x76\x58\x32\xe3\x60\x4a\xc8\x33\xd5\x94\x33\xa6\x11\x73\x72\xf1\x6e\x5d\xba\xba\x19\xbf\xdb\x4a\x36\xac\x07\xad\x29\xe4\x85\x18\xab\x83\xbf\x4c\x22\x22\xe6\x8c\x6d\xc6\x4f\xdb\xaf\xad\x35\xd2\x9c\x74\x01\x65\xfd\xbe\xab\x6a\x16\x5c\xb2\xed\x96\x25\xfa\x7b\x52\x2a\x8f\xba\xde\xd5\x15\xee\xea\x6a\x01\xdf\xb9\xff\xfb\xfe\xb1\xdc\x1d\x6c\xc7\x8c\xa3\xe4\x1b\x78\xa0\x93\xb0\x8c\xdd\x46\x59\x66\xb8\xf6\x21\xe5\x48\x90\xad\x8b\xcc\x76\x4b\x34\xc8\xb2\x96\x28\x65\xf3\xdc\x03\x58\x6e\x78\x59\x06\x6f\x5d\x12\x81\x91\xf7\xd2\x16\xfc\x64\x97\xe4\x23\xe4\xc9\xd5\x7f\x09\x28\x13\xf4\x5e\x62\x61\xd0\x53\x64\x1e\x06\x14\xaa\x6a\x0d\xf5\x8f\x75\x59\x2a\x1c\x15\x57\x96\x0a\xff\x54\x29\xab\x6f\x50\xea\x32\x54\x93\x63\x7e\xcf\x8e\x55\xe1\x1f\x8f\x48\x5b\x30\xcb\xe6\xdc\x55\x6a\xe9\x12\xb6\xb1\x0a\xcf\x5f\x6c\xd1\x3a\xb9\xdf\x70\x11\xd2\x50\x6c\x96\x53\x1f\x68\x99\x9b\x48\x91\xc2\x3f\xa1\x89\xa7\x98\x88\xb0\x3a\x59\xad\xd9\xf8\x30\x5e\x15\xab\x55\xe5\xca\xb7\x4d\xc9\x7a\x3f\x1f\xfc\x60\x4e\xf3\x8b\x37\x6f\xfe\x56\xd2\xcc\xb7\x8e\x9a\xde\x11\x3e\xe0\x44\xf4\xca\x9a\x3c\xf0\x2c\x4d\x68\xe1\x53\xfa\xad\x2c\x1c\xd3\x42\x59\x1a\x16\x56\x60\x4c\xa8\xa8\x4c\x61\xad\x39\xca\x5f\xd5\x8f\x92\x9c\x16\x9a\x27\x65\x46\x0b\x62\xec\xc6\x4e\x16\x9e\x8a\x4f\xa1\xfb\x79\xb5\x0c\x6e\x58\x22\x45\x3a\x07\x16\xbb\xed\x3e\xdb\x9c\x5b\x8d\xa9\x45\x1c\x0a\x4f\xfa\x26\x15\xf2\x0f\x5a\x8b\x92\x9c\xb7\x99\x59\x72\xeb\xec\x63\x65\x52\x7c\xd6\x0c\xa8\x10\x0f\x5c\xb1\x26\x33\x88\x2b\xc2\xb1\x6e\xf1\x45\xbd\x2b\xd5\x36\xc2\xa7\x2c\x2f\x8f\x2e\xf9\xe6\xb2\x62\xed\x69\x02\x69\x4f\xb6\xbd\x76\x11\xda\x49\xf6\xdb\x02\x34\x1e\x5b\x59\xb0\x03\x2b\xc8\x79\x2a\x41\x22\x94\xc5\xbd\x58\x93\xff\x66\x85\x04\x55\x16\x6c\x87\x95\x56\x71\x49\x7b\x84\x56\xa9\x67\x36\x5d\x8c\x2a\xf2\x9c\x9c\x63\xad\x5d\xbe\xdf\xb3\x94\x53\xcd\xb2\xe3\x85\x3b\x5f\x23\xdb\x65\xba\xf3\xa7\xc7\xad\x03\xc0\xc4\x01\x20\xb1\x65\xd2\xd1\xaf\xef\xa8\x4e\x58\xdd\x7a\x63\xcf\x47\x4b\xa0\xb5\x4e\x0d\x55\x16\x37\x1a\xec\x60\xb5\xfb\xab\xd1\x5d\x4a\x0a\xb6\x83\x75\x8b\x6b\xf1\x04\xab\xf6\xd1\x89\xf3\x13\x02\x46\x7f\x72\xa9\xbb\xdd\xf9\x6a\x03\xe5\xce\x33\xa8\x4b\x03\x35\xa9\xac\x60\x19\xb9\x38\xc8\x7b\xe3\x8e\x6d\x68\x72\x5f\xe6\x44\x0d\x7f\xa4\x78\x64\x24\x86\x80\xde\x15\x29\x98\x66\xc2\x34\xe1\x23\x24\xde\xfe\x8b\xa7\x3f\xc8\x77\x69\x8a\x18\xf3\xf6\xe4\x06\x0e\x64\xe9\x5b\x26\xac\x76\x4d\xf6\xff\x43\xef\x76\xa7\xae\xf0\x55\x55\x73\x76\x14\x9a\xec\xea\x5f\x9d\xfc\xde\x24\x61\xd0\x84\x2b\xf2\x12\x46\xe9\x25\x78\x84\xe4\x9d\x6e\x94\xaf\xae\xce\xf3\x8d\x5b\x9e\xa9\x86\xf4\xbe\xa6\x56\xe9\xf9\x58\xcb\x1b\x68\xa5\xfb\x12\x0b\x15\x38\x5b\x70\xfd\xf1\x1d\x9c\xa1\xfa\x81\xae\x29\x0b\x30\xb6\xe6\x07\xc6\xbf\xf3\xa7\x03\xd2\xc3\x5f\x90\xc3\x37\x1b\xa6\xe9\x37\xf5\x9f\x60\x2e\x10\xb3\x6f\xfe\x8a\x07\x48\x96\xbe\xa8\xe9\xba\x4a\xcb\x82\xee\x98\xfd\xcb\xff\x07\x00\x00\xff\xff\x48\x78\x50\x8a\xa9\x66\x04\x00") func stashAppscodeCom_backupbatchesYamlBytes() ([]byte, error) { return bindataRead( @@ -101,7 +101,7 @@ func stashAppscodeCom_backupbatchesYaml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "stash.appscode.com_backupbatches.yaml", size: 206841, mode: os.FileMode(420), modTime: time.Unix(1573722179, 0)} + info := bindataFileInfo{name: "stash.appscode.com_backupbatches.yaml", size: 288425, mode: os.FileMode(420), modTime: time.Unix(1573722179, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -146,7 +146,7 @@ func stashAppscodeCom_backupconfigurationsYaml() (*asset, error) { return a, nil } -var _stashAppscodeCom_backupsessionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x59\x51\x8f\xdb\xb6\x0f\x7f\xcf\xa7\x20\xfa\x7f\xe8\x7f\x40\x2f\x87\xae\xc3\x30\xe4\xad\xbd\xb6\xdb\x6d\x6b\x77\x68\xae\x7d\x67\x6c\x3a\xd6\x4e\x96\x3c\x89\xce\x2d\x1d\xf6\xdd\x07\x4a\xb6\x63\x3b\xb6\x93\xb6\x57\xa0\x7a\x3a\x4b\x24\x45\xfe\x48\xfe\x24\x5d\xb0\x54\x1f\xc8\x79\x65\xcd\x0a\xb0\x54\xf4\x37\x93\x91\x2f\xbf\xbc\xfb\xc9\x2f\x95\xbd\xdc\x3d\xdd\x10\xe3\xd3\xc5\x9d\x32\xe9\x0a\xae\x2a\xcf\xb6\x78\x47\xde\x56\x2e\xa1\x97\x94\x29\xa3\x58\x59\xb3\x28\x88\x31\x45\xc6\xd5\x02\x20\x71\x84\x32\x79\xab\x0a\xf2\x8c\x45\xb9\x02\x53\x69\xbd\x00\xd0\xb8\x21\xed\x45\x06\x00\xcb\x72\x05\x9e\xd1\xe7\x0b\x00\x83\x05\xad\x60\x83\xc9\x5d\x55\x7a\xf2\xd1\x83\xb0\xb8\xc4\xb2\xf4\x89\x4d\x69\x99\xd8\x62\xe1\x4b\x4a\x44\x1d\xd3\x34\xec\x8b\xfa\xc6\x29\xc3\xe4\xae\xac\xae\x0a\x13\x4c\x5f\xc0\xaf\xeb\x3f\xde\xde\x20\xe7\x2b\x58\x8a\xc2\x52\x99\x9d\xbd\x23\xb7\x94\x18\xc2\xde\x71\xbb\xeb\x38\x7d\x71\xbb\x2f\x29\x4c\xf3\xbe\x24\xf1\xc9\x29\xb3\x9d\x35\x24\xfa\x23\x86\xde\x36\xd3\xb3\x86\x18\xb9\xf2\xcb\x32\x47\xdf\xb5\x71\xd3\x7e\xcf\x29\x37\x30\x2f\x8f\x30\xee\x98\x7a\xbe\xed\x1a\x4a\x91\xe5\x73\xeb\x6c\xd5\x00\xde\xc7\x34\xaa\xd5\x59\x49\x90\x69\x6b\x9d\x6a\xbe\x2f\xda\x14\xc9\xdf\x8d\x5e\xf3\x19\x92\x0a\x10\x6b\xe3\x45\xc8\xde\x3a\x66\x2f\xcc\x6b\xe5\xf9\xb7\xe3\xb5\xdf\x95\xe7\xb0\x5e\xea\xca\xa1\x1e\xe6\x3d\x2c\x79\x65\xb6\x95\x46\x37\x58\x5c\x00\x94\x8e\x3c\xb9\x1d\xbd\x37\x77\xc6\xde\x9b\xd7\x8a\x74\xea\x57\x90\xa1\x0e\xf8\xf9\xc4\x4a\xd4\x92\x0a\x5f\x62\x42\x92\x70\x5f\x6d\x5c\x5d\xb2\x75\x58\x31\x09\x2b\xf8\xe7\xdf\x05\xc0\x0e\xb5\x4a\x03\x9a\x71\xd1\x96\x64\x9e\xdf\x5c\x7f\x78\xb6\x4e\x72\x2a\x30\x4e\xca\xc6\xb6\x24\xc7\x2d\x34\xb1\x88\xdb\xf6\x69\xe7\x00\x52\xf2\x89\x53\x65\xb0\x08\x8f\xc5\x54\x94\x81\x54\x1a\x86\x3c\x70\x4e\xb0\x8b\x73\x94\x82\x0f\xdb\x80\xcd\x80\x73\xe5\xc1\x51\x08\xd1\x70\x70\xa9\x63\x16\x44\x04\x0d\xd8\xcd\x9f\x94\xf0\x12\xd6\x02\x83\xf3\xe0\x73\x5b\xe9\x14\x12\x6b\x76\xe4\x18\x1c\x25\x76\x6b\xd4\xc7\xd6\xb2\x07\xb6\x61\x4b\x8d\x4c\x35\xf4\xcd\x08\xcd\x63\x50\x0b\x08\x15\x3d\x01\x34\x29\x14\xb8\x07\x47\xb2\x07\x54\xa6\x63\x2d\x88\xf8\x25\xbc\xb1\x8e\x40\x99\xcc\xae\x20\x67\x2e\xfd\xea\xf2\x72\xab\xb8\x21\x8c\xc4\x16\x45\x65\x14\xef\x2f\x13\x6b\xd8\xa9\x4d\xc5\xd6\xf9\xcb\x94\x76\xa4\x2f\xbd\xda\x5e\xa0\x4b\x72\xc5\x94\x70\xe5\xe8\x12\x4b\x75\x11\x1c\x37\x1c\x7a\xbe\x48\xff\xd7\xa6\xea\x71\xc7\xd3\x41\x53\xc4\x11\xea\x6e\x12\x77\xa9\x3c\x50\x1e\xb0\x56\x8b\xfe\x1f\xe0\x95\x29\x41\xe5\xdd\xab\xf5\x2d\x34\x9b\x86\x14\xf4\x31\x0f\x68\x1f\xd4\xfc\x01\x78\x01\x4a\x99\x8c\x5c\x4c\x5c\xe6\x6c\x11\x2c\x92\x49\x4b\xab\x0c\x87\x8f\x44\x2b\x32\x7d\xd0\x7d\xb5\x29\x14\x4b\xa6\xff\xaa\xc8\xb3\xe4\x67\x09\x57\x68\x8c\x65\xd8\x10\x54\xa5\xf4\x6c\xba\x84\x6b\x03\x57\x58\x90\xbe\x42\x4f\x5f\x1d\x76\x41\xd8\x5f\x08\xa4\xa7\x81\xef\xb2\x7d\x5f\x30\xa2\xd5\x4e\x37\x7c\xdd\x8c\xb1\x1e\x8a\x65\x18\x18\xb4\x3f\x39\x48\x68\xcd\xb2\xe0\x28\x13\xf0\xeb\x9a\x8e\xcc\x72\x65\x4d\xa6\xb6\x95\x0b\x2d\x03\xd6\xd5\xd3\x2f\x90\x93\x7c\x60\x13\x60\x43\x92\xfa\xca\x53\x2a\x46\xe2\xd6\x31\x83\x91\x6b\xc0\x77\x38\xec\xb4\xef\x10\x79\xe0\xe7\x40\xb0\x47\x2b\x83\x20\x9e\xdf\x5c\x07\x41\x29\x4c\x71\x3f\xd0\x32\x64\xd6\x85\xaf\xb6\x0a\xa3\x8b\x21\x52\x32\x91\xc4\x86\x63\x34\x31\xcd\x18\x76\xc6\xa8\x2f\x4d\x83\xc8\xce\x62\x4d\xe8\xe5\xc1\x3c\x08\x47\xd1\x29\x0f\x84\xa5\x1b\x0f\x44\xe1\x01\x3d\x90\xde\x52\x8e\x8e\x50\xb8\x80\xf6\x16\xd0\x9d\x6c\x4f\xf4\xa1\xf1\x41\x41\x4f\xd5\x79\x3c\x4f\xce\xa8\xf4\x70\xee\xcf\xd6\x79\xb8\x09\x80\x32\xa9\x92\xc3\x38\x82\x63\x77\xe4\x50\xeb\xa8\x1d\x4f\x0a\x6a\xaa\xb5\x74\x36\x21\xef\x8f\xe0\x89\x45\xa5\x7c\xff\xf0\x5d\xd6\xf6\xef\x95\xd6\x42\x36\x8f\xd6\x55\x92\x10\xa5\x94\x3e\x02\x6b\xf4\x1e\x54\xd6\xee\x72\x5c\xe6\x5a\x43\x6e\x85\xb1\xd0\xf5\x54\x97\x70\x2d\x47\xd3\xbe\x71\x4d\x84\x20\x43\xa5\xa5\xc3\x12\x5b\x94\x9a\xb8\x71\xf8\xc9\x91\xd9\x81\x47\xaf\x51\x69\xb1\x39\x9a\x8f\x91\x64\xd7\xed\xfa\xb2\x6e\xff\x59\x70\xd7\x7d\xd9\x40\x50\x2a\xdb\x03\x5b\x46\x0d\xac\x0a\x02\xc6\x3b\x32\x3d\xbf\x93\xca\xb9\x21\x87\xcb\xe8\xd3\x05\xfc\xdf\x57\x85\x00\x50\x4f\xa7\x2d\x1d\x65\x07\xe0\xbe\x3b\x3b\x28\x46\x3e\x22\x9a\x7e\x28\x22\x21\x87\xff\xbd\x0f\xd2\xca\xb3\x4a\xbc\xec\x26\xb5\xb3\x53\x69\x85\x4d\xb6\xda\x52\x88\xae\x1d\x05\x32\x4e\x78\x8a\xa9\x18\xe1\xba\x39\x1e\x84\x36\xea\xb1\xb5\x41\x00\x6d\x12\x3a\xb5\x3e\x97\x86\x09\xe7\xe3\x68\x43\x0c\x11\x8f\x0a\xcd\xf2\x15\x00\x39\x67\x8f\x4e\xa0\x11\xb7\x5f\x89\x5c\xc7\xe7\xde\xed\xc2\x66\xd1\x0e\x28\x03\xc9\x44\x17\xc5\x51\x57\x89\x34\x49\xe5\x86\xdc\x73\x96\xc3\x12\xe9\x14\xcd\x0e\x7c\xfe\xa5\x16\x6d\xdd\x6e\xe9\xb6\xed\x56\xce\x91\x21\x47\x0f\x1b\xa2\x61\x25\x74\x7d\xa6\x14\x26\x92\x70\xc2\xdd\x51\xe6\x1b\xf1\x75\xc8\x7f\x0d\xcd\x1d\xa8\xaf\xce\xf2\xe7\x38\xe1\x0d\x96\x3e\xb7\xc7\xad\x35\xe2\xc8\xba\x91\xad\x59\x42\xd5\x64\x1c\x5a\x73\xd0\x67\xad\xdd\x09\xe4\x7a\xe8\xd6\xb5\xdd\x2b\xd9\x50\x30\x91\x67\xe6\xaf\x21\x71\x4c\xf4\x66\x8d\xf4\x6c\x87\xc6\x91\x29\x4d\xeb\x31\x8e\x99\x84\xe3\x75\xa3\x31\xca\x39\x62\xcf\x37\xe9\x99\x31\x79\x48\xc1\x8c\xd0\x39\x01\xc8\x28\x6c\x2a\x69\x49\xc5\xb5\x13\xa2\x83\x60\xde\x74\x35\xeb\x80\x22\xf9\x98\xaa\xd8\x90\x6b\x43\x3a\x61\x74\x98\xd9\xc6\x23\x79\xc0\x26\xf2\xe2\xf2\x3c\xcf\x5b\xcd\xc8\xac\x2b\x90\x57\xf2\x20\xfb\xf1\x87\x13\xb2\xb1\xc6\xe5\xe9\xb6\x25\x37\x2b\x6b\xe8\xfe\xd3\xb1\x79\x5b\x2b\x4d\xc0\x62\xe8\xfe\xb3\xa0\x09\xff\xb2\xf8\x66\x90\x09\x51\x7d\x3a\x36\xb7\xad\xda\x03\x16\xcd\x3c\xad\x1e\xc6\xd7\x41\xa2\x32\x9f\xdf\x46\xef\xfb\xba\x0f\x83\x49\x7c\x06\x4b\xc5\xe4\x68\xb6\xdf\x48\xc5\x4c\xbc\x06\xfa\x63\xfa\x34\x8e\x63\xe4\xf1\xd3\xbb\xe6\x77\x0f\xe5\xe6\x10\x38\xcd\x96\xd0\xb6\x56\xef\x44\x39\x19\xcc\xe4\x21\x19\x47\x89\x9c\x9f\x1d\xcc\x0d\x72\x3e\x08\x26\x55\x8e\x12\xb6\x6e\x7f\xd6\xd5\x22\x8e\xb6\x13\xe4\x38\x0c\x91\x9c\x11\xff\x79\xd1\xc4\x57\x92\x32\xdb\x5b\xf5\x09\x49\xba\xe9\xa9\x75\x23\xec\xdd\x51\xa7\xde\x60\x3d\x37\xe5\x99\x8d\x6e\x4b\x0c\x29\x32\x7e\x69\x40\xa1\xc9\xd6\xea\xe3\xf9\xb1\xdc\x36\x1a\x83\x44\x79\x99\xb2\x59\xf0\x4a\x82\x39\xa3\xc7\x24\x3b\x75\x28\x4d\x96\xbf\x34\x9e\xaa\xd4\x16\xd3\xe3\x07\xfb\x64\x38\xef\x6b\x85\xee\x55\xbc\x1b\x49\x63\x10\xd8\x9e\xae\x39\xd3\x69\x9e\x87\x29\xb9\x93\x84\x11\x05\xd0\x39\x3c\xc6\x6e\x46\x79\x4a\x2d\xd4\x83\xdc\xf3\xe7\x5f\x8d\xb7\xad\x58\xf7\x56\x3b\x20\xec\xf8\x6a\x0c\x6d\x5b\xbf\xca\x47\xdf\xbe\xb1\x53\xc7\xff\xcf\x30\x50\xe8\x50\xf2\xb3\xef\x47\x23\x3a\xa6\xe0\x11\x10\x06\x53\xbb\xe6\xa7\xab\xe6\x57\xaa\x76\xaa\xfe\x25\x28\xfe\x20\x72\x58\x95\xa7\xae\xdb\x51\xba\x02\x76\x55\x0c\xca\xb3\x75\xb8\xa5\x7a\xe6\xbf\x00\x00\x00\xff\xff\x88\xbd\xd2\xbd\x10\x1b\x00\x00") +var _stashAppscodeCom_backupsessionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x59\x51\x8f\xdb\xb6\x0f\x7f\xcf\xa7\x20\xfa\x7f\xe8\x7f\x40\x2f\x87\xae\xc3\x30\xe4\xad\xbd\xb6\xdb\x6d\x6b\x77\x68\xd2\xbe\x33\x36\x1d\x6b\x27\x4b\x9e\x24\xe7\x96\x0e\xfb\xee\x03\x25\xcb\xb1\x1d\xdb\xf1\xf5\xae\x40\xf9\x14\xcb\x22\x45\xfe\x48\xfe\x24\x2b\x58\x8a\x4f\x64\xac\xd0\x6a\x05\x58\x0a\xfa\xdb\x91\xe2\x27\xbb\xbc\xfd\xc9\x2e\x85\xbe\xdc\x3f\xdf\x92\xc3\xe7\x8b\x5b\xa1\xd2\x15\x5c\x55\xd6\xe9\xe2\x03\x59\x5d\x99\x84\x5e\x53\x26\x94\x70\x42\xab\x45\x41\x0e\x53\x74\xb8\x5a\x00\x24\x86\x90\x07\x37\xa2\x20\xeb\xb0\x28\x57\xa0\x2a\x29\x17\x00\x12\xb7\x24\x2d\xcf\x01\xc0\xb2\x5c\x81\x75\x68\xf3\x05\x80\xc2\x82\x56\xb0\xc5\xe4\xb6\x2a\x2d\xd9\xe0\x81\x7f\xb9\xc4\xb2\xb4\x89\x4e\x69\x99\xe8\x62\x61\x4b\x4a\x58\x1d\xd3\xd4\xaf\x8b\xf2\xc6\x08\xe5\xc8\x5c\x69\x59\x15\xca\x9b\xbe\x80\x5f\xd7\x7f\xbc\xbf\x41\x97\xaf\x60\xc9\x0a\x4b\xa1\xf6\xfa\x96\xcc\x92\x63\xf0\x6b\x87\xe5\xae\xc3\xf0\xc5\xe6\x50\x92\x1f\x76\x87\x92\xd8\x27\x23\xd4\x6e\xd2\x10\xeb\x0f\x18\x7a\x1f\x87\x27\x0d\x39\x74\x95\x5d\x96\x39\xda\xb6\x8d\x9b\xe6\x79\x4a\x39\xc2\xbc\x3c\xc1\xb8\x65\xea\xe5\xae\x6d\x28\x45\xc7\x8f\x3b\xa3\xab\x08\x78\x17\xd3\xa0\x56\x67\x25\x41\x47\x3b\x6d\x44\x7c\xbe\x68\x52\xc4\xbf\xa3\x5e\x7c\xf4\x49\x05\x08\xb5\xf1\xca\x67\x6f\x1d\xb2\xe7\xc7\xa5\xb0\xee\xb7\xd3\x77\xbf\x0b\xeb\xfc\xfb\x52\x56\x06\x65\x3f\xef\xfe\x95\x15\x6a\x57\x49\x34\xbd\x97\x0b\x80\xd2\x90\x25\xb3\xa7\x8f\xea\x56\xe9\x3b\xf5\x56\x90\x4c\xed\x0a\x32\x94\x1e\x3f\x9b\x68\x8e\x9a\x53\x61\x4b\x4c\x88\x13\x6e\xab\xad\xa9\x4b\xb6\x0e\x2b\x24\x61\x05\xff\xfc\xbb\x00\xd8\xa3\x14\xa9\x47\x33\xbc\xd4\x25\xa9\x97\x37\xd7\x9f\x5e\xac\x93\x9c\x0a\x0c\x83\xbc\xb0\x2e\xc9\xb8\x06\x9a\x50\xc4\x4d\xfb\x34\x63\x00\x29\xd9\xc4\x88\xd2\x5b\x84\xa7\x6c\x2a\xcc\x81\x94\x1b\x86\x2c\xb8\x9c\x60\x1f\xc6\x28\x05\xeb\x97\x01\x9d\x81\xcb\x85\x05\x43\x3e\x44\xe5\xbc\x4b\x2d\xb3\xc0\x53\x50\x81\xde\xfe\x49\x89\x5b\xc2\x9a\x61\x30\x16\x6c\xae\x2b\x99\x42\xa2\xd5\x9e\x8c\x03\x43\x89\xde\x29\xf1\xb9\xb1\x6c\xc1\x69\xbf\xa4\x44\x47\x35\xf4\x51\x7c\xf3\x28\x94\x0c\x42\x45\xcf\x00\x55\x0a\x05\x1e\xc0\x10\xaf\x01\x95\x6a\x59\xf3\x53\xec\x12\xde\x69\x43\x20\x54\xa6\x57\x90\x3b\x57\xda\xd5\xe5\xe5\x4e\xb8\x48\x18\x89\x2e\x8a\x4a\x09\x77\xb8\x4c\xb4\x72\x46\x6c\x2b\xa7\x8d\xbd\x4c\x69\x4f\xf2\xd2\x8a\xdd\x05\x9a\x24\x17\x8e\x12\x57\x19\xba\xc4\x52\x5c\x78\xc7\x95\xf3\x3d\x5f\xa4\xff\x6b\x52\xf5\xb4\xe5\x69\xaf\x29\x82\xf8\xba\x1b\xc5\x9d\x2b\x0f\x84\x05\xac\xd5\x82\xff\x47\x78\x79\x88\x51\xf9\xf0\x66\xbd\x81\xb8\xa8\x4f\x41\x17\x73\x8f\xf6\x51\xcd\x1e\x81\x67\xa0\x84\xca\xc8\x84\xc4\x65\x46\x17\xde\x22\xa9\xb4\xd4\x42\x39\xff\x90\x48\x41\xaa\x0b\xba\xad\xb6\x85\x70\x9c\xe9\xbf\x2a\xb2\x8e\xf3\xb3\x84\x2b\x54\x4a\x3b\xd8\x12\x54\x25\xf7\x6c\xba\x84\x6b\x05\x57\x58\x90\xbc\x42\x4b\x5f\x1d\x76\x46\xd8\x5e\x30\xa4\xe7\x81\x6f\xb3\x7d\x77\x62\x40\xab\x19\x8e\x7c\x1d\x65\xa8\x87\x42\x19\x7a\x06\xed\x0e\xf6\x12\x5a\xb3\x2c\x18\xca\x18\xfc\xba\xa6\x03\xb3\x5c\x69\x95\x89\x5d\x65\x7c\xcb\x80\x36\xf5\xf0\x2b\x74\x49\xde\xb3\x09\xb0\x25\x4e\x7d\x65\x29\x65\x23\x61\xe9\x90\xc1\xc0\x35\x60\x5b\x1c\x76\xde\x77\x08\x3c\xf0\xb3\x27\xd8\x93\x37\xbd\x20\x5e\xde\x5c\xfb\x89\x5c\x98\xec\xbe\xa7\x65\xc8\xb4\xf1\x4f\x4d\x15\x06\x17\x7d\xa4\xa4\x02\x89\xf5\x65\x30\x31\x51\xfa\x9d\x31\xe8\x4b\x6c\x10\x5e\x99\xad\x31\xbd\x3c\x9a\x07\x7e\x2b\x3a\xe7\x01\xb3\x74\xf4\x80\x15\x1e\xd1\x03\xee\x2d\x61\xe8\x04\x85\x0b\x68\x4e\x01\xed\xc1\x66\x47\xef\x1b\xef\x15\xf4\x58\x9d\x87\xfd\x64\x46\xa5\xfb\x7d\x7f\xb2\xce\xfd\x49\x00\x84\x4a\x05\x6f\xc6\x01\x1c\xbd\x27\x83\x52\x06\xed\xb0\x53\x50\xac\xd6\xd2\xe8\x84\xac\x3d\x81\x27\x14\x95\xb0\xdd\xcd\x77\x59\xdb\xbf\x13\x52\x32\xd9\x3c\x59\x57\x49\x42\x94\x52\xfa\x04\xb4\x92\x07\x10\x59\xb3\xca\x69\x99\x4b\x09\xb9\x66\xc6\x42\xd3\x51\x5d\xc2\x35\x6f\x4d\x87\xe8\x1a\x4f\x82\x0c\x85\xe4\x0e\x4b\x74\x51\x4a\x72\xd1\xe1\x67\x27\x66\x7b\x1e\xbd\x45\x21\xd9\xe6\x60\x3e\x06\x92\x5d\xb7\xeb\xeb\xba\xfd\x27\xc1\x5d\x77\xe7\x7a\x82\x12\xd9\x01\x9c\x76\x28\xc1\x89\x82\xc0\xe1\x2d\xa9\x8e\xdf\x49\x65\x4c\x9f\xc3\x59\xba\x74\x01\xff\xb7\x55\xc1\x00\xd4\xc3\x69\x43\x47\x99\x07\xce\xa1\xd9\x91\xb3\xdf\xcd\x0d\xab\x9e\x3f\x19\xce\x26\xcc\x39\x86\x71\x2c\x8b\x50\x92\xbc\x38\x97\xd2\x5e\xa4\x15\x36\x3e\x9c\x44\xa2\xcb\x70\x9a\xee\xbd\x10\x8e\x8a\x01\xb6\x9b\x62\xc2\x91\x0a\x1f\xf0\xbd\x5f\xe7\xb1\x9c\x8f\x25\xce\xcc\xe0\x1d\x1e\x34\x36\x49\x3f\x4c\x00\xd9\x0c\x27\x3e\x50\xd6\xdb\x50\x6a\x37\x26\x16\x9e\x0e\x1f\x46\x8f\x85\xf7\x72\x1f\x26\x58\x7c\xb6\x81\x31\x12\x9e\x69\x60\x84\x01\xa3\x70\x85\x8d\x40\xd0\xed\x39\x9e\xc7\xa7\xd4\x3b\xeb\x75\x84\x75\x22\xe9\x57\x66\xa0\x95\xc8\x59\x23\x3e\x4f\xee\xcf\x41\x46\x4a\x36\xc8\xf9\xcc\x41\xd3\xb6\xe3\x33\x7a\xe1\x35\x5c\xd2\xa2\xec\x09\x36\x99\x30\xdb\x04\xd8\x50\xb7\x47\x65\x42\x63\x46\x0d\x00\x90\x31\xfa\xe4\x68\x35\x1a\xce\x1b\x9e\xdd\x8a\xa5\x73\x78\xd6\x59\xb0\x06\x42\x41\x12\x3f\x58\xc7\xe4\x48\x85\xbc\x13\x54\x66\x6a\xf6\xac\x40\x18\x8d\xe9\x92\xee\xc5\xf2\x4b\xad\xd0\x84\xd3\x9c\x32\x9a\x4d\xca\xe5\xe8\x20\xc7\x29\x90\xf9\xc4\x48\xca\xc7\x42\x29\x54\xe5\x43\xc3\x98\x20\xc8\x81\x18\x66\xd1\x24\x87\xf2\x50\xb7\xac\xc2\xd2\xe6\x7a\xac\xa5\x07\x5c\x5b\x47\x8d\x7a\xff\x11\xf5\x69\xc5\x13\x43\xb7\xbf\x27\xe1\x6d\x56\x6e\xb2\x11\x10\x0f\xbd\xd3\x69\x06\x5f\x78\x23\xdb\x71\x5b\x66\x30\x45\x90\x49\xbe\x08\x32\x87\x35\x82\x64\x42\xd2\x7a\x9c\x15\xdb\xd2\x01\xf2\x6d\xd4\x1b\x64\x49\xb6\x6a\x87\x8e\x63\xa7\xe2\x71\x8a\x70\x9e\x9d\x3f\x3f\x30\x96\x42\xa7\x9c\xe2\x94\x9d\x9d\xa5\xd0\x0b\xf2\x5d\x5b\xbf\x0e\x34\x10\xa5\xaa\x8a\x2d\x99\x59\x16\xe1\x08\x48\xb7\x56\xa2\x77\x60\x85\x4a\x08\x24\x5a\x57\x17\xc1\x2c\xbb\x99\x36\x05\xba\x15\x08\xe5\x7e\xfc\x61\x96\x46\xe8\x29\xa1\x1c\xed\x66\xf9\xae\xe8\xee\x4b\x91\x7b\x5f\xab\x0e\x80\xc6\x70\x28\xba\x9b\x89\xdd\x10\x70\xfe\x26\xf1\x1b\xc6\xcd\x47\xfb\xa5\xc8\x6d\x1a\xe5\x61\xec\x1e\x80\xdb\x9c\xed\xa0\x65\xe1\xab\xe3\x54\xa9\x87\x36\xe8\xc7\xae\x85\xc7\x6c\xd1\x70\xb3\xc5\xd5\x96\xa3\xda\x75\xaa\x6d\xa6\xcd\x6f\xa8\x26\xcf\x1c\x8b\xdb\x72\xee\xb4\x12\x64\xe0\x4e\xa4\xf3\xf5\xdf\x3e\xb4\xcc\xc6\x21\xee\x02\x4d\x83\x77\xf6\xd1\x99\x41\x9e\x39\x32\x04\x29\xd1\xe5\xf7\x0c\xf2\x06\x5d\xde\x0b\x32\x15\x86\x12\xa7\xcd\x61\xde\x91\x2c\x48\xb7\x13\xf9\x70\x70\xbf\x1d\xf0\x3e\x51\x86\x6b\x16\xa1\x76\x1b\x71\xef\xa4\xde\x74\x94\xdb\x91\xb7\xbf\x11\x66\x04\x5c\x7b\x11\xee\xec\xfc\x27\x2a\xa4\xe8\xf0\x31\x03\xf5\x0d\xbf\x16\x9f\xef\x1b\xe3\x26\xea\xf5\x12\x6b\x79\x48\x67\xf3\xfc\xe4\xe5\xe3\xe1\x8d\xb3\x59\x87\x18\x6b\xe3\x31\xe3\xac\x4a\xa9\x31\x3d\xbd\x21\x3c\x13\xe6\xc7\x5a\xad\xfd\x89\xd4\x8a\xb0\x31\x3b\x3f\x54\x52\xad\xe6\x7c\xfc\xd2\x9d\x49\x57\x61\x1a\x1a\x83\x63\x28\x9f\x35\x34\x6d\xc2\xd7\x15\x7f\x91\xcd\xb9\x33\xd8\x34\x93\xdb\xdf\x16\xbd\x83\xcf\xac\x3b\x83\xba\x84\x3c\xa9\xc4\x2b\xc6\x23\x63\xb0\x32\x0e\xfc\x75\xd9\x97\xd6\x9e\xf2\xe2\xfb\x89\xe0\xc7\xf6\x90\x09\xec\x86\x51\x1b\x50\xe8\x0d\xed\xe3\xff\xf6\xf1\x2f\xfa\x66\xa8\xfe\x1b\x3c\xfc\x1b\x7c\x7c\x0b\xe0\xff\x38\x4d\x57\xe0\x4c\x15\x3e\xc6\xad\xd3\x06\x77\x54\x8f\xfc\x17\x00\x00\xff\xff\xc7\xaf\xca\xae\x0d\x20\x00\x00") func stashAppscodeCom_backupsessionsYamlBytes() ([]byte, error) { return bindataRead( @@ -161,7 +161,7 @@ func stashAppscodeCom_backupsessionsYaml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "stash.appscode.com_backupsessions.yaml", size: 6928, mode: os.FileMode(420), modTime: time.Unix(1573722179, 0)} + info := bindataFileInfo{name: "stash.appscode.com_backupsessions.yaml", size: 8205, mode: os.FileMode(420), modTime: time.Unix(1573722179, 0)} a := &asset{bytes: bytes, info: info} return a, nil } diff --git a/api/crds/stash.appscode.com_backupbatches.yaml b/api/crds/stash.appscode.com_backupbatches.yaml index fd4da71fa..1ea74cfd7 100644 --- a/api/crds/stash.appscode.com_backupbatches.yaml +++ b/api/crds/stash.appscode.com_backupbatches.yaml @@ -47,910 +47,974 @@ spec: type: object spec: properties: - backupConfigurationTemplates: - description: backupConfigurationTemplates is a list of backup configurations - that are part of this batch - items: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this - representation of an object. Servers should convert recognized - schemas to the latest internal value, and may reject unrecognized - values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource - this object represents. Servers may infer this from the endpoint - the client submits requests to. Cannot be updated. In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - description: ObjectMeta is metadata that all persisted resources - must have, which includes all objects users must create. - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map - stored with a resource that may be set by external tools - to store and retrieve arbitrary metadata. They are not queryable - and should be preserved when modifying objects. More info: - http://kubernetes.io/docs/user-guide/annotations' - type: object - creationTimestamp: - description: "CreationTimestamp is a timestamp representing - the server time when this object was created. It is not - guaranteed to be set in happens-before order across separate - operations. Clients may not set this value. It is represented - in RFC3339 form and is in UTC. \n Populated by the system. - Read-only. Null for lists. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" - format: date-time - type: string - generateName: - description: "GenerateName is an optional prefix, used by - the server, to generate a unique name ONLY IF the Name field - has not been provided. If this field is used, the name returned - to the client will be different than the name passed. This - value will also be combined with a unique suffix. The provided - value has the same validation rules as the Name field, and - may be truncated by the length of the suffix required to - make the value unique on the server. \n If this field is - specified and the generated name exists, the server will - NOT return a 409 - instead, it will either return 201 Created - or 500 with Reason ServerTimeout indicating a unique name - could not be found in the time allotted, and the client - should retry (optionally after the time indicated in the - Retry-After header). \n Applied only if Name is not specified. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#idempotency" - type: string - labels: - additionalProperties: + backupHistoryLimit: + description: 'BackupHistoryLimit specifies the number of BackupSession + and it''s associate resources to keep. This is helpful for debugging + purpose. Default: 1' + format: int32 + type: integer + driver: + description: Driver indicates the name of the agent to use to backup + the target. Supported values are "Restic", "VolumeSnapshotter". Default + value is "Restic". + type: string + hooks: + description: Actions that Stash should take in response to backup sessions. + Cannot be updated. + properties: + postBackup: + description: PostBackup is called immediately after a backup session + is complete. + properties: + containerName: + description: ContainerName specifies the name of the container + where to execute the commands for Exec probe or where to find + the port for HTTP or TCP probe + type: string + exec: + description: One and only one of the following should be specified. + Exec specifies the action to take. + properties: + command: + description: Command is the command line to execute inside + the container, the working directory for the command is + root ('/') in the container's filesystem. The command + is simply exec'd, it is not run inside a shell, so traditional + shell instructions ('|', etc) won't work. To use a shell, + you need to explicitly call out to that shell. Exit status + of 0 is treated as live/healthy and non-zero is unhealthy. + items: + type: string + type: array + type: object + httpGet: + description: HTTPGet specifies the http Get request to perform. + properties: + host: + description: Host name to connect to, defaults to the pod + IP. You probably want to set "Host" in httpHeaders instead. type: string - description: 'Map of string keys and values that can be used - to organize and categorize (scope and select) objects. May - match selectors of replication controllers and services. - More info: http://kubernetes.io/docs/user-guide/labels' - type: object - name: - description: 'Name must be unique within a namespace. Is required - when creating resources, although some resources may allow - a client to request the generation of an appropriate name - automatically. Name is primarily intended for creation idempotence - and configuration definition. Cannot be updated. More info: - http://kubernetes.io/docs/user-guide/identifiers#names' - type: string - namespace: - description: "Namespace defines the space within each name - must be unique. An empty namespace is equivalent to the - \"default\" namespace, but \"default\" is the canonical - representation. Not all objects are required to be scoped - to a namespace - the value of this field for those objects - will be empty. \n Must be a DNS_LABEL. Cannot be updated. - More info: http://kubernetes.io/docs/user-guide/namespaces" - type: string - ownerReferences: - description: List of objects depended by this object. If ALL - objects in the list have been deleted, this object will - be garbage collected. If this object is managed by a controller, - then an entry in this list will point to this controller, - with the controller field set to true. There cannot be more - than one managing controller. - items: - description: OwnerReference contains enough information - to let you identify an owning object. An owning object - must be in the same namespace as the dependent, or be - cluster-scoped, so there is no namespace field. - properties: - apiVersion: - description: API version of the referent. - type: string - blockOwnerDeletion: - description: If true, AND if the owner has the "foregroundDeletion" - finalizer, then the owner cannot be deleted from the - key-value store until this reference is removed. Defaults - to false. To set this field, a user needs "delete" - permission of the owner, otherwise 422 (Unprocessable - Entity) will be returned. - type: boolean - controller: - description: If true, this reference points to the managing - controller. - type: boolean - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names' - type: string - uid: - description: 'UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids' - type: string - required: - - apiVersion - - kind - - name - - uid - type: object - type: array - type: object - spec: - properties: - hooks: - description: Actions that Stash should take in response to - backup sessions. - properties: - postBackup: - description: PostBackup is called immediately after a - backup session is complete. + httpHeaders: + description: Custom headers to set in the request. HTTP + allows repeated headers. + items: + description: HTTPHeader describes a custom header to be + used in HTTP probes properties: - containerName: - description: ContainerName specifies the name of the - container where to execute the commands for Exec - probe or where to find the port for HTTP or TCP - probe + name: + description: The header field name type: string - exec: - description: One and only one of the following should - be specified. Exec specifies the action to take. - properties: - command: - description: Command is the command line to execute - inside the container, the working directory - for the command is root ('/') in the container's - filesystem. The command is simply exec'd, it - is not run inside a shell, so traditional shell - instructions ('|', etc) won't work. To use a - shell, you need to explicitly call out to that - shell. Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. - items: - type: string - type: array - type: object - httpGet: - description: HTTPGet specifies the http Get request - to perform. - properties: - host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value - type: object - type: array - path: - description: Path to access on the HTTP server. - type: string - port: - anyOf: - - type: integer - - type: string - description: Name or number of the port to access - on the container. Number must be in the range - 1 to 65535. Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. - type: string - required: - - port - type: object - httpPost: - description: HTTPPost specifies the http Post request - to perform. - properties: - body: - description: Body to set in the request. - type: string - form: - description: Form to set in the request body. - items: - properties: - key: - type: string - values: - items: - type: string - type: array - type: object - type: array - host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value - type: object - type: array - path: - description: Path to access on the HTTP server. - type: string - port: - anyOf: - - type: integer - - type: string - description: Name or number of the port to access - on the container. Number must be in the range - 1 to 65535. Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. - type: string - required: - - port - type: object - tcpSocket: - description: 'TCPSocket specifies an action involving - a TCP port. TCP hooks not yet supported TODO: implement - a realistic TCP lifecycle hook' - properties: - host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' - type: string - port: - anyOf: - - type: integer - - type: string - description: Number or name of the port to access - on the container. Number must be in the range - 1 to 65535. Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - required: - - port - type: object + value: + description: The header field value + type: string + required: + - name + - value type: object - preBackup: - description: PreBackup is called immediately before a - backup session is initiated. + type: array + path: + description: Path to access on the HTTP server. + type: string + port: + anyOf: + - type: integer + - type: string + description: Name or number of the port to access on the + container. Number must be in the range 1 to 65535. Name + must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults + to HTTP. + type: string + required: + - port + type: object + httpPost: + description: HTTPPost specifies the http Post request to perform. + properties: + body: + description: Body to set in the request. + type: string + form: + description: Form to set in the request body. + items: properties: - containerName: - description: ContainerName specifies the name of the - container where to execute the commands for Exec - probe or where to find the port for HTTP or TCP - probe + key: type: string - exec: - description: One and only one of the following should - be specified. Exec specifies the action to take. - properties: - command: - description: Command is the command line to execute - inside the container, the working directory - for the command is root ('/') in the container's - filesystem. The command is simply exec'd, it - is not run inside a shell, so traditional shell - instructions ('|', etc) won't work. To use a - shell, you need to explicitly call out to that - shell. Exit status of 0 is treated as live/healthy - and non-zero is unhealthy. - items: - type: string - type: array - type: object - httpGet: - description: HTTPGet specifies the http Get request - to perform. - properties: - host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value - type: object - type: array - path: - description: Path to access on the HTTP server. - type: string - port: - anyOf: - - type: integer - - type: string - description: Name or number of the port to access - on the container. Number must be in the range - 1 to 65535. Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. - type: string - required: - - port - type: object - httpPost: - description: HTTPPost specifies the http Post request - to perform. - properties: - body: - description: Body to set in the request. - type: string - form: - description: Form to set in the request body. - items: - properties: - key: - type: string - values: - items: - type: string - type: array - type: object - type: array - host: - description: Host name to connect to, defaults - to the pod IP. You probably want to set "Host" - in httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the request. - HTTP allows repeated headers. - items: - description: HTTPHeader describes a custom header - to be used in HTTP probes - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value - type: object - type: array - path: - description: Path to access on the HTTP server. - type: string - port: - anyOf: - - type: integer - - type: string - description: Name or number of the port to access - on the container. Number must be in the range - 1 to 65535. Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use for connecting to the - host. Defaults to HTTP. - type: string - required: - - port - type: object - tcpSocket: - description: 'TCPSocket specifies an action involving - a TCP port. TCP hooks not yet supported TODO: implement - a realistic TCP lifecycle hook' - properties: - host: - description: 'Optional: Host name to connect to, - defaults to the pod IP.' - type: string - port: - anyOf: - - type: integer - - type: string - description: Number or name of the port to access - on the container. Number must be in the range - 1 to 65535. Name must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - required: - - port - type: object + values: + items: + type: string + type: array + type: object + type: array + host: + description: Host name to connect to, defaults to the pod + IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP + allows repeated headers. + items: + description: HTTPHeader describes a custom header to be + used in HTTP probes + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + type: object + type: array + path: + description: Path to access on the HTTP server. + type: string + port: + anyOf: + - type: integer + - type: string + description: Name or number of the port to access on the + container. Number must be in the range 1 to 65535. Name + must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults + to HTTP. + type: string + required: + - port + type: object + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP + port. TCP hooks not yet supported TODO: implement a realistic + TCP lifecycle hook' + properties: + host: + description: 'Optional: Host name to connect to, defaults + to the pod IP.' + type: string + port: + anyOf: + - type: integer + - type: string + description: Number or name of the port to access on the + container. Number must be in the range 1 to 65535. Name + must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preBackup: + description: PreBackup is called immediately before a backup session + is initiated. + properties: + containerName: + description: ContainerName specifies the name of the container + where to execute the commands for Exec probe or where to find + the port for HTTP or TCP probe + type: string + exec: + description: One and only one of the following should be specified. + Exec specifies the action to take. + properties: + command: + description: Command is the command line to execute inside + the container, the working directory for the command is + root ('/') in the container's filesystem. The command + is simply exec'd, it is not run inside a shell, so traditional + shell instructions ('|', etc) won't work. To use a shell, + you need to explicitly call out to that shell. Exit status + of 0 is treated as live/healthy and non-zero is unhealthy. + items: + type: string + type: array + type: object + httpGet: + description: HTTPGet specifies the http Get request to perform. + properties: + host: + description: Host name to connect to, defaults to the pod + IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP + allows repeated headers. + items: + description: HTTPHeader describes a custom header to be + used in HTTP probes + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + type: object + type: array + path: + description: Path to access on the HTTP server. + type: string + port: + anyOf: + - type: integer + - type: string + description: Name or number of the port to access on the + container. Number must be in the range 1 to 65535. Name + must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults + to HTTP. + type: string + required: + - port + type: object + httpPost: + description: HTTPPost specifies the http Post request to perform. + properties: + body: + description: Body to set in the request. + type: string + form: + description: Form to set in the request body. + items: + properties: + key: + type: string + values: + items: + type: string + type: array + type: object + type: array + host: + description: Host name to connect to, defaults to the pod + IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP + allows repeated headers. + items: + description: HTTPHeader describes a custom header to be + used in HTTP probes + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value type: object - type: object - interimVolumeTemplate: - description: InterimVolumeTemplate specifies a template for - a volume to hold targeted data temporarily before uploading - to backend or inserting into target. It is only usable for - job model. Don't specify it in sidecar model. + type: array + path: + description: Path to access on the HTTP server. + type: string + port: + anyOf: + - type: integer + - type: string + description: Name or number of the port to access on the + container. Number must be in the range 1 to 65535. Name + must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults + to HTTP. + type: string + required: + - port + type: object + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP + port. TCP hooks not yet supported TODO: implement a realistic + TCP lifecycle hook' + properties: + host: + description: 'Optional: Host name to connect to, defaults + to the pod IP.' + type: string + port: + anyOf: + - type: integer + - type: string + description: Number or name of the port to access on the + container. Number must be in the range 1 to 65535. Name + must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + type: object + members: + description: members is a list of backup configurations that are part + of this batch + items: + properties: + hooks: + description: Actions that Stash should take in response to backup + sessions. + properties: + postBackup: + description: PostBackup is called immediately after a backup + session is complete. properties: - apiVersion: - description: 'APIVersion defines the versioned schema - of this representation of an object. Servers should - convert recognized schemas to the latest internal value, - and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + containerName: + description: ContainerName specifies the name of the container + where to execute the commands for Exec probe or where + to find the port for HTTP or TCP probe type: string - kind: - description: 'Kind is a string value representing the - REST resource this object represents. Servers may infer - this from the endpoint the client submits requests to. - Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - description: 'Standard object''s metadata. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' + exec: + description: One and only one of the following should + be specified. Exec specifies the action to take. properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value - map stored with a resource that may be set by external - tools to store and retrieve arbitrary metadata. - They are not queryable and should be preserved when - modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - creationTimestamp: - description: "CreationTimestamp is a timestamp representing - the server time when this object was created. It - is not guaranteed to be set in happens-before order - across separate operations. Clients may not set - this value. It is represented in RFC3339 form and - is in UTC. \n Populated by the system. Read-only. - Null for lists. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" - format: date-time - type: string - generateName: - description: "GenerateName is an optional prefix, - used by the server, to generate a unique name ONLY - IF the Name field has not been provided. If this - field is used, the name returned to the client will - be different than the name passed. This value will - also be combined with a unique suffix. The provided - value has the same validation rules as the Name - field, and may be truncated by the length of the - suffix required to make the value unique on the - server. \n If this field is specified and the generated - name exists, the server will NOT return a 409 - - instead, it will either return 201 Created or 500 - with Reason ServerTimeout indicating a unique name - could not be found in the time allotted, and the - client should retry (optionally after the time indicated - in the Retry-After header). \n Applied only if Name - is not specified. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#idempotency" - type: string - labels: - additionalProperties: + command: + description: Command is the command line to execute + inside the container, the working directory for + the command is root ('/') in the container's filesystem. + The command is simply exec'd, it is not run inside + a shell, so traditional shell instructions ('|', + etc) won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is treated + as live/healthy and non-zero is unhealthy. + items: type: string - description: 'Map of string keys and values that can - be used to organize and categorize (scope and select) - objects. May match selectors of replication controllers - and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - name: - description: 'Name must be unique within a namespace. - Is required when creating resources, although some - resources may allow a client to request the generation - of an appropriate name automatically. Name is primarily - intended for creation idempotence and configuration - definition. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/identifiers#names' - type: string - namespace: - description: "Namespace defines the space within each - name must be unique. An empty namespace is equivalent - to the \"default\" namespace, but \"default\" is - the canonical representation. Not all objects are - required to be scoped to a namespace - the value - of this field for those objects will be empty. \n - Must be a DNS_LABEL. Cannot be updated. More info: - http://kubernetes.io/docs/user-guide/namespaces" + type: array + type: object + httpGet: + description: HTTPGet specifies the http Get request to + perform. + properties: + host: + description: Host name to connect to, defaults to + the pod IP. You probably want to set "Host" in httpHeaders + instead. type: string - ownerReferences: - description: List of objects depended by this object. - If ALL objects in the list have been deleted, this - object will be garbage collected. If this object - is managed by a controller, then an entry in this - list will point to this controller, with the controller - field set to true. There cannot be more than one - managing controller. + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. items: - description: OwnerReference contains enough information - to let you identify an owning object. An owning - object must be in the same namespace as the dependent, - or be cluster-scoped, so there is no namespace - field. + description: HTTPHeader describes a custom header + to be used in HTTP probes properties: - apiVersion: - description: API version of the referent. - type: string - blockOwnerDeletion: - description: If true, AND if the owner has the - "foregroundDeletion" finalizer, then the owner - cannot be deleted from the key-value store - until this reference is removed. Defaults - to false. To set this field, a user needs - "delete" permission of the owner, otherwise - 422 (Unprocessable Entity) will be returned. - type: boolean - controller: - description: If true, this reference points - to the managing controller. - type: boolean - kind: - description: 'Kind of the referent. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string name: - description: 'Name of the referent. More info: - http://kubernetes.io/docs/user-guide/identifiers#names' + description: The header field name type: string - uid: - description: 'UID of the referent. More info: - http://kubernetes.io/docs/user-guide/identifiers#uids' + value: + description: The header field value type: string required: - - apiVersion - - kind - name - - uid + - value type: object type: array + path: + description: Path to access on the HTTP server. + type: string + port: + anyOf: + - type: integer + - type: string + description: Name or number of the port to access + on the container. Number must be in the range 1 + to 65535. Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. + Defaults to HTTP. + type: string + required: + - port type: object - spec: - description: 'Spec defines the desired characteristics - of a volume requested by a pod author. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + httpPost: + description: HTTPPost specifies the http Post request + to perform. properties: - accessModes: - description: 'AccessModes contains the desired access - modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' + body: + description: Body to set in the request. + type: string + form: + description: Form to set in the request body. items: - type: string - type: array - dataSource: - description: This field requires the VolumeSnapshotDataSource - alpha feature gate to be enabled and currently VolumeSnapshot - is the only supported data source. If the provisioner - can support VolumeSnapshot data source, it will - create a new volume and data will be restored to - the volume at the same time. If the provisioner - does not support VolumeSnapshot data source, volume - will not be created and the failure will be reported - as an event. In the future, we plan to support more - data source types and the behavior of the provisioner - may change. - properties: - apiGroup: - description: APIGroup is the group for the resource - being referenced. If APIGroup is not specified, - the specified Kind must be in the core API group. - For any other third-party types, APIGroup is - required. - type: string - kind: - description: Kind is the type of resource being - referenced - type: string - name: - description: Name is the name of resource being - referenced - type: string - required: - - kind - - name - type: object - resources: - description: 'Resources represents the minimum resources - the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources' - properties: - limits: - additionalProperties: + properties: + key: type: string - description: 'Limits describes the maximum amount - of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - requests: - additionalProperties: + values: + items: + type: string + type: array + type: object + type: array + host: + description: Host name to connect to, defaults to + the pod IP. You probably want to set "Host" in httpHeaders + instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + items: + description: HTTPHeader describes a custom header + to be used in HTTP probes + properties: + name: + description: The header field name type: string - description: 'Requests describes the minimum amount - of compute resources required. If Requests is - omitted for a container, it defaults to Limits - if that is explicitly specified, otherwise to - an implementation-defined value. More info: - https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - type: object - selector: - description: A label query over volumes to consider - for binding. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are - ANDed. - items: - description: A label selector requirement is - a selector that contains values, a key, and - an operator that relates the key and values. - properties: - key: - description: key is the label key that the - selector applies to. - type: string - operator: - description: operator represents a key's - relationship to a set of values. Valid - operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string - values. If the operator is In or NotIn, - the values array must be non-empty. If - the operator is Exists or DoesNotExist, - the values array must be empty. This array - is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: + value: + description: The header field value type: string - description: matchLabels is a map of {key,value} - pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, - whose key field is "key", the operator is "In", - and the values array contains only "value". - The requirements are ANDed. - type: object - type: object - storageClassName: - description: 'Name of the StorageClass required by - the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' + required: + - name + - value + type: object + type: array + path: + description: Path to access on the HTTP server. type: string - volumeMode: - description: volumeMode defines what type of volume - is required by the claim. Value of Filesystem is - implied when not included in claim spec. This is - a beta feature. + port: + anyOf: + - type: integer + - type: string + description: Name or number of the port to access + on the container. Number must be in the range 1 + to 65535. Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. + Defaults to HTTP. type: string - volumeName: - description: VolumeName is the binding reference to - the PersistentVolume backing this claim. + required: + - port + type: object + tcpSocket: + description: 'TCPSocket specifies an action involving + a TCP port. TCP hooks not yet supported TODO: implement + a realistic TCP lifecycle hook' + properties: + host: + description: 'Optional: Host name to connect to, defaults + to the pod IP.' type: string + port: + anyOf: + - type: integer + - type: string + description: Number or name of the port to access + on the container. Number must be in the range 1 + to 65535. Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + required: + - port type: object - status: - description: 'Status represents the current information/status - of a persistent volume claim. Read-only. More info: - https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + type: object + preBackup: + description: PreBackup is called immediately before a backup + session is initiated. + properties: + containerName: + description: ContainerName specifies the name of the container + where to execute the commands for Exec probe or where + to find the port for HTTP or TCP probe + type: string + exec: + description: One and only one of the following should + be specified. Exec specifies the action to take. properties: - accessModes: - description: 'AccessModes contains the actual access - modes the volume backing the PVC has. More info: - https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' + command: + description: Command is the command line to execute + inside the container, the working directory for + the command is root ('/') in the container's filesystem. + The command is simply exec'd, it is not run inside + a shell, so traditional shell instructions ('|', + etc) won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is treated + as live/healthy and non-zero is unhealthy. items: type: string type: array - capacity: - additionalProperties: - type: string - description: Represents the actual resources of the - underlying volume. - type: object - conditions: - description: Current Condition of persistent volume - claim. If underlying persistent volume is being - resized then the Condition will be set to 'ResizeStarted'. + type: object + httpGet: + description: HTTPGet specifies the http Get request to + perform. + properties: + host: + description: Host name to connect to, defaults to + the pod IP. You probably want to set "Host" in httpHeaders + instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. items: - description: PersistentVolumeClaimCondition contails - details about state of pvc + description: HTTPHeader describes a custom header + to be used in HTTP probes properties: - lastProbeTime: - description: Last time we probed the condition. - format: date-time - type: string - lastTransitionTime: - description: Last time the condition transitioned - from one status to another. - format: date-time - type: string - message: - description: Human-readable message indicating - details about last transition. - type: string - reason: - description: Unique, this should be a short, - machine understandable string that gives the - reason for condition's last transition. If - it reports "ResizeStarted" that means the - underlying persistent volume is being resized. - type: string - status: + name: + description: The header field name type: string - type: - description: PersistentVolumeClaimConditionType - is a valid value of PersistentVolumeClaimCondition.Type + value: + description: The header field value type: string required: - - status - - type + - name + - value type: object type: array - phase: - description: Phase represents the current phase of - PersistentVolumeClaim. + path: + description: Path to access on the HTTP server. type: string + port: + anyOf: + - type: integer + - type: string + description: Name or number of the port to access + on the container. Number must be in the range 1 + to 65535. Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. + Defaults to HTTP. + type: string + required: + - port type: object - type: object - runtimeSettings: - description: RuntimeSettings allow to specify Resources, NodeSelector, - Affinity, Toleration, ReadinessProbe etc. - properties: - container: + httpPost: + description: HTTPPost specifies the http Post request + to perform. properties: - env: - description: List of environment variables to set - in the container. Cannot be updated. + body: + description: Body to set in the request. + type: string + form: + description: Form to set in the request body. + items: + properties: + key: + type: string + values: + items: + type: string + type: array + type: object + type: array + host: + description: Host name to connect to, defaults to + the pod IP. You probably want to set "Host" in httpHeaders + instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. items: - description: EnvVar represents an environment variable - present in a Container. + description: HTTPHeader describes a custom header + to be used in HTTP probes properties: name: - description: Name of the environment variable. - Must be a C_IDENTIFIER. + description: The header field name type: string value: - description: 'Variable references $(VAR_NAME) - are expanded using the previous defined environment - variables in the container and any service - environment variables. If a variable cannot - be resolved, the reference in the input string - will be unchanged. The $(VAR_NAME) syntax - can be escaped with a double $$, ie: $$(VAR_NAME). - Escaped references will never be expanded, - regardless of whether the variable exists - or not. Defaults to "".' + description: The header field value type: string - valueFrom: - description: Source for the environment variable's - value. Cannot be used if value is not empty. - properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - fieldRef: - description: 'Selects a field of the pod: - supports metadata.name, metadata.namespace, - metadata.labels, metadata.annotations, - spec.nodeName, spec.serviceAccountName, - status.hostIP, status.podIP.' - properties: - apiVersion: - description: Version of the schema the - FieldPath is written in terms of, - defaults to "v1". - type: string - fieldPath: - description: Path of the field to select - in the specified API version. - type: string - required: - - fieldPath - type: object - resourceFieldRef: - description: 'Selects a resource of the - container: only resources limits and requests - (limits.cpu, limits.memory, limits.ephemeral-storage, - requests.cpu, requests.memory and requests.ephemeral-storage) - are currently supported.' - properties: - containerName: - description: 'Container name: required - for volumes, optional for env vars' - type: string - divisor: - description: Specifies the output format - of the exposed resources, defaults - to "1" - type: string - resource: - description: 'Required: resource to - select' - type: string - required: - - resource - type: object - secretKeyRef: - description: Selects a key of a secret in - the pod's namespace - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - description: 'Name of the referent. - More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - type: object required: - - name + - name + - value + type: object + type: array + path: + description: Path to access on the HTTP server. + type: string + port: + anyOf: + - type: integer + - type: string + description: Name or number of the port to access + on the container. Number must be in the range 1 + to 65535. Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. + Defaults to HTTP. + type: string + required: + - port + type: object + tcpSocket: + description: 'TCPSocket specifies an action involving + a TCP port. TCP hooks not yet supported TODO: implement + a realistic TCP lifecycle hook' + properties: + host: + description: 'Optional: Host name to connect to, defaults + to the pod IP.' + type: string + port: + anyOf: + - type: integer + - type: string + description: Number or name of the port to access + on the container. Number must be in the range 1 + to 65535. Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + type: object + interimVolumeTemplate: + description: InterimVolumeTemplate specifies a template for a + volume to hold targeted data temporarily before uploading to + backend or inserting into target. It is only usable for job + model. Don't specify it in sidecar model. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this + representation of an object. Servers should convert recognized + schemas to the latest internal value, and may reject unrecognized + values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST + resource this object represents. Servers may infer this + from the endpoint the client submits requests to. Cannot + be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' + properties: + annotations: + additionalProperties: + type: string + description: 'Annotations is an unstructured key value + map stored with a resource that may be set by external + tools to store and retrieve arbitrary metadata. They + are not queryable and should be preserved when modifying + objects. More info: http://kubernetes.io/docs/user-guide/annotations' + type: object + creationTimestamp: + description: "CreationTimestamp is a timestamp representing + the server time when this object was created. It is + not guaranteed to be set in happens-before order across + separate operations. Clients may not set this value. + It is represented in RFC3339 form and is in UTC. \n + Populated by the system. Read-only. Null for lists. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" + format: date-time + type: string + generateName: + description: "GenerateName is an optional prefix, used + by the server, to generate a unique name ONLY IF the + Name field has not been provided. If this field is used, + the name returned to the client will be different than + the name passed. This value will also be combined with + a unique suffix. The provided value has the same validation + rules as the Name field, and may be truncated by the + length of the suffix required to make the value unique + on the server. \n If this field is specified and the + generated name exists, the server will NOT return a + 409 - instead, it will either return 201 Created or + 500 with Reason ServerTimeout indicating a unique name + could not be found in the time allotted, and the client + should retry (optionally after the time indicated in + the Retry-After header). \n Applied only if Name is + not specified. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#idempotency" + type: string + labels: + additionalProperties: + type: string + description: 'Map of string keys and values that can be + used to organize and categorize (scope and select) objects. + May match selectors of replication controllers and services. + More info: http://kubernetes.io/docs/user-guide/labels' + type: object + name: + description: 'Name must be unique within a namespace. + Is required when creating resources, although some resources + may allow a client to request the generation of an appropriate + name automatically. Name is primarily intended for creation + idempotence and configuration definition. Cannot be + updated. More info: http://kubernetes.io/docs/user-guide/identifiers#names' + type: string + namespace: + description: "Namespace defines the space within each + name must be unique. An empty namespace is equivalent + to the \"default\" namespace, but \"default\" is the + canonical representation. Not all objects are required + to be scoped to a namespace - the value of this field + for those objects will be empty. \n Must be a DNS_LABEL. + Cannot be updated. More info: http://kubernetes.io/docs/user-guide/namespaces" + type: string + ownerReferences: + description: List of objects depended by this object. + If ALL objects in the list have been deleted, this object + will be garbage collected. If this object is managed + by a controller, then an entry in this list will point + to this controller, with the controller field set to + true. There cannot be more than one managing controller. + items: + description: OwnerReference contains enough information + to let you identify an owning object. An owning object + must be in the same namespace as the dependent, or + be cluster-scoped, so there is no namespace field. + properties: + apiVersion: + description: API version of the referent. + type: string + blockOwnerDeletion: + description: If true, AND if the owner has the "foregroundDeletion" + finalizer, then the owner cannot be deleted from + the key-value store until this reference is removed. + Defaults to false. To set this field, a user needs + "delete" permission of the owner, otherwise 422 + (Unprocessable Entity) will be returned. + type: boolean + controller: + description: If true, this reference points to the + managing controller. + type: boolean + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names' + type: string + uid: + description: 'UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids' + type: string + required: + - apiVersion + - kind + - name + - uid + type: object + type: array + type: object + spec: + description: 'Spec defines the desired characteristics of + a volume requested by a pod author. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + properties: + accessModes: + description: 'AccessModes contains the desired access + modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' + items: + type: string + type: array + dataSource: + description: This field requires the VolumeSnapshotDataSource + alpha feature gate to be enabled and currently VolumeSnapshot + is the only supported data source. If the provisioner + can support VolumeSnapshot data source, it will create + a new volume and data will be restored to the volume + at the same time. If the provisioner does not support + VolumeSnapshot data source, volume will not be created + and the failure will be reported as an event. In the + future, we plan to support more data source types and + the behavior of the provisioner may change. + properties: + apiGroup: + description: APIGroup is the group for the resource + being referenced. If APIGroup is not specified, + the specified Kind must be in the core API group. + For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource being referenced + type: string + name: + description: Name is the name of resource being referenced + type: string + required: + - kind + - name + type: object + resources: + description: 'Resources represents the minimum resources + the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources' + properties: + limits: + additionalProperties: + type: string + description: 'Limits describes the maximum amount + of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + requests: + additionalProperties: + type: string + description: 'Requests describes the minimum amount + of compute resources required. If Requests is omitted + for a container, it defaults to Limits if that is + explicitly specified, otherwise to an implementation-defined + value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + type: object + selector: + description: A label query over volumes to consider for + binding. + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: A label selector requirement is a selector + that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: operator represents a key's relationship + to a set of values. Valid operators are In, + NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. + If the operator is In or NotIn, the values + array must be non-empty. If the operator is + Exists or DoesNotExist, the values array must + be empty. This array is replaced during a + strategic merge patch. + items: + type: string + type: array + required: + - key + - operator type: object type: array - envFrom: - description: List of sources to populate environment - variables in the container. The keys defined within - a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container - is starting. When a key exists in multiple sources, - the value associated with the last source will take - precedence. Values defined by an Env with a duplicate - key will take precedence. Cannot be updated. - items: - description: EnvFromSource represents the source - of a set of ConfigMaps + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} pairs. + A single {key,value} in the matchLabels map is equivalent + to an element of matchExpressions, whose key field + is "key", the operator is "In", and the values array + contains only "value". The requirements are ANDed. + type: object + type: object + storageClassName: + description: 'Name of the StorageClass required by the + claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' + type: string + volumeMode: + description: volumeMode defines what type of volume is + required by the claim. Value of Filesystem is implied + when not included in claim spec. This is a beta feature. + type: string + volumeName: + description: VolumeName is the binding reference to the + PersistentVolume backing this claim. + type: string + type: object + status: + description: 'Status represents the current information/status + of a persistent volume claim. Read-only. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + properties: + accessModes: + description: 'AccessModes contains the actual access modes + the volume backing the PVC has. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' + items: + type: string + type: array + capacity: + additionalProperties: + type: string + description: Represents the actual resources of the underlying + volume. + type: object + conditions: + description: Current Condition of persistent volume claim. + If underlying persistent volume is being resized then + the Condition will be set to 'ResizeStarted'. + items: + description: PersistentVolumeClaimCondition contails + details about state of pvc + properties: + lastProbeTime: + description: Last time we probed the condition. + format: date-time + type: string + lastTransitionTime: + description: Last time the condition transitioned + from one status to another. + format: date-time + type: string + message: + description: Human-readable message indicating details + about last transition. + type: string + reason: + description: Unique, this should be a short, machine + understandable string that gives the reason for + condition's last transition. If it reports "ResizeStarted" + that means the underlying persistent volume is + being resized. + type: string + status: + type: string + type: + description: PersistentVolumeClaimConditionType + is a valid value of PersistentVolumeClaimCondition.Type + type: string + required: + - status + - type + type: object + type: array + phase: + description: Phase represents the current phase of PersistentVolumeClaim. + type: string + type: object + type: object + runtimeSettings: + description: RuntimeSettings allow to specify Resources, NodeSelector, + Affinity, Toleration, ReadinessProbe etc. + properties: + container: + properties: + env: + description: List of environment variables to set in the + container. Cannot be updated. + items: + description: EnvVar represents an environment variable + present in a Container. + properties: + name: + description: Name of the environment variable. Must + be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) are + expanded using the previous defined environment + variables in the container and any service environment + variables. If a variable cannot be resolved, the + reference in the input string will be unchanged. + The $(VAR_NAME) syntax can be escaped with a double + $$, ie: $$(VAR_NAME). Escaped references will + never be expanded, regardless of whether the variable + exists or not. Defaults to "".' + type: string + valueFrom: + description: Source for the environment variable's + value. Cannot be used if value is not empty. properties: - configMapRef: - description: The ConfigMap to select from + configMapKeyRef: + description: Selects a key of a ConfigMap. properties: + key: + description: The key to select. + type: string name: description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names @@ -959,16 +1023,58 @@ spec: type: string optional: description: Specify whether the ConfigMap - must be defined + or its key must be defined type: boolean + required: + - key type: object - prefix: - description: An optional identifier to prepend - to each key in the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select from + fieldRef: + description: 'Selects a field of the pod: supports + metadata.name, metadata.namespace, metadata.labels, + metadata.annotations, spec.nodeName, spec.serviceAccountName, + status.hostIP, status.podIP.' + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select + in the specified API version. + type: string + required: + - fieldPath + type: object + resourceFieldRef: + description: 'Selects a resource of the container: + only resources limits and requests (limits.cpu, + limits.memory, limits.ephemeral-storage, requests.cpu, + requests.memory and requests.ephemeral-storage) + are currently supported.' properties: + containerName: + description: 'Container name: required for + volumes, optional for env vars' + type: string + divisor: + description: Specifies the output format + of the exposed resources, defaults to + "1" + type: string + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + secretKeyRef: + description: Selects a key of a secret in the + pod's namespace + properties: + key: + description: The key of the secret to select + from. Must be a valid secret key. + type: string name: description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names @@ -977,239 +1083,86 @@ spec: type: string optional: description: Specify whether the Secret - must be defined + or its key must be defined type: boolean + required: + - key type: object type: object - type: array - ionice: - description: 'Settings to configure `ionice` to throttle - the load on disk. More info: http://kennystechtalk.blogspot.com/2015/04/throttling-cpu-usage-with-linux-cgroups.html - More info: https://oakbytes.wordpress.com/2012/06/06/linux-scheduler-cfs-and-nice/' - properties: - class: - format: int32 - type: integer - classData: - format: int32 - type: integer - type: object - lifecycle: - description: Actions that the management system should - take in response to container lifecycle events. - Cannot be updated. - properties: - postStart: - description: 'PostStart is called immediately - after a container is created. If the handler - fails, the container is terminated and restarted - according to its restart policy. Other management - of the container blocks until the hook completes. - More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - properties: - exec: - description: One and only one of the following - should be specified. Exec specifies the - action to take. - properties: - command: - description: Command is the command line - to execute inside the container, the - working directory for the command is - root ('/') in the container's filesystem. - The command is simply exec'd, it is - not run inside a shell, so traditional - shell instructions ('|', etc) won't - work. To use a shell, you need to explicitly - call out to that shell. Exit status - of 0 is treated as live/healthy and - non-zero is unhealthy. - items: - type: string - type: array - type: object - httpGet: - description: HTTPGet specifies the http request - to perform. - properties: - host: - description: Host name to connect to, - defaults to the pod IP. You probably - want to set "Host" in httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in - the request. HTTP allows repeated headers. - items: - description: HTTPHeader describes a - custom header to be used in HTTP probes - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value - type: object - type: array - path: - description: Path to access on the HTTP - server. - type: string - port: - anyOf: - - type: integer - - type: string - description: Name or number of the port - to access on the container. Number must - be in the range 1 to 65535. Name must - be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. - type: string - required: - - port - type: object - tcpSocket: - description: 'TCPSocket specifies an action - involving a TCP port. TCP hooks not yet - supported TODO: implement a realistic TCP - lifecycle hook' - properties: - host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' - type: string - port: - anyOf: - - type: integer - - type: string - description: Number or name of the port - to access on the container. Number must - be in the range 1 to 65535. Name must - be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - required: - - port - type: object - type: object - preStop: - description: 'PreStop is called immediately before - a container is terminated due to an API request - or management event such as liveness/startup - probe failure, preemption, resource contention, - etc. The handler is not called if the container - crashes or exits. The reason for termination - is passed to the handler. The Pod''s termination - grace period countdown begins before the PreStop - hooked is executed. Regardless of the outcome - of the handler, the container will eventually - terminate within the Pod''s termination grace - period. Other management of the container blocks - until the hook completes or until the termination - grace period is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' - properties: - exec: - description: One and only one of the following - should be specified. Exec specifies the - action to take. - properties: - command: - description: Command is the command line - to execute inside the container, the - working directory for the command is - root ('/') in the container's filesystem. - The command is simply exec'd, it is - not run inside a shell, so traditional - shell instructions ('|', etc) won't - work. To use a shell, you need to explicitly - call out to that shell. Exit status - of 0 is treated as live/healthy and - non-zero is unhealthy. - items: - type: string - type: array - type: object - httpGet: - description: HTTPGet specifies the http request - to perform. - properties: - host: - description: Host name to connect to, - defaults to the pod IP. You probably - want to set "Host" in httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in - the request. HTTP allows repeated headers. - items: - description: HTTPHeader describes a - custom header to be used in HTTP probes - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value - type: object - type: array - path: - description: Path to access on the HTTP - server. - type: string - port: - anyOf: - - type: integer - - type: string - description: Name or number of the port - to access on the container. Number must - be in the range 1 to 65535. Name must - be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use for connecting - to the host. Defaults to HTTP. - type: string - required: - - port - type: object - tcpSocket: - description: 'TCPSocket specifies an action - involving a TCP port. TCP hooks not yet - supported TODO: implement a realistic TCP - lifecycle hook' - properties: - host: - description: 'Optional: Host name to connect - to, defaults to the pod IP.' - type: string - port: - anyOf: - - type: integer - - type: string - description: Number or name of the port - to access on the container. Number must - be in the range 1 to 65535. Name must - be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - required: - - port - type: object - type: object - type: object - livenessProbe: - description: 'Periodic probe of container liveness. - Container will be restarted if the probe fails. - Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + required: + - name + type: object + type: array + envFrom: + description: List of sources to populate environment variables + in the container. The keys defined within a source must + be a C_IDENTIFIER. All invalid keys will be reported + as an event when the container is starting. When a key + exists in multiple sources, the value associated with + the last source will take precedence. Values defined + by an Env with a duplicate key will take precedence. + Cannot be updated. + items: + description: EnvFromSource represents the source of + a set of ConfigMaps + properties: + configMapRef: + description: The ConfigMap to select from + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap must + be defined + type: boolean + type: object + prefix: + description: An optional identifier to prepend to + each key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: The Secret to select from + properties: + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, + kind, uid?' + type: string + optional: + description: Specify whether the Secret must + be defined + type: boolean + type: object + type: object + type: array + ionice: + description: 'Settings to configure `ionice` to throttle + the load on disk. More info: http://kennystechtalk.blogspot.com/2015/04/throttling-cpu-usage-with-linux-cgroups.html + More info: https://oakbytes.wordpress.com/2012/06/06/linux-scheduler-cfs-and-nice/' + properties: + class: + format: int32 + type: integer + classData: + format: int32 + type: integer + type: object + lifecycle: + description: Actions that the management system should + take in response to container lifecycle events. Cannot + be updated. + properties: + postStart: + description: 'PostStart is called immediately after + a container is created. If the handler fails, the + container is terminated and restarted according + to its restart policy. Other management of the container + blocks until the hook completes. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' properties: exec: description: One and only one of the following @@ -1231,12 +1184,6 @@ spec: type: string type: array type: object - failureThreshold: - description: Minimum consecutive failures for - the probe to be considered failed after having - succeeded. Defaults to 3. Minimum value is 1. - format: int32 - type: integer httpGet: description: HTTPGet specifies the http request to perform. @@ -1283,25 +1230,6 @@ spec: required: - port type: object - initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - format: int32 - type: integer - periodSeconds: - description: How often (in seconds) to perform - the probe. Default to 10 seconds. Minimum value - is 1. - format: int32 - type: integer - successThreshold: - description: Minimum consecutive successes for - the probe to be considered successful after - having failed. Defaults to 1. Must be 1 for - liveness and startup. Minimum value is 1. - format: int32 - type: integer tcpSocket: description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: @@ -1323,27 +1251,21 @@ spec: required: - port type: object - timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - format: int32 - type: integer - type: object - nice: - description: 'Settings to configure `nice` to throttle - the load on cpu. More info: http://kennystechtalk.blogspot.com/2015/04/throttling-cpu-usage-with-linux-cgroups.html - More info: https://oakbytes.wordpress.com/2012/06/06/linux-scheduler-cfs-and-nice/' - properties: - adjustment: - format: int32 - type: integer type: object - readinessProbe: - description: 'Periodic probe of container service - readiness. Container will be removed from service - endpoints if the probe fails. Cannot be updated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + preStop: + description: 'PreStop is called immediately before + a container is terminated due to an API request + or management event such as liveness/startup probe + failure, preemption, resource contention, etc. The + handler is not called if the container crashes or + exits. The reason for termination is passed to the + handler. The Pod''s termination grace period countdown + begins before the PreStop hooked is executed. Regardless + of the outcome of the handler, the container will + eventually terminate within the Pod''s termination + grace period. Other management of the container + blocks until the hook completes or until the termination + grace period is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' properties: exec: description: One and only one of the following @@ -1365,12 +1287,6 @@ spec: type: string type: array type: object - failureThreshold: - description: Minimum consecutive failures for - the probe to be considered failed after having - succeeded. Defaults to 3. Minimum value is 1. - format: int32 - type: integer httpGet: description: HTTPGet specifies the http request to perform. @@ -1417,25 +1333,6 @@ spec: required: - port type: object - initialDelaySeconds: - description: 'Number of seconds after the container - has started before liveness probes are initiated. - More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - format: int32 - type: integer - periodSeconds: - description: How often (in seconds) to perform - the probe. Default to 10 seconds. Minimum value - is 1. - format: int32 - type: integer - successThreshold: - description: Minimum consecutive successes for - the probe to be considered successful after - having failed. Defaults to 1. Must be 1 for - liveness and startup. Minimum value is 1. - format: int32 - type: integer tcpSocket: description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: @@ -1457,586 +1354,674 @@ spec: required: - port type: object - timeoutSeconds: - description: 'Number of seconds after which the - probe times out. Defaults to 1 second. Minimum - value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' - format: int32 - type: integer type: object - resources: - description: 'Compute Resources required by container. - Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + livenessProbe: + description: 'Periodic probe of container liveness. Container + will be restarted if the probe fails. Cannot be updated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + properties: + exec: + description: One and only one of the following should + be specified. Exec specifies the action to take. + properties: + command: + description: Command is the command line to execute + inside the container, the working directory + for the command is root ('/') in the container's + filesystem. The command is simply exec'd, it + is not run inside a shell, so traditional shell + instructions ('|', etc) won't work. To use a + shell, you need to explicitly call out to that + shell. Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. + items: + type: string + type: array + type: object + failureThreshold: + description: Minimum consecutive failures for the + probe to be considered failed after having succeeded. + Defaults to 3. Minimum value is 1. + format: int32 + type: integer + httpGet: + description: HTTPGet specifies the http request to + perform. + properties: + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set "Host" + in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + items: + description: HTTPHeader describes a custom header + to be used in HTTP probes + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + type: object + type: array + path: + description: Path to access on the HTTP server. + type: string + port: + anyOf: + - type: integer + - type: string + description: Name or number of the port to access + on the container. Number must be in the range + 1 to 65535. Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the + host. Defaults to HTTP. + type: string + required: + - port + type: object + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + format: int32 + type: integer + periodSeconds: + description: How often (in seconds) to perform the + probe. Default to 10 seconds. Minimum value is 1. + format: int32 + type: integer + successThreshold: + description: Minimum consecutive successes for the + probe to be considered successful after having failed. + Defaults to 1. Must be 1 for liveness and startup. + Minimum value is 1. + format: int32 + type: integer + tcpSocket: + description: 'TCPSocket specifies an action involving + a TCP port. TCP hooks not yet supported TODO: implement + a realistic TCP lifecycle hook' + properties: + host: + description: 'Optional: Host name to connect to, + defaults to the pod IP.' + type: string + port: + anyOf: + - type: integer + - type: string + description: Number or name of the port to access + on the container. Number must be in the range + 1 to 65535. Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + required: + - port + type: object + timeoutSeconds: + description: 'Number of seconds after which the probe + times out. Defaults to 1 second. Minimum value is + 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + format: int32 + type: integer + type: object + nice: + description: 'Settings to configure `nice` to throttle + the load on cpu. More info: http://kennystechtalk.blogspot.com/2015/04/throttling-cpu-usage-with-linux-cgroups.html + More info: https://oakbytes.wordpress.com/2012/06/06/linux-scheduler-cfs-and-nice/' + properties: + adjustment: + format: int32 + type: integer + type: object + readinessProbe: + description: 'Periodic probe of container service readiness. + Container will be removed from service endpoints if + the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + properties: + exec: + description: One and only one of the following should + be specified. Exec specifies the action to take. properties: - limits: - additionalProperties: - type: string - description: 'Limits describes the maximum amount - of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object - requests: - additionalProperties: + command: + description: Command is the command line to execute + inside the container, the working directory + for the command is root ('/') in the container's + filesystem. The command is simply exec'd, it + is not run inside a shell, so traditional shell + instructions ('|', etc) won't work. To use a + shell, you need to explicitly call out to that + shell. Exit status of 0 is treated as live/healthy + and non-zero is unhealthy. + items: type: string - description: 'Requests describes the minimum amount - of compute resources required. If Requests is - omitted for a container, it defaults to Limits - if that is explicitly specified, otherwise to - an implementation-defined value. More info: - https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' - type: object + type: array type: object - securityContext: - description: 'Security options the pod should run - with. More info: https://kubernetes.io/docs/concepts/policy/security-context/ - More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/' + failureThreshold: + description: Minimum consecutive failures for the + probe to be considered failed after having succeeded. + Defaults to 3. Minimum value is 1. + format: int32 + type: integer + httpGet: + description: HTTPGet specifies the http request to + perform. properties: - allowPrivilegeEscalation: - description: 'AllowPrivilegeEscalation controls - whether a process can gain more privileges than - its parent process. This bool directly controls - if the no_new_privs flag will be set on the - container process. AllowPrivilegeEscalation - is true always when the container is: 1) run - as Privileged 2) has CAP_SYS_ADMIN' - type: boolean - capabilities: - description: The capabilities to add/drop when - running containers. Defaults to the default - set of capabilities granted by the container - runtime. - properties: - add: - description: Added capabilities - items: - description: Capability represent POSIX - capabilities type + host: + description: Host name to connect to, defaults + to the pod IP. You probably want to set "Host" + in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + items: + description: HTTPHeader describes a custom header + to be used in HTTP probes + properties: + name: + description: The header field name type: string - type: array - drop: - description: Removed capabilities - items: - description: Capability represent POSIX - capabilities type + value: + description: The header field value type: string - type: array - type: object - privileged: - description: Run container in privileged mode. - Processes in privileged containers are essentially - equivalent to root on the host. Defaults to - false. - type: boolean - procMount: - description: procMount denotes the type of proc - mount to use for the containers. The default - is DefaultProcMount which uses the container - runtime defaults for readonly paths and masked - paths. This requires the ProcMountType feature - flag to be enabled. + required: + - name + - value + type: object + type: array + path: + description: Path to access on the HTTP server. type: string - readOnlyRootFilesystem: - description: Whether this container has a read-only - root filesystem. Default is false. - type: boolean - runAsGroup: - description: The GID to run the entrypoint of - the container process. Uses runtime default - if unset. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence. - format: int64 - type: integer - runAsNonRoot: - description: Indicates that the container must - run as a non-root user. If true, the Kubelet - will validate the image at runtime to ensure - that it does not run as UID 0 (root) and fail - to start the container if it does. If unset - or false, no such validation will be performed. - May also be set in PodSecurityContext. If set - in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence. - type: boolean - runAsUser: - description: The UID to run the entrypoint of - the container process. Defaults to user specified - in image metadata if unspecified. May also be - set in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified - in SecurityContext takes precedence. - format: int64 - type: integer - seLinuxOptions: - description: The SELinux context to be applied - to the container. If unspecified, the container - runtime will allocate a random SELinux context - for each container. May also be set in PodSecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence. - properties: - level: - description: Level is SELinux level label - that applies to the container. - type: string - role: - description: Role is a SELinux role label - that applies to the container. - type: string - type: - description: Type is a SELinux type label - that applies to the container. - type: string - user: - description: User is a SELinux user label - that applies to the container. - type: string - type: object - windowsOptions: - description: The Windows specific settings applied - to all containers. If unspecified, the options - from the PodSecurityContext will be used. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence. - properties: - gmsaCredentialSpec: - description: GMSACredentialSpec is where the - GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential - spec named by the GMSACredentialSpecName - field. This field is alpha-level and is - only honored by servers that enable the - WindowsGMSA feature flag. - type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName is the - name of the GMSA credential spec to use. - This field is alpha-level and is only honored - by servers that enable the WindowsGMSA feature - flag. - type: string - runAsUserName: - description: The UserName in Windows to run - the entrypoint of the container process. - Defaults to the user specified in image - metadata if unspecified. May also be set - in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified - in SecurityContext takes precedence. This - field is alpha-level and it is only honored - by servers that enable the WindowsRunAsUserName - feature flag. - type: string - type: object + port: + anyOf: + - type: integer + - type: string + description: Name or number of the port to access + on the container. Number must be in the range + 1 to 65535. Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the + host. Defaults to HTTP. + type: string + required: + - port + type: object + initialDelaySeconds: + description: 'Number of seconds after the container + has started before liveness probes are initiated. + More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + format: int32 + type: integer + periodSeconds: + description: How often (in seconds) to perform the + probe. Default to 10 seconds. Minimum value is 1. + format: int32 + type: integer + successThreshold: + description: Minimum consecutive successes for the + probe to be considered successful after having failed. + Defaults to 1. Must be 1 for liveness and startup. + Minimum value is 1. + format: int32 + type: integer + tcpSocket: + description: 'TCPSocket specifies an action involving + a TCP port. TCP hooks not yet supported TODO: implement + a realistic TCP lifecycle hook' + properties: + host: + description: 'Optional: Host name to connect to, + defaults to the pod IP.' + type: string + port: + anyOf: + - type: integer + - type: string + description: Number or name of the port to access + on the container. Number must be in the range + 1 to 65535. Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + required: + - port + type: object + timeoutSeconds: + description: 'Number of seconds after which the probe + times out. Defaults to 1 second. Minimum value is + 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + format: int32 + type: integer + type: object + resources: + description: 'Compute Resources required by container. + Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + properties: + limits: + additionalProperties: + type: string + description: 'Limits describes the maximum amount + of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + requests: + additionalProperties: + type: string + description: 'Requests describes the minimum amount + of compute resources required. If Requests is omitted + for a container, it defaults to Limits if that is + explicitly specified, otherwise to an implementation-defined + value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' type: object type: object - pod: + securityContext: + description: 'Security options the pod should run with. + More info: https://kubernetes.io/docs/concepts/policy/security-context/ + More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/' properties: - affinity: - description: If specified, the pod's scheduling constraints + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls whether + a process can gain more privileges than its parent + process. This bool directly controls if the no_new_privs + flag will be set on the container process. AllowPrivilegeEscalation + is true always when the container is: 1) run as + Privileged 2) has CAP_SYS_ADMIN' + type: boolean + capabilities: + description: The capabilities to add/drop when running + containers. Defaults to the default set of capabilities + granted by the container runtime. properties: - nodeAffinity: - description: Describes node affinity scheduling - rules for the pod. - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to - schedule pods to nodes that satisfy the - affinity expressions specified by this field, - but it may choose a node that violates one - or more of the expressions. The node that - is most preferred is the one with the greatest - sum of weights, i.e. for each node that - meets all of the scheduling requirements - (resource request, requiredDuringScheduling - affinity expressions, etc.), compute a sum - by iterating through the elements of this - field and adding "weight" to the sum if - the node matches the corresponding matchExpressions; - the node(s) with the highest sum are the - most preferred. - items: - description: An empty preferred scheduling - term matches all objects with implicit - weight 0 (i.e. it's a no-op). A null preferred - scheduling term matches no objects (i.e. - is also a no-op). - properties: - preference: - description: A node selector term, associated - with the corresponding weight. - properties: - matchExpressions: - description: A list of node selector - requirements by node's labels. - items: - description: A node selector requirement - is a selector that contains - values, a key, and an operator - that relates the key and values. - properties: - key: - description: The label key - that the selector applies - to. - type: string - operator: - description: Represents a - key's relationship to a - set of values. Valid operators - are In, NotIn, Exists, DoesNotExist. - Gt, and Lt. - type: string - values: - description: An array of string - values. If the operator - is In or NotIn, the values - array must be non-empty. - If the operator is Exists - or DoesNotExist, the values - array must be empty. If - the operator is Gt or Lt, - the values array must have - a single element, which - will be interpreted as an - integer. This array is replaced - during a strategic merge - patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchFields: - description: A list of node selector - requirements by node's fields. - items: - description: A node selector requirement - is a selector that contains - values, a key, and an operator - that relates the key and values. - properties: - key: - description: The label key - that the selector applies - to. - type: string - operator: - description: Represents a - key's relationship to a - set of values. Valid operators - are In, NotIn, Exists, DoesNotExist. - Gt, and Lt. - type: string - values: - description: An array of string - values. If the operator - is In or NotIn, the values - array must be non-empty. - If the operator is Exists - or DoesNotExist, the values - array must be empty. If - the operator is Gt or Lt, - the values array must have - a single element, which - will be interpreted as an - integer. This array is replaced - during a strategic merge - patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - type: object - weight: - description: Weight associated with - matching the corresponding nodeSelectorTerm, - in the range 1-100. - format: int32 - type: integer - required: - - preference - - weight - type: object - type: array - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements - specified by this field are not met at scheduling - time, the pod will not be scheduled onto - the node. If the affinity requirements specified - by this field cease to be met at some point - during pod execution (e.g. due to an update), - the system may or may not try to eventually - evict the pod from its node. - properties: - nodeSelectorTerms: - description: Required. A list of node - selector terms. The terms are ORed. - items: - description: A null or empty node selector - term matches no objects. The requirements - of them are ANDed. The TopologySelectorTerm - type implements a subset of the NodeSelectorTerm. - properties: - matchExpressions: - description: A list of node selector - requirements by node's labels. - items: - description: A node selector requirement - is a selector that contains - values, a key, and an operator - that relates the key and values. - properties: - key: - description: The label key - that the selector applies - to. - type: string - operator: - description: Represents a - key's relationship to a - set of values. Valid operators - are In, NotIn, Exists, DoesNotExist. - Gt, and Lt. - type: string - values: - description: An array of string - values. If the operator - is In or NotIn, the values - array must be non-empty. - If the operator is Exists - or DoesNotExist, the values - array must be empty. If - the operator is Gt or Lt, - the values array must have - a single element, which - will be interpreted as an - integer. This array is replaced - during a strategic merge - patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchFields: - description: A list of node selector - requirements by node's fields. - items: - description: A node selector requirement - is a selector that contains - values, a key, and an operator - that relates the key and values. - properties: - key: - description: The label key - that the selector applies - to. - type: string - operator: - description: Represents a - key's relationship to a - set of values. Valid operators - are In, NotIn, Exists, DoesNotExist. - Gt, and Lt. - type: string - values: - description: An array of string - values. If the operator - is In or NotIn, the values - array must be non-empty. - If the operator is Exists - or DoesNotExist, the values - array must be empty. If - the operator is Gt or Lt, - the values array must have - a single element, which - will be interpreted as an - integer. This array is replaced - during a strategic merge - patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - type: object - type: array - required: - - nodeSelectorTerms - type: object - type: object - podAffinity: - description: Describes pod affinity scheduling - rules (e.g. co-locate this pod in the same node, - zone, etc. as some other pod(s)). + add: + description: Added capabilities + items: + description: Capability represent POSIX capabilities + type + type: string + type: array + drop: + description: Removed capabilities + items: + description: Capability represent POSIX capabilities + type + type: string + type: array + type: object + privileged: + description: Run container in privileged mode. Processes + in privileged containers are essentially equivalent + to root on the host. Defaults to false. + type: boolean + procMount: + description: procMount denotes the type of proc mount + to use for the containers. The default is DefaultProcMount + which uses the container runtime defaults for readonly + paths and masked paths. This requires the ProcMountType + feature flag to be enabled. + type: string + readOnlyRootFilesystem: + description: Whether this container has a read-only + root filesystem. Default is false. + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the + container process. Uses runtime default if unset. + May also be set in PodSecurityContext. If set in + both SecurityContext and PodSecurityContext, the + value specified in SecurityContext takes precedence. + format: int64 + type: integer + runAsNonRoot: + description: Indicates that the container must run + as a non-root user. If true, the Kubelet will validate + the image at runtime to ensure that it does not + run as UID 0 (root) and fail to start the container + if it does. If unset or false, no such validation + will be performed. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the + container process. Defaults to user specified in + image metadata if unspecified. May also be set in + PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence. + format: int64 + type: integer + seLinuxOptions: + description: The SELinux context to be applied to + the container. If unspecified, the container runtime + will allocate a random SELinux context for each + container. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + properties: + level: + description: Level is SELinux level label that + applies to the container. + type: string + role: + description: Role is a SELinux role label that + applies to the container. + type: string + type: + description: Type is a SELinux type label that + applies to the container. + type: string + user: + description: User is a SELinux user label that + applies to the container. + type: string + type: object + windowsOptions: + description: The Windows specific settings applied + to all containers. If unspecified, the options from + the PodSecurityContext will be used. If set in both + SecurityContext and PodSecurityContext, the value + specified in SecurityContext takes precedence. + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA + admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential + spec named by the GMSACredentialSpecName field. + This field is alpha-level and is only honored + by servers that enable the WindowsGMSA feature + flag. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name + of the GMSA credential spec to use. This field + is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + type: string + runAsUserName: + description: The UserName in Windows to run the + entrypoint of the container process. Defaults + to the user specified in image metadata if unspecified. + May also be set in PodSecurityContext. If set + in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes + precedence. This field is alpha-level and it + is only honored by servers that enable the WindowsRunAsUserName + feature flag. + type: string + type: object + type: object + type: object + pod: + properties: + affinity: + description: If specified, the pod's scheduling constraints + properties: + nodeAffinity: + description: Describes node affinity scheduling rules + for the pod. + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule + pods to nodes that satisfy the affinity expressions + specified by this field, but it may choose a + node that violates one or more of the expressions. + The node that is most preferred is the one with + the greatest sum of weights, i.e. for each node + that meets all of the scheduling requirements + (resource request, requiredDuringScheduling + affinity expressions, etc.), compute a sum by + iterating through the elements of this field + and adding "weight" to the sum if the node matches + the corresponding matchExpressions; the node(s) + with the highest sum are the most preferred. + items: + description: An empty preferred scheduling term + matches all objects with implicit weight 0 + (i.e. it's a no-op). A null preferred scheduling + term matches no objects (i.e. is also a no-op). + properties: + preference: + description: A node selector term, associated + with the corresponding weight. + properties: + matchExpressions: + description: A list of node selector + requirements by node's labels. + items: + description: A node selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + properties: + key: + description: The label key that + the selector applies to. + type: string + operator: + description: Represents a key's + relationship to a set of values. + Valid operators are In, NotIn, + Exists, DoesNotExist. Gt, and + Lt. + type: string + values: + description: An array of string + values. If the operator is In + or NotIn, the values array must + be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. + If the operator is Gt or Lt, + the values array must have a + single element, which will be + interpreted as an integer. This + array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + description: A list of node selector + requirements by node's fields. + items: + description: A node selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + properties: + key: + description: The label key that + the selector applies to. + type: string + operator: + description: Represents a key's + relationship to a set of values. + Valid operators are In, NotIn, + Exists, DoesNotExist. Gt, and + Lt. + type: string + values: + description: An array of string + values. If the operator is In + or NotIn, the values array must + be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. + If the operator is Gt or Lt, + the values array must have a + single element, which will be + interpreted as an integer. This + array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + weight: + description: Weight associated with matching + the corresponding nodeSelectorTerm, in + the range 1-100. + format: int32 + type: integer + required: + - preference + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified + by this field are not met at scheduling time, + the pod will not be scheduled onto the node. + If the affinity requirements specified by this + field cease to be met at some point during pod + execution (e.g. due to an update), the system + may or may not try to eventually evict the pod + from its node. properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to - schedule pods to nodes that satisfy the - affinity expressions specified by this field, - but it may choose a node that violates one - or more of the expressions. The node that - is most preferred is the one with the greatest - sum of weights, i.e. for each node that - meets all of the scheduling requirements - (resource request, requiredDuringScheduling - affinity expressions, etc.), compute a sum - by iterating through the elements of this - field and adding "weight" to the sum if - the node has pods which matches the corresponding - podAffinityTerm; the node(s) with the highest - sum are the most preferred. + nodeSelectorTerms: + description: Required. A list of node selector + terms. The terms are ORed. items: - description: The weights of all of the matched - WeightedPodAffinityTerm fields are added - per-node to find the most preferred node(s) + description: A null or empty node selector + term matches no objects. The requirements + of them are ANDed. The TopologySelectorTerm + type implements a subset of the NodeSelectorTerm. properties: - podAffinityTerm: - description: Required. A pod affinity - term, associated with the corresponding - weight. - properties: - labelSelector: - description: A label query over - a set of resources, in this case - pods. - properties: - matchExpressions: - description: matchExpressions - is a list of label selector - requirements. The requirements - are ANDed. - items: - description: A label selector - requirement is a selector - that contains values, a - key, and an operator that - relates the key and values. - properties: - key: - description: key is the - label key that the selector - applies to. - type: string - operator: - description: operator - represents a key's relationship - to a set of values. - Valid operators are - In, NotIn, Exists and - DoesNotExist. - type: string - values: - description: values is - an array of string values. - If the operator is In - or NotIn, the values - array must be non-empty. - If the operator is Exists - or DoesNotExist, the - values array must be - empty. This array is - replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is - a map of {key,value} pairs. - A single {key,value} in the - matchLabels map is equivalent - to an element of matchExpressions, - whose key field is "key", - the operator is "In", and - the values array contains - only "value". The requirements - are ANDed. - type: object - type: object - namespaces: - description: namespaces specifies - which namespaces the labelSelector - applies to (matches against); - null or empty list means "this - pod's namespace" - items: + matchExpressions: + description: A list of node selector + requirements by node's labels. + items: + description: A node selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + properties: + key: + description: The label key that + the selector applies to. type: string - type: array - topologyKey: - description: This pod should be - co-located (affinity) or not co-located - (anti-affinity) with the pods - matching the labelSelector in - the specified namespaces, where - co-located is defined as running - on a node whose value of the label - with key topologyKey matches that - of any node on which any of the - selected pods is running. Empty - topologyKey is not allowed. - type: string - required: - - topologyKey - type: object - weight: - description: weight associated with - matching the corresponding podAffinityTerm, - in the range 1-100. - format: int32 - type: integer - required: - - podAffinityTerm - - weight + operator: + description: Represents a key's + relationship to a set of values. + Valid operators are In, NotIn, + Exists, DoesNotExist. Gt, and + Lt. + type: string + values: + description: An array of string + values. If the operator is In + or NotIn, the values array must + be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. + If the operator is Gt or Lt, + the values array must have a + single element, which will be + interpreted as an integer. This + array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + description: A list of node selector + requirements by node's fields. + items: + description: A node selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + properties: + key: + description: The label key that + the selector applies to. + type: string + operator: + description: Represents a key's + relationship to a set of values. + Valid operators are In, NotIn, + Exists, DoesNotExist. Gt, and + Lt. + type: string + values: + description: An array of string + values. If the operator is In + or NotIn, the values array must + be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. + If the operator is Gt or Lt, + the values array must have a + single element, which will be + interpreted as an integer. This + array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array type: object type: array - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements - specified by this field are not met at scheduling - time, the pod will not be scheduled onto - the node. If the affinity requirements specified - by this field cease to be met at some point - during pod execution (e.g. due to a pod - label update), the system may or may not - try to eventually evict the pod from its - node. When there are multiple elements, - the lists of nodes corresponding to each - podAffinityTerm are intersected, i.e. all - terms must be satisfied. - items: - description: Defines a set of pods (namely - those matching the labelSelector relative - to the given namespace(s)) that this pod - should be co-located (affinity) or not - co-located (anti-affinity) with, where - co-located is defined as running on a - node whose value of the label with key - matches that of any node - on which a pod of the set of pods is running + required: + - nodeSelectorTerms + type: object + type: object + podAffinity: + description: Describes pod affinity scheduling rules + (e.g. co-locate this pod in the same node, zone, + etc. as some other pod(s)). + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule + pods to nodes that satisfy the affinity expressions + specified by this field, but it may choose a + node that violates one or more of the expressions. + The node that is most preferred is the one with + the greatest sum of weights, i.e. for each node + that meets all of the scheduling requirements + (resource request, requiredDuringScheduling + affinity expressions, etc.), compute a sum by + iterating through the elements of this field + and adding "weight" to the sum if the node has + pods which matches the corresponding podAffinityTerm; + the node(s) with the highest sum are the most + preferred. + items: + description: The weights of all of the matched + WeightedPodAffinityTerm fields are added per-node + to find the most preferred node(s) + properties: + podAffinityTerm: + description: Required. A pod affinity term, + associated with the corresponding weight. properties: labelSelector: description: A label query over a set @@ -2121,163 +2106,146 @@ spec: required: - topologyKey type: object - type: array - type: object - podAntiAffinity: - description: Describes pod anti-affinity scheduling - rules (e.g. avoid putting this pod in the same - node, zone, etc. as some other pod(s)). - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to - schedule pods to nodes that satisfy the - anti-affinity expressions specified by this - field, but it may choose a node that violates - one or more of the expressions. The node - that is most preferred is the one with the - greatest sum of weights, i.e. for each node - that meets all of the scheduling requirements - (resource request, requiredDuringScheduling - anti-affinity expressions, etc.), compute - a sum by iterating through the elements - of this field and adding "weight" to the - sum if the node has pods which matches the - corresponding podAffinityTerm; the node(s) - with the highest sum are the most preferred. - items: - description: The weights of all of the matched - WeightedPodAffinityTerm fields are added - per-node to find the most preferred node(s) + weight: + description: weight associated with matching + the corresponding podAffinityTerm, in + the range 1-100. + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified + by this field are not met at scheduling time, + the pod will not be scheduled onto the node. + If the affinity requirements specified by this + field cease to be met at some point during pod + execution (e.g. due to a pod label update), + the system may or may not try to eventually + evict the pod from its node. When there are + multiple elements, the lists of nodes corresponding + to each podAffinityTerm are intersected, i.e. + all terms must be satisfied. + items: + description: Defines a set of pods (namely those + matching the labelSelector relative to the + given namespace(s)) that this pod should be + co-located (affinity) or not co-located (anti-affinity) + with, where co-located is defined as running + on a node whose value of the label with key + matches that of any node on + which a pod of the set of pods is running + properties: + labelSelector: + description: A label query over a set of + resources, in this case pods. properties: - podAffinityTerm: - description: Required. A pod affinity - term, associated with the corresponding - weight. - properties: - labelSelector: - description: A label query over - a set of resources, in this case - pods. - properties: - matchExpressions: - description: matchExpressions - is a list of label selector - requirements. The requirements - are ANDed. - items: - description: A label selector - requirement is a selector - that contains values, a - key, and an operator that - relates the key and values. - properties: - key: - description: key is the - label key that the selector - applies to. - type: string - operator: - description: operator - represents a key's relationship - to a set of values. - Valid operators are - In, NotIn, Exists and - DoesNotExist. - type: string - values: - description: values is - an array of string values. - If the operator is In - or NotIn, the values - array must be non-empty. - If the operator is Exists - or DoesNotExist, the - values array must be - empty. This array is - replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is - a map of {key,value} pairs. - A single {key,value} in the - matchLabels map is equivalent - to an element of matchExpressions, - whose key field is "key", - the operator is "In", and - the values array contains - only "value". The requirements - are ANDed. - type: object - type: object - namespaces: - description: namespaces specifies - which namespaces the labelSelector - applies to (matches against); - null or empty list means "this - pod's namespace" - items: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label + key that the selector applies + to. type: string - type: array - topologyKey: - description: This pod should be - co-located (affinity) or not co-located - (anti-affinity) with the pods - matching the labelSelector in - the specified namespaces, where - co-located is defined as running - on a node whose value of the label - with key topologyKey matches that - of any node on which any of the - selected pods is running. Empty - topologyKey is not allowed. - type: string - required: - - topologyKey + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. + This array is replaced during + a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of + {key,value} pairs. A single {key,value} + in the matchLabels map is equivalent + to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are + ANDed. type: object - weight: - description: weight associated with - matching the corresponding podAffinityTerm, - in the range 1-100. - format: int32 - type: integer - required: - - podAffinityTerm - - weight type: object - type: array - requiredDuringSchedulingIgnoredDuringExecution: - description: If the anti-affinity requirements - specified by this field are not met at scheduling - time, the pod will not be scheduled onto - the node. If the anti-affinity requirements - specified by this field cease to be met - at some point during pod execution (e.g. - due to a pod label update), the system may - or may not try to eventually evict the pod - from its node. When there are multiple elements, - the lists of nodes corresponding to each - podAffinityTerm are intersected, i.e. all - terms must be satisfied. - items: - description: Defines a set of pods (namely - those matching the labelSelector relative - to the given namespace(s)) that this pod - should be co-located (affinity) or not - co-located (anti-affinity) with, where - co-located is defined as running on a - node whose value of the label with key - matches that of any node - on which a pod of the set of pods is running + namespaces: + description: namespaces specifies which + namespaces the labelSelector applies to + (matches against); null or empty list + means "this pod's namespace" + items: + type: string + type: array + topologyKey: + description: This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector + in the specified namespaces, where co-located + is defined as running on a node whose + value of the label with key topologyKey + matches that of any node on which any + of the selected pods is running. Empty + topologyKey is not allowed. + type: string + required: + - topologyKey + type: object + type: array + type: object + podAntiAffinity: + description: Describes pod anti-affinity scheduling + rules (e.g. avoid putting this pod in the same node, + zone, etc. as some other pod(s)). + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule + pods to nodes that satisfy the anti-affinity + expressions specified by this field, but it + may choose a node that violates one or more + of the expressions. The node that is most preferred + is the one with the greatest sum of weights, + i.e. for each node that meets all of the scheduling + requirements (resource request, requiredDuringScheduling + anti-affinity expressions, etc.), compute a + sum by iterating through the elements of this + field and adding "weight" to the sum if the + node has pods which matches the corresponding + podAffinityTerm; the node(s) with the highest + sum are the most preferred. + items: + description: The weights of all of the matched + WeightedPodAffinityTerm fields are added per-node + to find the most preferred node(s) + properties: + podAffinityTerm: + description: Required. A pod affinity term, + associated with the corresponding weight. properties: labelSelector: description: A label query over a set @@ -2362,781 +2330,2211 @@ spec: required: - topologyKey type: object - type: array - type: object + weight: + description: weight associated with matching + the corresponding podAffinityTerm, in + the range 1-100. + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: If the anti-affinity requirements + specified by this field are not met at scheduling + time, the pod will not be scheduled onto the + node. If the anti-affinity requirements specified + by this field cease to be met at some point + during pod execution (e.g. due to a pod label + update), the system may or may not try to eventually + evict the pod from its node. When there are + multiple elements, the lists of nodes corresponding + to each podAffinityTerm are intersected, i.e. + all terms must be satisfied. + items: + description: Defines a set of pods (namely those + matching the labelSelector relative to the + given namespace(s)) that this pod should be + co-located (affinity) or not co-located (anti-affinity) + with, where co-located is defined as running + on a node whose value of the label with key + matches that of any node on + which a pod of the set of pods is running + properties: + labelSelector: + description: A label query over a set of + resources, in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label + key that the selector applies + to. + type: string + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. + This array is replaced during + a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of + {key,value} pairs. A single {key,value} + in the matchLabels map is equivalent + to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are + ANDed. + type: object + type: object + namespaces: + description: namespaces specifies which + namespaces the labelSelector applies to + (matches against); null or empty list + means "this pod's namespace" + items: + type: string + type: array + topologyKey: + description: This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector + in the specified namespaces, where co-located + is defined as running on a node whose + value of the label with key topologyKey + matches that of any node on which any + of the selected pods is running. Empty + topologyKey is not allowed. + type: string + required: + - topologyKey + type: object + type: array + type: object + type: object + automountServiceAccountToken: + description: AutomountServiceAccountToken indicates whether + a service account token should be automatically mounted. + type: boolean + enableServiceLinks: + description: 'EnableServiceLinks indicates whether information + about services should be injected into pod''s environment + variables, matching the syntax of Docker links. Optional: + Defaults to true.' + type: boolean + imagePullSecrets: + description: 'ImagePullSecrets is an optional list of + references to secrets in the same namespace to use for + pulling any of the images used by this PodRuntimeSettings. + If specified, these secrets will be passed to individual + puller implementations for them to use. For example, + in the case of docker, only DockerConfig type secrets + are honored. More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod' + items: + description: LocalObjectReference contains enough information + to let you locate the referenced object inside the + same namespace. + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + type: object + type: array + nodeName: + description: NodeName is a request to schedule this pod + onto a specific node. If it is non-empty, the scheduler + simply schedules this pod onto that node, assuming that + it fits resource requirements. + type: string + nodeSelector: + additionalProperties: + type: string + description: 'NodeSelector is a selector which must be + true for the pod to fit on a node. Selector which must + match a node''s labels for the pod to be scheduled on + that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' + type: object + priority: + description: The priority value. Various system components + use this field to find the priority of the pod. When + Priority Admission Controller is enabled, it prevents + users from setting this field. The admission controller + populates this field from PriorityClassName. The higher + the value, the higher the priority. + format: int32 + type: integer + priorityClassName: + description: If specified, indicates the pod's priority. + "system-node-critical" and "system-cluster-critical" + are two special keywords which indicate the highest + priorities with the former being the highest priority. + Any other name must be defined by creating a PriorityClass + object with that name. If not specified, the pod priority + will be default or zero if there is no default. + type: string + readinessGates: + description: 'If specified, all readiness gates will be + evaluated for pod readiness. A pod is ready when all + its containers are ready AND all conditions specified + in the readiness gates have status equal to "True" More + info: https://git.k8s.io/enhancements/keps/sig-network/0007-pod-ready%2B%2B.md' + items: + description: PodReadinessGate contains the reference + to a pod condition + properties: + conditionType: + description: ConditionType refers to a condition + in the pod's condition list with matching type. + type: string + required: + - conditionType + type: object + type: array + runtimeClassName: + description: 'RuntimeClassName refers to a RuntimeClass + object in the node.k8s.io group, which should be used + to run this pod. If no RuntimeClass resource matches + the named class, the pod will not be run. If unset or + empty, the "legacy" RuntimeClass will be used, which + is an implicit class with an empty definition that uses + the default runtime handler. More info: https://git.k8s.io/enhancements/keps/sig-node/runtime-class.md + This is an alpha feature and may change in the future.' + type: string + schedulerName: + description: If specified, the pod will be dispatched + by specified scheduler. If not specified, the pod will + be dispatched by default scheduler. + type: string + securityContext: + description: 'Security options the pod should run with. + More info: https://kubernetes.io/docs/concepts/policy/security-context/ + More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/' + properties: + fsGroup: + description: "A special supplemental group that applies + to all containers in a pod. Some volume types allow + the Kubelet to change the ownership of that volume + to be owned by the pod: \n 1. The owning GID will + be the FSGroup 2. The setgid bit is set (new files + created in the volume will be owned by FSGroup) + 3. The permission bits are OR'd with rw-rw---- \n + If unset, the Kubelet will not modify the ownership + and permissions of any volume." + format: int64 + type: integer + runAsGroup: + description: The GID to run the entrypoint of the + container process. Uses runtime default if unset. + May also be set in SecurityContext. If set in both + SecurityContext and PodSecurityContext, the value + specified in SecurityContext takes precedence for + that container. + format: int64 + type: integer + runAsNonRoot: + description: Indicates that the container must run + as a non-root user. If true, the Kubelet will validate + the image at runtime to ensure that it does not + run as UID 0 (root) and fail to start the container + if it does. If unset or false, no such validation + will be performed. May also be set in SecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the + container process. Defaults to user specified in + image metadata if unspecified. May also be set in + SecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence for that container. + format: int64 + type: integer + seLinuxOptions: + description: The SELinux context to be applied to + all containers. If unspecified, the container runtime + will allocate a random SELinux context for each + container. May also be set in SecurityContext. If + set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence + for that container. + properties: + level: + description: Level is SELinux level label that + applies to the container. + type: string + role: + description: Role is a SELinux role label that + applies to the container. + type: string + type: + description: Type is a SELinux type label that + applies to the container. + type: string + user: + description: User is a SELinux user label that + applies to the container. + type: string + type: object + supplementalGroups: + description: A list of groups applied to the first + process run in each container, in addition to the + container's primary GID. If unspecified, no groups + will be added to any container. + items: + format: int64 + type: integer + type: array + sysctls: + description: Sysctls hold a list of namespaced sysctls + used for the pod. Pods with unsupported sysctls + (by the container runtime) might fail to launch. + items: + description: Sysctl defines a kernel parameter to + be set + properties: + name: + description: Name of a property to set + type: string + value: + description: Value of a property to set + type: string + required: + - name + - value + type: object + type: array + windowsOptions: + description: The Windows specific settings applied + to all containers. If unspecified, the options within + a container's SecurityContext will be used. If set + in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA + admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential + spec named by the GMSACredentialSpecName field. + This field is alpha-level and is only honored + by servers that enable the WindowsGMSA feature + flag. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name + of the GMSA credential spec to use. This field + is alpha-level and is only honored by servers + that enable the WindowsGMSA feature flag. + type: string + runAsUserName: + description: The UserName in Windows to run the + entrypoint of the container process. Defaults + to the user specified in image metadata if unspecified. + May also be set in PodSecurityContext. If set + in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes + precedence. This field is alpha-level and it + is only honored by servers that enable the WindowsRunAsUserName + feature flag. + type: string + type: object + type: object + serviceAccountName: + description: 'ServiceAccountName is the name of the ServiceAccount + to use to run this pod. More info: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/' + type: string + tolerations: + description: If specified, the pod's tolerations. + items: + description: The pod this Toleration is attached to + tolerates any taint that matches the triple + using the matching operator . + properties: + effect: + description: Effect indicates the taint effect to + match. Empty means match all taint effects. When + specified, allowed values are NoSchedule, PreferNoSchedule + and NoExecute. + type: string + key: + description: Key is the taint key that the toleration + applies to. Empty means match all taint keys. + If the key is empty, operator must be Exists; + this combination means to match all values and + all keys. + type: string + operator: + description: Operator represents a key's relationship + to the value. Valid operators are Exists and Equal. + Defaults to Equal. Exists is equivalent to wildcard + for value, so that a pod can tolerate all taints + of a particular category. + type: string + tolerationSeconds: + description: TolerationSeconds represents the period + of time the toleration (which must be of effect + NoExecute, otherwise this field is ignored) tolerates + the taint. By default, it is not set, which means + tolerate the taint forever (do not evict). Zero + and negative values will be treated as 0 (evict + immediately) by the system. + format: int64 + type: integer + value: + description: Value is the taint value the toleration + matches to. If the operator is Exists, the value + should be empty, otherwise just a regular string. + type: string + type: object + type: array + type: object + type: object + target: + description: Target specify the backup target + properties: + paths: + description: Paths specify the file paths to backup + items: + type: string + type: array + ref: + description: Ref refers to the backup target + properties: + apiVersion: + type: string + kind: + type: string + name: + type: string + type: object + replicas: + description: replicas are the desired number of replicas whose + data should be backed up. If unspecified, defaults to 1. + format: int32 + type: integer + snapshotClassName: + description: Name of the VolumeSnapshotClass used by the VolumeSnapshot. + If not specified, a default snapshot class will be used + if it is available. Use this field only if the "driver" + field is set to "volumeSnapshotter". + type: string + volumeMounts: + description: VolumeMounts specifies the volumes to mount inside + stash sidecar/init container Specify the volumes that contains + the target directories + items: + description: VolumeMount describes a mounting of a Volume + within a container. + properties: + mountPath: + description: Path within the container at which the + volume should be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts + are propagated from the host to container and the + other way around. When not set, MountPropagationNone + is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write otherwise + (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the container's + volume should be mounted. Defaults to "" (volume's + root). + type: string + subPathExpr: + description: Expanded path within the volume from which + the container's volume should be mounted. Behaves + similarly to SubPath but environment variable references + $(VAR_NAME) are expanded using the container's environment. + Defaults to "" (volume's root). SubPathExpr and SubPath + are mutually exclusive. This field is beta in 1.15. + type: string + required: + - mountPath + - name + type: object + type: array + type: object + task: + description: Task specify the Task crd that specifies the steps + to take backup + properties: + name: + type: string + params: + items: + description: Param declares a value to use for the Param + called Name. + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + required: + - name + type: object + tempDir: + description: Temp directory configuration for functions/sidecar + An `EmptyDir` will always be mounted at /tmp with this settings + properties: + disableCaching: + description: 'More info: https://github.com/restic/restic/blob/master/doc/manual_rest.rst#caching' + type: boolean + medium: + description: StorageMedium defines ways that storage can be + allocated to a volume. + type: string + sizeLimit: + type: string + type: object + type: object + type: array + paused: + description: Indicates that the BackupConfiguration is paused from taking + backup. Default value is 'false' + type: boolean + repository: + description: Repository refer to the Repository crd that holds backend + information + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + type: object + retentionPolicy: + description: RetentionPolicy indicates the policy to follow to clean + old backup snapshots + properties: + dryRun: + type: boolean + keepDaily: + format: int64 + type: integer + keepHourly: + format: int64 + type: integer + keepLast: + format: int64 + type: integer + keepMonthly: + format: int64 + type: integer + keepTags: + items: + type: string + type: array + keepWeekly: + format: int64 + type: integer + keepYearly: + format: int64 + type: integer + name: + type: string + prune: + type: boolean + required: + - name + - prune + type: object + runtimeSettings: + description: RuntimeSettings allow to specify Resources, NodeSelector, + Affinity, Toleration, ReadinessProbe etc, and used to create service + account for CronJob. + properties: + container: + properties: + env: + description: List of environment variables to set in the container. + Cannot be updated. + items: + description: EnvVar represents an environment variable present + in a Container. + properties: + name: + description: Name of the environment variable. Must be + a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) are expanded + using the previous defined environment variables in + the container and any service environment variables. + If a variable cannot be resolved, the reference in the + input string will be unchanged. The $(VAR_NAME) syntax + can be escaped with a double $$, ie: $$(VAR_NAME). Escaped + references will never be expanded, regardless of whether + the variable exists or not. Defaults to "".' + type: string + valueFrom: + description: Source for the environment variable's value. + Cannot be used if value is not empty. + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the ConfigMap or + its key must be defined + type: boolean + required: + - key type: object - automountServiceAccountToken: - description: AutomountServiceAccountToken indicates - whether a service account token should be automatically - mounted. - type: boolean - enableServiceLinks: - description: 'EnableServiceLinks indicates whether - information about services should be injected into - pod''s environment variables, matching the syntax - of Docker links. Optional: Defaults to true.' - type: boolean - imagePullSecrets: - description: 'ImagePullSecrets is an optional list - of references to secrets in the same namespace to - use for pulling any of the images used by this PodRuntimeSettings. - If specified, these secrets will be passed to individual - puller implementations for them to use. For example, - in the case of docker, only DockerConfig type secrets - are honored. More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod' - items: - description: LocalObjectReference contains enough - information to let you locate the referenced object - inside the same namespace. - properties: - name: - description: 'Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, - kind, uid?' - type: string - type: object - type: array - nodeName: - description: NodeName is a request to schedule this - pod onto a specific node. If it is non-empty, the - scheduler simply schedules this pod onto that node, - assuming that it fits resource requirements. - type: string - nodeSelector: - additionalProperties: - type: string - description: 'NodeSelector is a selector which must - be true for the pod to fit on a node. Selector which - must match a node''s labels for the pod to be scheduled - on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' + fieldRef: + description: 'Selects a field of the pod: supports + metadata.name, metadata.namespace, metadata.labels, + metadata.annotations, spec.nodeName, spec.serviceAccountName, + status.hostIP, status.podIP.' + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the + specified API version. + type: string + required: + - fieldPath type: object - priority: - description: The priority value. Various system components - use this field to find the priority of the pod. - When Priority Admission Controller is enabled, it - prevents users from setting this field. The admission - controller populates this field from PriorityClassName. - The higher the value, the higher the priority. - format: int32 - type: integer - priorityClassName: - description: If specified, indicates the pod's priority. - "system-node-critical" and "system-cluster-critical" - are two special keywords which indicate the highest - priorities with the former being the highest priority. - Any other name must be defined by creating a PriorityClass - object with that name. If not specified, the pod - priority will be default or zero if there is no - default. - type: string - readinessGates: - description: 'If specified, all readiness gates will - be evaluated for pod readiness. A pod is ready when - all its containers are ready AND all conditions - specified in the readiness gates have status equal - to "True" More info: https://git.k8s.io/enhancements/keps/sig-network/0007-pod-ready%2B%2B.md' - items: - description: PodReadinessGate contains the reference - to a pod condition - properties: - conditionType: - description: ConditionType refers to a condition - in the pod's condition list with matching - type. - type: string - required: - - conditionType - type: object - type: array - runtimeClassName: - description: 'RuntimeClassName refers to a RuntimeClass - object in the node.k8s.io group, which should be - used to run this pod. If no RuntimeClass resource - matches the named class, the pod will not be run. - If unset or empty, the "legacy" RuntimeClass will - be used, which is an implicit class with an empty - definition that uses the default runtime handler. - More info: https://git.k8s.io/enhancements/keps/sig-node/runtime-class.md - This is an alpha feature and may change in the future.' - type: string - schedulerName: - description: If specified, the pod will be dispatched - by specified scheduler. If not specified, the pod - will be dispatched by default scheduler. - type: string - securityContext: - description: 'Security options the pod should run - with. More info: https://kubernetes.io/docs/concepts/policy/security-context/ - More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/' + resourceFieldRef: + description: 'Selects a resource of the container: + only resources limits and requests (limits.cpu, + limits.memory, limits.ephemeral-storage, requests.cpu, + requests.memory and requests.ephemeral-storage) + are currently supported.' properties: - fsGroup: - description: "A special supplemental group that - applies to all containers in a pod. Some volume - types allow the Kubelet to change the ownership - of that volume to be owned by the pod: \n 1. - The owning GID will be the FSGroup 2. The setgid - bit is set (new files created in the volume - will be owned by FSGroup) 3. The permission - bits are OR'd with rw-rw---- \n If unset, the - Kubelet will not modify the ownership and permissions - of any volume." - format: int64 - type: integer - runAsGroup: - description: The GID to run the entrypoint of - the container process. Uses runtime default - if unset. May also be set in SecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence for that container. - format: int64 - type: integer - runAsNonRoot: - description: Indicates that the container must - run as a non-root user. If true, the Kubelet - will validate the image at runtime to ensure - that it does not run as UID 0 (root) and fail - to start the container if it does. If unset - or false, no such validation will be performed. - May also be set in SecurityContext. If set - in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence. + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + divisor: + description: Specifies the output format of the + exposed resources, defaults to "1" + type: string + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + secretKeyRef: + description: Selects a key of a secret in the pod's + namespace + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its + key must be defined type: boolean - runAsUser: - description: The UID to run the entrypoint of - the container process. Defaults to user specified - in image metadata if unspecified. May also be - set in SecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified - in SecurityContext takes precedence for that - container. - format: int64 - type: integer - seLinuxOptions: - description: The SELinux context to be applied - to all containers. If unspecified, the container - runtime will allocate a random SELinux context - for each container. May also be set in SecurityContext. If - set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence for that container. - properties: - level: - description: Level is SELinux level label - that applies to the container. - type: string - role: - description: Role is a SELinux role label - that applies to the container. - type: string - type: - description: Type is a SELinux type label - that applies to the container. - type: string - user: - description: User is a SELinux user label - that applies to the container. - type: string - type: object - supplementalGroups: - description: A list of groups applied to the first - process run in each container, in addition to - the container's primary GID. If unspecified, - no groups will be added to any container. - items: - format: int64 - type: integer - type: array - sysctls: - description: Sysctls hold a list of namespaced - sysctls used for the pod. Pods with unsupported - sysctls (by the container runtime) might fail - to launch. - items: - description: Sysctl defines a kernel parameter - to be set - properties: - name: - description: Name of a property to set - type: string - value: - description: Value of a property to set - type: string - required: - - name - - value - type: object - type: array - windowsOptions: - description: The Windows specific settings applied - to all containers. If unspecified, the options - within a container's SecurityContext will be - used. If set in both SecurityContext and PodSecurityContext, - the value specified in SecurityContext takes - precedence. - properties: - gmsaCredentialSpec: - description: GMSACredentialSpec is where the - GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) - inlines the contents of the GMSA credential - spec named by the GMSACredentialSpecName - field. This field is alpha-level and is - only honored by servers that enable the - WindowsGMSA feature flag. - type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName is the - name of the GMSA credential spec to use. - This field is alpha-level and is only honored - by servers that enable the WindowsGMSA feature - flag. - type: string - runAsUserName: - description: The UserName in Windows to run - the entrypoint of the container process. - Defaults to the user specified in image - metadata if unspecified. May also be set - in PodSecurityContext. If set in both SecurityContext - and PodSecurityContext, the value specified - in SecurityContext takes precedence. This - field is alpha-level and it is only honored - by servers that enable the WindowsRunAsUserName - feature flag. - type: string - type: object + required: + - key type: object - serviceAccountName: - description: 'ServiceAccountName is the name of the - ServiceAccount to use to run this pod. More info: - https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/' - type: string - tolerations: - description: If specified, the pod's tolerations. - items: - description: The pod this Toleration is attached - to tolerates any taint that matches the triple - using the matching operator - . - properties: - effect: - description: Effect indicates the taint effect - to match. Empty means match all taint effects. - When specified, allowed values are NoSchedule, - PreferNoSchedule and NoExecute. - type: string - key: - description: Key is the taint key that the toleration - applies to. Empty means match all taint keys. - If the key is empty, operator must be Exists; - this combination means to match all values - and all keys. - type: string - operator: - description: Operator represents a key's relationship - to the value. Valid operators are Exists and - Equal. Defaults to Equal. Exists is equivalent - to wildcard for value, so that a pod can tolerate - all taints of a particular category. - type: string - tolerationSeconds: - description: TolerationSeconds represents the - period of time the toleration (which must - be of effect NoExecute, otherwise this field - is ignored) tolerates the taint. By default, - it is not set, which means tolerate the taint - forever (do not evict). Zero and negative - values will be treated as 0 (evict immediately) - by the system. - format: int64 - type: integer - value: - description: Value is the taint value the toleration - matches to. If the operator is Exists, the - value should be empty, otherwise just a regular - string. - type: string - type: object - type: array type: object + required: + - name type: object - target: - description: Target specify the backup target + type: array + envFrom: + description: List of sources to populate environment variables + in the container. The keys defined within a source must be + a C_IDENTIFIER. All invalid keys will be reported as an event + when the container is starting. When a key exists in multiple + sources, the value associated with the last source will take + precedence. Values defined by an Env with a duplicate key + will take precedence. Cannot be updated. + items: + description: EnvFromSource represents the source of a set + of ConfigMaps properties: - paths: - description: Paths specify the file paths to backup - items: - type: string - type: array - ref: - description: Ref refers to the backup target + configMapRef: + description: The ConfigMap to select from properties: - apiVersion: - type: string - kind: - type: string name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' type: string + optional: + description: Specify whether the ConfigMap must be + defined + type: boolean type: object - replicas: - description: replicas are the desired number of replicas - whose data should be backed up. If unspecified, defaults - to 1. - format: int32 - type: integer - snapshotClassName: - description: Name of the VolumeSnapshotClass used by the - VolumeSnapshot. If not specified, a default snapshot - class will be used if it is available. Use this field - only if the "driver" field is set to "volumeSnapshotter". + prefix: + description: An optional identifier to prepend to each + key in the ConfigMap. Must be a C_IDENTIFIER. type: string - volumeMounts: - description: VolumeMounts specifies the volumes to mount - inside stash sidecar/init container Specify the volumes - that contains the target directories - items: - description: VolumeMount describes a mounting of a Volume - within a container. + secretRef: + description: The Secret to select from + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret must be defined + type: boolean + type: object + type: object + type: array + ionice: + description: 'Settings to configure `ionice` to throttle the + load on disk. More info: http://kennystechtalk.blogspot.com/2015/04/throttling-cpu-usage-with-linux-cgroups.html + More info: https://oakbytes.wordpress.com/2012/06/06/linux-scheduler-cfs-and-nice/' + properties: + class: + format: int32 + type: integer + classData: + format: int32 + type: integer + type: object + lifecycle: + description: Actions that the management system should take + in response to container lifecycle events. Cannot be updated. + properties: + postStart: + description: 'PostStart is called immediately after a container + is created. If the handler fails, the container is terminated + and restarted according to its restart policy. Other management + of the container blocks until the hook completes. More + info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' + properties: + exec: + description: One and only one of the following should + be specified. Exec specifies the action to take. properties: - mountPath: - description: Path within the container at which - the volume should be mounted. Must not contain - ':'. - type: string - mountPropagation: - description: mountPropagation determines how mounts - are propagated from the host to container and - the other way around. When not set, MountPropagationNone - is used. This field is beta in 1.10. + command: + description: Command is the command line to execute + inside the container, the working directory for + the command is root ('/') in the container's + filesystem. The command is simply exec'd, it is + not run inside a shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you need + to explicitly call out to that shell. Exit status + of 0 is treated as live/healthy and non-zero is + unhealthy. + items: + type: string + type: array + type: object + httpGet: + description: HTTPGet specifies the http request to perform. + properties: + host: + description: Host name to connect to, defaults to + the pod IP. You probably want to set "Host" in + httpHeaders instead. type: string - name: - description: This must match the Name of a Volume. + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + items: + description: HTTPHeader describes a custom header + to be used in HTTP probes + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + type: object + type: array + path: + description: Path to access on the HTTP server. type: string - readOnly: - description: Mounted read-only if true, read-write - otherwise (false or unspecified). Defaults to - false. - type: boolean - subPath: - description: Path within the volume from which the - container's volume should be mounted. Defaults - to "" (volume's root). + port: + anyOf: + - type: integer + - type: string + description: Name or number of the port to access + on the container. Number must be in the range + 1 to 65535. Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the + host. Defaults to HTTP. type: string - subPathExpr: - description: Expanded path within the volume from - which the container's volume should be mounted. - Behaves similarly to SubPath but environment variable - references $(VAR_NAME) are expanded using the - container's environment. Defaults to "" (volume's - root). SubPathExpr and SubPath are mutually exclusive. - This field is beta in 1.15. + required: + - port + type: object + tcpSocket: + description: 'TCPSocket specifies an action involving + a TCP port. TCP hooks not yet supported TODO: implement + a realistic TCP lifecycle hook' + properties: + host: + description: 'Optional: Host name to connect to, + defaults to the pod IP.' type: string + port: + anyOf: + - type: integer + - type: string + description: Number or name of the port to access + on the container. Number must be in the range + 1 to 65535. Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true required: - - mountPath - - name + - port type: object - type: array - type: object - task: - description: Task specify the Task crd that specifies the - steps to take backup - properties: - name: - type: string - params: - items: - description: Param declares a value to use for the Param - called Name. + type: object + preStop: + description: 'PreStop is called immediately before a container + is terminated due to an API request or management event + such as liveness/startup probe failure, preemption, resource + contention, etc. The handler is not called if the container + crashes or exits. The reason for termination is passed + to the handler. The Pod''s termination grace period countdown + begins before the PreStop hooked is executed. Regardless + of the outcome of the handler, the container will eventually + terminate within the Pod''s termination grace period. + Other management of the container blocks until the hook + completes or until the termination grace period is reached. + More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' + properties: + exec: + description: One and only one of the following should + be specified. Exec specifies the action to take. properties: - name: + command: + description: Command is the command line to execute + inside the container, the working directory for + the command is root ('/') in the container's + filesystem. The command is simply exec'd, it is + not run inside a shell, so traditional shell instructions + ('|', etc) won't work. To use a shell, you need + to explicitly call out to that shell. Exit status + of 0 is treated as live/healthy and non-zero is + unhealthy. + items: + type: string + type: array + type: object + httpGet: + description: HTTPGet specifies the http request to perform. + properties: + host: + description: Host name to connect to, defaults to + the pod IP. You probably want to set "Host" in + httpHeaders instead. type: string - value: + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + items: + description: HTTPHeader describes a custom header + to be used in HTTP probes + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + type: object + type: array + path: + description: Path to access on the HTTP server. + type: string + port: + anyOf: + - type: integer + - type: string + description: Name or number of the port to access + on the container. Number must be in the range + 1 to 65535. Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the + host. Defaults to HTTP. type: string required: - - name - - value + - port type: object - type: array - required: - - name - type: object - tempDir: - description: Temp directory configuration for functions/sidecar - An `EmptyDir` will always be mounted at /tmp with this settings - properties: - disableCaching: - description: 'More info: https://github.com/restic/restic/blob/master/doc/manual_rest.rst#caching' - type: boolean - medium: - description: StorageMedium defines ways that storage can - be allocated to a volume. - type: string - sizeLimit: - type: string - type: object - type: object - type: object - type: array - backupHistoryLimit: - description: 'BackupHistoryLimit specifies the number of BackupSession - and it''s associate resources to keep. This is helpful for debugging - purpose. Default: 1' - format: int32 - type: integer - driver: - description: Driver indicates the name of the agent to use to backup - the target. Supported values are "Restic", "VolumeSnapshotter". Default - value is "Restic". - type: string - hooks: - description: Actions that Stash should take in response to backup sessions. - Cannot be updated. - properties: - postBackup: - description: PostBackup is called immediately after a backup session - is complete. - properties: - containerName: - description: ContainerName specifies the name of the container - where to execute the commands for Exec probe or where to find - the port for HTTP or TCP probe - type: string - exec: - description: One and only one of the following should be specified. - Exec specifies the action to take. + tcpSocket: + description: 'TCPSocket specifies an action involving + a TCP port. TCP hooks not yet supported TODO: implement + a realistic TCP lifecycle hook' + properties: + host: + description: 'Optional: Host name to connect to, + defaults to the pod IP.' + type: string + port: + anyOf: + - type: integer + - type: string + description: Number or name of the port to access + on the container. Number must be in the range + 1 to 65535. Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + type: object + livenessProbe: + description: 'Periodic probe of container liveness. Container + will be restarted if the probe fails. Cannot be updated. More + info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' properties: - command: - description: Command is the command line to execute inside - the container, the working directory for the command is - root ('/') in the container's filesystem. The command - is simply exec'd, it is not run inside a shell, so traditional - shell instructions ('|', etc) won't work. To use a shell, - you need to explicitly call out to that shell. Exit status - of 0 is treated as live/healthy and non-zero is unhealthy. - items: + exec: + description: One and only one of the following should be + specified. Exec specifies the action to take. + properties: + command: + description: Command is the command line to execute + inside the container, the working directory for the + command is root ('/') in the container's filesystem. + The command is simply exec'd, it is not run inside + a shell, so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is treated + as live/healthy and non-zero is unhealthy. + items: + type: string + type: array + type: object + failureThreshold: + description: Minimum consecutive failures for the probe + to be considered failed after having succeeded. Defaults + to 3. Minimum value is 1. + format: int32 + type: integer + httpGet: + description: HTTPGet specifies the http request to perform. + properties: + host: + description: Host name to connect to, defaults to the + pod IP. You probably want to set "Host" in httpHeaders + instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP + allows repeated headers. + items: + description: HTTPHeader describes a custom header + to be used in HTTP probes + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + type: object + type: array + path: + description: Path to access on the HTTP server. + type: string + port: + anyOf: + - type: integer + - type: string + description: Name or number of the port to access on + the container. Number must be in the range 1 to 65535. + Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. + Defaults to HTTP. + type: string + required: + - port + type: object + initialDelaySeconds: + description: 'Number of seconds after the container has + started before liveness probes are initiated. More info: + https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + format: int32 + type: integer + periodSeconds: + description: How often (in seconds) to perform the probe. + Default to 10 seconds. Minimum value is 1. + format: int32 + type: integer + successThreshold: + description: Minimum consecutive successes for the probe + to be considered successful after having failed. Defaults + to 1. Must be 1 for liveness and startup. Minimum value + is 1. + format: int32 + type: integer + tcpSocket: + description: 'TCPSocket specifies an action involving a + TCP port. TCP hooks not yet supported TODO: implement + a realistic TCP lifecycle hook' + properties: + host: + description: 'Optional: Host name to connect to, defaults + to the pod IP.' + type: string + port: + anyOf: + - type: integer + - type: string + description: Number or name of the port to access on + the container. Number must be in the range 1 to 65535. + Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + required: + - port + type: object + timeoutSeconds: + description: 'Number of seconds after which the probe times + out. Defaults to 1 second. Minimum value is 1. More info: + https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + format: int32 + type: integer + type: object + nice: + description: 'Settings to configure `nice` to throttle the load + on cpu. More info: http://kennystechtalk.blogspot.com/2015/04/throttling-cpu-usage-with-linux-cgroups.html + More info: https://oakbytes.wordpress.com/2012/06/06/linux-scheduler-cfs-and-nice/' + properties: + adjustment: + format: int32 + type: integer + type: object + readinessProbe: + description: 'Periodic probe of container service readiness. + Container will be removed from service endpoints if the probe + fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + properties: + exec: + description: One and only one of the following should be + specified. Exec specifies the action to take. + properties: + command: + description: Command is the command line to execute + inside the container, the working directory for the + command is root ('/') in the container's filesystem. + The command is simply exec'd, it is not run inside + a shell, so traditional shell instructions ('|', etc) + won't work. To use a shell, you need to explicitly + call out to that shell. Exit status of 0 is treated + as live/healthy and non-zero is unhealthy. + items: + type: string + type: array + type: object + failureThreshold: + description: Minimum consecutive failures for the probe + to be considered failed after having succeeded. Defaults + to 3. Minimum value is 1. + format: int32 + type: integer + httpGet: + description: HTTPGet specifies the http request to perform. + properties: + host: + description: Host name to connect to, defaults to the + pod IP. You probably want to set "Host" in httpHeaders + instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP + allows repeated headers. + items: + description: HTTPHeader describes a custom header + to be used in HTTP probes + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + required: + - name + - value + type: object + type: array + path: + description: Path to access on the HTTP server. + type: string + port: + anyOf: + - type: integer + - type: string + description: Name or number of the port to access on + the container. Number must be in the range 1 to 65535. + Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. + Defaults to HTTP. + type: string + required: + - port + type: object + initialDelaySeconds: + description: 'Number of seconds after the container has + started before liveness probes are initiated. More info: + https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + format: int32 + type: integer + periodSeconds: + description: How often (in seconds) to perform the probe. + Default to 10 seconds. Minimum value is 1. + format: int32 + type: integer + successThreshold: + description: Minimum consecutive successes for the probe + to be considered successful after having failed. Defaults + to 1. Must be 1 for liveness and startup. Minimum value + is 1. + format: int32 + type: integer + tcpSocket: + description: 'TCPSocket specifies an action involving a + TCP port. TCP hooks not yet supported TODO: implement + a realistic TCP lifecycle hook' + properties: + host: + description: 'Optional: Host name to connect to, defaults + to the pod IP.' + type: string + port: + anyOf: + - type: integer + - type: string + description: Number or name of the port to access on + the container. Number must be in the range 1 to 65535. + Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + required: + - port + type: object + timeoutSeconds: + description: 'Number of seconds after which the probe times + out. Defaults to 1 second. Minimum value is 1. More info: + https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + format: int32 + type: integer + type: object + resources: + description: 'Compute Resources required by container. Cannot + be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + properties: + limits: + additionalProperties: type: string - type: array + description: 'Limits describes the maximum amount of compute + resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + requests: + additionalProperties: + type: string + description: 'Requests describes the minimum amount of compute + resources required. If Requests is omitted for a container, + it defaults to Limits if that is explicitly specified, + otherwise to an implementation-defined value. More info: + https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object type: object - httpGet: - description: HTTPGet specifies the http Get request to perform. + securityContext: + description: 'Security options the pod should run with. More + info: https://kubernetes.io/docs/concepts/policy/security-context/ + More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/' properties: - host: - description: Host name to connect to, defaults to the pod - IP. You probably want to set "Host" in httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the request. HTTP - allows repeated headers. - items: - description: HTTPHeader describes a custom header to be - used in HTTP probes - properties: - name: - description: The header field name + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls whether + a process can gain more privileges than its parent process. + This bool directly controls if the no_new_privs flag will + be set on the container process. AllowPrivilegeEscalation + is true always when the container is: 1) run as Privileged + 2) has CAP_SYS_ADMIN' + type: boolean + capabilities: + description: The capabilities to add/drop when running containers. + Defaults to the default set of capabilities granted by + the container runtime. + properties: + add: + description: Added capabilities + items: + description: Capability represent POSIX capabilities + type type: string - value: - description: The header field value + type: array + drop: + description: Removed capabilities + items: + description: Capability represent POSIX capabilities + type type: string - required: - - name - - value - type: object - type: array - path: - description: Path to access on the HTTP server. - type: string - port: - anyOf: - - type: integer - - type: string - description: Name or number of the port to access on the - container. Number must be in the range 1 to 65535. Name - must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use for connecting to the host. Defaults - to HTTP. + type: array + type: object + privileged: + description: Run container in privileged mode. Processes + in privileged containers are essentially equivalent to + root on the host. Defaults to false. + type: boolean + procMount: + description: procMount denotes the type of proc mount to + use for the containers. The default is DefaultProcMount + which uses the container runtime defaults for readonly + paths and masked paths. This requires the ProcMountType + feature flag to be enabled. type: string - required: - - port + readOnlyRootFilesystem: + description: Whether this container has a read-only root + filesystem. Default is false. + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the container + process. Uses runtime default if unset. May also be set + in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence. + format: int64 + type: integer + runAsNonRoot: + description: Indicates that the container must run as a + non-root user. If true, the Kubelet will validate the + image at runtime to ensure that it does not run as UID + 0 (root) and fail to start the container if it does. If + unset or false, no such validation will be performed. + May also be set in PodSecurityContext. If set in both + SecurityContext and PodSecurityContext, the value specified + in SecurityContext takes precedence. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container + process. Defaults to user specified in image metadata + if unspecified. May also be set in PodSecurityContext. If + set in both SecurityContext and PodSecurityContext, the + value specified in SecurityContext takes precedence. + format: int64 + type: integer + seLinuxOptions: + description: The SELinux context to be applied to the container. + If unspecified, the container runtime will allocate a + random SELinux context for each container. May also be + set in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence. + properties: + level: + description: Level is SELinux level label that applies + to the container. + type: string + role: + description: Role is a SELinux role label that applies + to the container. + type: string + type: + description: Type is a SELinux type label that applies + to the container. + type: string + user: + description: User is a SELinux user label that applies + to the container. + type: string + type: object + windowsOptions: + description: The Windows specific settings applied to all + containers. If unspecified, the options from the PodSecurityContext + will be used. If set in both SecurityContext and PodSecurityContext, + the value specified in SecurityContext takes precedence. + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA admission + webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential spec named + by the GMSACredentialSpecName field. This field is + alpha-level and is only honored by servers that enable + the WindowsGMSA feature flag. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name of the + GMSA credential spec to use. This field is alpha-level + and is only honored by servers that enable the WindowsGMSA + feature flag. + type: string + runAsUserName: + description: The UserName in Windows to run the entrypoint + of the container process. Defaults to the user specified + in image metadata if unspecified. May also be set + in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence. This field is alpha-level and it + is only honored by servers that enable the WindowsRunAsUserName + feature flag. + type: string + type: object type: object - httpPost: - description: HTTPPost specifies the http Post request to perform. + type: object + pod: + properties: + affinity: + description: If specified, the pod's scheduling constraints properties: - body: - description: Body to set in the request. - type: string - form: - description: Form to set in the request body. - items: - properties: - key: - type: string - values: - items: - type: string - type: array - type: object - type: array - host: - description: Host name to connect to, defaults to the pod - IP. You probably want to set "Host" in httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the request. HTTP - allows repeated headers. - items: - description: HTTPHeader describes a custom header to be - used in HTTP probes - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value - type: object - type: array - path: - description: Path to access on the HTTP server. - type: string - port: - anyOf: - - type: integer - - type: string - description: Name or number of the port to access on the - container. Number must be in the range 1 to 65535. Name - must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use for connecting to the host. Defaults - to HTTP. - type: string - required: - - port + nodeAffinity: + description: Describes node affinity scheduling rules for + the pod. + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods + to nodes that satisfy the affinity expressions specified + by this field, but it may choose a node that violates + one or more of the expressions. The node that is most + preferred is the one with the greatest sum of weights, + i.e. for each node that meets all of the scheduling + requirements (resource request, requiredDuringScheduling + affinity expressions, etc.), compute a sum by iterating + through the elements of this field and adding "weight" + to the sum if the node matches the corresponding matchExpressions; + the node(s) with the highest sum are the most preferred. + items: + description: An empty preferred scheduling term matches + all objects with implicit weight 0 (i.e. it's a + no-op). A null preferred scheduling term matches + no objects (i.e. is also a no-op). + properties: + preference: + description: A node selector term, associated + with the corresponding weight. + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + items: + description: A node selector requirement + is a selector that contains values, a + key, and an operator that relates the + key and values. + properties: + key: + description: The label key that the + selector applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + values: + description: An array of string values. + If the operator is In or NotIn, the + values array must be non-empty. If + the operator is Exists or DoesNotExist, + the values array must be empty. If + the operator is Gt or Lt, the values + array must have a single element, + which will be interpreted as an integer. + This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + description: A list of node selector requirements + by node's fields. + items: + description: A node selector requirement + is a selector that contains values, a + key, and an operator that relates the + key and values. + properties: + key: + description: The label key that the + selector applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + values: + description: An array of string values. + If the operator is In or NotIn, the + values array must be non-empty. If + the operator is Exists or DoesNotExist, + the values array must be empty. If + the operator is Gt or Lt, the values + array must have a single element, + which will be interpreted as an integer. + This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + weight: + description: Weight associated with matching the + corresponding nodeSelectorTerm, in the range + 1-100. + format: int32 + type: integer + required: + - preference + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified + by this field are not met at scheduling time, the + pod will not be scheduled onto the node. If the affinity + requirements specified by this field cease to be met + at some point during pod execution (e.g. due to an + update), the system may or may not try to eventually + evict the pod from its node. + properties: + nodeSelectorTerms: + description: Required. A list of node selector terms. + The terms are ORed. + items: + description: A null or empty node selector term + matches no objects. The requirements of them + are ANDed. The TopologySelectorTerm type implements + a subset of the NodeSelectorTerm. + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + items: + description: A node selector requirement + is a selector that contains values, a + key, and an operator that relates the + key and values. + properties: + key: + description: The label key that the + selector applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + values: + description: An array of string values. + If the operator is In or NotIn, the + values array must be non-empty. If + the operator is Exists or DoesNotExist, + the values array must be empty. If + the operator is Gt or Lt, the values + array must have a single element, + which will be interpreted as an integer. + This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + description: A list of node selector requirements + by node's fields. + items: + description: A node selector requirement + is a selector that contains values, a + key, and an operator that relates the + key and values. + properties: + key: + description: The label key that the + selector applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + values: + description: An array of string values. + If the operator is In or NotIn, the + values array must be non-empty. If + the operator is Exists or DoesNotExist, + the values array must be empty. If + the operator is Gt or Lt, the values + array must have a single element, + which will be interpreted as an integer. + This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + type: array + required: + - nodeSelectorTerms + type: object + type: object + podAffinity: + description: Describes pod affinity scheduling rules (e.g. + co-locate this pod in the same node, zone, etc. as some + other pod(s)). + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods + to nodes that satisfy the affinity expressions specified + by this field, but it may choose a node that violates + one or more of the expressions. The node that is most + preferred is the one with the greatest sum of weights, + i.e. for each node that meets all of the scheduling + requirements (resource request, requiredDuringScheduling + affinity expressions, etc.), compute a sum by iterating + through the elements of this field and adding "weight" + to the sum if the node has pods which matches the + corresponding podAffinityTerm; the node(s) with the + highest sum are the most preferred. + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred + node(s) + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated + with the corresponding weight. + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. This + array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are ANDed. + type: object + type: object + namespaces: + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" + items: + type: string + type: array + topologyKey: + description: This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector + in the specified namespaces, where co-located + is defined as running on a node whose value + of the label with key topologyKey matches + that of any node on which any of the selected + pods is running. Empty topologyKey is not + allowed. + type: string + required: + - topologyKey + type: object + weight: + description: weight associated with matching the + corresponding podAffinityTerm, in the range + 1-100. + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified + by this field are not met at scheduling time, the + pod will not be scheduled onto the node. If the affinity + requirements specified by this field cease to be met + at some point during pod execution (e.g. due to a + pod label update), the system may or may not try to + eventually evict the pod from its node. When there + are multiple elements, the lists of nodes corresponding + to each podAffinityTerm are intersected, i.e. all + terms must be satisfied. + items: + description: Defines a set of pods (namely those matching + the labelSelector relative to the given namespace(s)) + that this pod should be co-located (affinity) or + not co-located (anti-affinity) with, where co-located + is defined as running on a node whose value of the + label with key matches that of any + node on which a pod of the set of pods is running + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of + label selector requirements. The requirements + are ANDed. + items: + description: A label selector requirement + is a selector that contains values, a + key, and an operator that relates the + key and values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. This + array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator is + "In", and the values array contains only + "value". The requirements are ANDed. + type: object + type: object + namespaces: + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" + items: + type: string + type: array + topologyKey: + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods + matching the labelSelector in the specified + namespaces, where co-located is defined as running + on a node whose value of the label with key + topologyKey matches that of any node on which + any of the selected pods is running. Empty topologyKey + is not allowed. + type: string + required: + - topologyKey + type: object + type: array + type: object + podAntiAffinity: + description: Describes pod anti-affinity scheduling rules + (e.g. avoid putting this pod in the same node, zone, etc. + as some other pod(s)). + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods + to nodes that satisfy the anti-affinity expressions + specified by this field, but it may choose a node + that violates one or more of the expressions. The + node that is most preferred is the one with the greatest + sum of weights, i.e. for each node that meets all + of the scheduling requirements (resource request, + requiredDuringScheduling anti-affinity expressions, + etc.), compute a sum by iterating through the elements + of this field and adding "weight" to the sum if the + node has pods which matches the corresponding podAffinityTerm; + the node(s) with the highest sum are the most preferred. + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred + node(s) + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated + with the corresponding weight. + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. This + array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are ANDed. + type: object + type: object + namespaces: + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" + items: + type: string + type: array + topologyKey: + description: This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector + in the specified namespaces, where co-located + is defined as running on a node whose value + of the label with key topologyKey matches + that of any node on which any of the selected + pods is running. Empty topologyKey is not + allowed. + type: string + required: + - topologyKey + type: object + weight: + description: weight associated with matching the + corresponding podAffinityTerm, in the range + 1-100. + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: If the anti-affinity requirements specified + by this field are not met at scheduling time, the + pod will not be scheduled onto the node. If the anti-affinity + requirements specified by this field cease to be met + at some point during pod execution (e.g. due to a + pod label update), the system may or may not try to + eventually evict the pod from its node. When there + are multiple elements, the lists of nodes corresponding + to each podAffinityTerm are intersected, i.e. all + terms must be satisfied. + items: + description: Defines a set of pods (namely those matching + the labelSelector relative to the given namespace(s)) + that this pod should be co-located (affinity) or + not co-located (anti-affinity) with, where co-located + is defined as running on a node whose value of the + label with key matches that of any + node on which a pod of the set of pods is running + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of + label selector requirements. The requirements + are ANDed. + items: + description: A label selector requirement + is a selector that contains values, a + key, and an operator that relates the + key and values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. This + array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator is + "In", and the values array contains only + "value". The requirements are ANDed. + type: object + type: object + namespaces: + description: namespaces specifies which namespaces + the labelSelector applies to (matches against); + null or empty list means "this pod's namespace" + items: + type: string + type: array + topologyKey: + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods + matching the labelSelector in the specified + namespaces, where co-located is defined as running + on a node whose value of the label with key + topologyKey matches that of any node on which + any of the selected pods is running. Empty topologyKey + is not allowed. + type: string + required: + - topologyKey + type: object + type: array + type: object type: object - tcpSocket: - description: 'TCPSocket specifies an action involving a TCP - port. TCP hooks not yet supported TODO: implement a realistic - TCP lifecycle hook' - properties: - host: - description: 'Optional: Host name to connect to, defaults - to the pod IP.' - type: string - port: - anyOf: - - type: integer - - type: string - description: Number or name of the port to access on the - container. Number must be in the range 1 to 65535. Name - must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - required: - - port + automountServiceAccountToken: + description: AutomountServiceAccountToken indicates whether + a service account token should be automatically mounted. + type: boolean + enableServiceLinks: + description: 'EnableServiceLinks indicates whether information + about services should be injected into pod''s environment + variables, matching the syntax of Docker links. Optional: + Defaults to true.' + type: boolean + imagePullSecrets: + description: 'ImagePullSecrets is an optional list of references + to secrets in the same namespace to use for pulling any of + the images used by this PodRuntimeSettings. If specified, + these secrets will be passed to individual puller implementations + for them to use. For example, in the case of docker, only + DockerConfig type secrets are honored. More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod' + items: + description: LocalObjectReference contains enough information + to let you locate the referenced object inside the same + namespace. + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + type: object + type: array + nodeName: + description: NodeName is a request to schedule this pod onto + a specific node. If it is non-empty, the scheduler simply + schedules this pod onto that node, assuming that it fits resource + requirements. + type: string + nodeSelector: + additionalProperties: + type: string + description: 'NodeSelector is a selector which must be true + for the pod to fit on a node. Selector which must match a + node''s labels for the pod to be scheduled on that node. More + info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' type: object - type: object - preBackup: - description: PreBackup is called immediately before a backup session - is initiated. - properties: - containerName: - description: ContainerName specifies the name of the container - where to execute the commands for Exec probe or where to find - the port for HTTP or TCP probe + priority: + description: The priority value. Various system components use + this field to find the priority of the pod. When Priority + Admission Controller is enabled, it prevents users from setting + this field. The admission controller populates this field + from PriorityClassName. The higher the value, the higher the + priority. + format: int32 + type: integer + priorityClassName: + description: If specified, indicates the pod's priority. "system-node-critical" + and "system-cluster-critical" are two special keywords which + indicate the highest priorities with the former being the + highest priority. Any other name must be defined by creating + a PriorityClass object with that name. If not specified, the + pod priority will be default or zero if there is no default. type: string - exec: - description: One and only one of the following should be specified. - Exec specifies the action to take. - properties: - command: - description: Command is the command line to execute inside - the container, the working directory for the command is - root ('/') in the container's filesystem. The command - is simply exec'd, it is not run inside a shell, so traditional - shell instructions ('|', etc) won't work. To use a shell, - you need to explicitly call out to that shell. Exit status - of 0 is treated as live/healthy and non-zero is unhealthy. - items: + readinessGates: + description: 'If specified, all readiness gates will be evaluated + for pod readiness. A pod is ready when all its containers + are ready AND all conditions specified in the readiness gates + have status equal to "True" More info: https://git.k8s.io/enhancements/keps/sig-network/0007-pod-ready%2B%2B.md' + items: + description: PodReadinessGate contains the reference to a + pod condition + properties: + conditionType: + description: ConditionType refers to a condition in the + pod's condition list with matching type. type: string - type: array - type: object - httpGet: - description: HTTPGet specifies the http Get request to perform. - properties: - host: - description: Host name to connect to, defaults to the pod - IP. You probably want to set "Host" in httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the request. HTTP - allows repeated headers. - items: - description: HTTPHeader describes a custom header to be - used in HTTP probes - properties: - name: - description: The header field name - type: string - value: - description: The header field value - type: string - required: - - name - - value - type: object - type: array - path: - description: Path to access on the HTTP server. - type: string - port: - anyOf: - - type: integer - - type: string - description: Name or number of the port to access on the - container. Number must be in the range 1 to 65535. Name - must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use for connecting to the host. Defaults - to HTTP. - type: string - required: - - port - type: object - httpPost: - description: HTTPPost specifies the http Post request to perform. + required: + - conditionType + type: object + type: array + runtimeClassName: + description: 'RuntimeClassName refers to a RuntimeClass object + in the node.k8s.io group, which should be used to run this + pod. If no RuntimeClass resource matches the named class, + the pod will not be run. If unset or empty, the "legacy" RuntimeClass + will be used, which is an implicit class with an empty definition + that uses the default runtime handler. More info: https://git.k8s.io/enhancements/keps/sig-node/runtime-class.md + This is an alpha feature and may change in the future.' + type: string + schedulerName: + description: If specified, the pod will be dispatched by specified + scheduler. If not specified, the pod will be dispatched by + default scheduler. + type: string + securityContext: + description: 'Security options the pod should run with. More + info: https://kubernetes.io/docs/concepts/policy/security-context/ + More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/' properties: - body: - description: Body to set in the request. - type: string - form: - description: Form to set in the request body. + fsGroup: + description: "A special supplemental group that applies + to all containers in a pod. Some volume types allow the + Kubelet to change the ownership of that volume to be owned + by the pod: \n 1. The owning GID will be the FSGroup 2. + The setgid bit is set (new files created in the volume + will be owned by FSGroup) 3. The permission bits are OR'd + with rw-rw---- \n If unset, the Kubelet will not modify + the ownership and permissions of any volume." + format: int64 + type: integer + runAsGroup: + description: The GID to run the entrypoint of the container + process. Uses runtime default if unset. May also be set + in SecurityContext. If set in both SecurityContext and + PodSecurityContext, the value specified in SecurityContext + takes precedence for that container. + format: int64 + type: integer + runAsNonRoot: + description: Indicates that the container must run as a + non-root user. If true, the Kubelet will validate the + image at runtime to ensure that it does not run as UID + 0 (root) and fail to start the container if it does. If + unset or false, no such validation will be performed. + May also be set in SecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container + process. Defaults to user specified in image metadata + if unspecified. May also be set in SecurityContext. If + set in both SecurityContext and PodSecurityContext, the + value specified in SecurityContext takes precedence for + that container. + format: int64 + type: integer + seLinuxOptions: + description: The SELinux context to be applied to all containers. + If unspecified, the container runtime will allocate a + random SELinux context for each container. May also be + set in SecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence for that container. + properties: + level: + description: Level is SELinux level label that applies + to the container. + type: string + role: + description: Role is a SELinux role label that applies + to the container. + type: string + type: + description: Type is a SELinux type label that applies + to the container. + type: string + user: + description: User is a SELinux user label that applies + to the container. + type: string + type: object + supplementalGroups: + description: A list of groups applied to the first process + run in each container, in addition to the container's + primary GID. If unspecified, no groups will be added + to any container. items: - properties: - key: - type: string - values: - items: - type: string - type: array - type: object + format: int64 + type: integer type: array - host: - description: Host name to connect to, defaults to the pod - IP. You probably want to set "Host" in httpHeaders instead. - type: string - httpHeaders: - description: Custom headers to set in the request. HTTP - allows repeated headers. + sysctls: + description: Sysctls hold a list of namespaced sysctls used + for the pod. Pods with unsupported sysctls (by the container + runtime) might fail to launch. items: - description: HTTPHeader describes a custom header to be - used in HTTP probes + description: Sysctl defines a kernel parameter to be set properties: name: - description: The header field name + description: Name of a property to set type: string value: - description: The header field value + description: Value of a property to set type: string required: - name - value type: object type: array - path: - description: Path to access on the HTTP server. - type: string - port: - anyOf: - - type: integer - - type: string - description: Name or number of the port to access on the - container. Number must be in the range 1 to 65535. Name - must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - scheme: - description: Scheme to use for connecting to the host. Defaults - to HTTP. - type: string - required: - - port - type: object - tcpSocket: - description: 'TCPSocket specifies an action involving a TCP - port. TCP hooks not yet supported TODO: implement a realistic - TCP lifecycle hook' - properties: - host: - description: 'Optional: Host name to connect to, defaults - to the pod IP.' - type: string - port: - anyOf: - - type: integer - - type: string - description: Number or name of the port to access on the - container. Number must be in the range 1 to 65535. Name - must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - required: - - port + windowsOptions: + description: The Windows specific settings applied to all + containers. If unspecified, the options within a container's + SecurityContext will be used. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence. + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA admission + webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential spec named + by the GMSACredentialSpecName field. This field is + alpha-level and is only honored by servers that enable + the WindowsGMSA feature flag. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name of the + GMSA credential spec to use. This field is alpha-level + and is only honored by servers that enable the WindowsGMSA + feature flag. + type: string + runAsUserName: + description: The UserName in Windows to run the entrypoint + of the container process. Defaults to the user specified + in image metadata if unspecified. May also be set + in PodSecurityContext. If set in both SecurityContext + and PodSecurityContext, the value specified in SecurityContext + takes precedence. This field is alpha-level and it + is only honored by servers that enable the WindowsRunAsUserName + feature flag. + type: string + type: object type: object + serviceAccountName: + description: 'ServiceAccountName is the name of the ServiceAccount + to use to run this pod. More info: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/' + type: string + tolerations: + description: If specified, the pod's tolerations. + items: + description: The pod this Toleration is attached to tolerates + any taint that matches the triple using + the matching operator . + properties: + effect: + description: Effect indicates the taint effect to match. + Empty means match all taint effects. When specified, + allowed values are NoSchedule, PreferNoSchedule and + NoExecute. + type: string + key: + description: Key is the taint key that the toleration + applies to. Empty means match all taint keys. If the + key is empty, operator must be Exists; this combination + means to match all values and all keys. + type: string + operator: + description: Operator represents a key's relationship + to the value. Valid operators are Exists and Equal. + Defaults to Equal. Exists is equivalent to wildcard + for value, so that a pod can tolerate all taints of + a particular category. + type: string + tolerationSeconds: + description: TolerationSeconds represents the period of + time the toleration (which must be of effect NoExecute, + otherwise this field is ignored) tolerates the taint. + By default, it is not set, which means tolerate the + taint forever (do not evict). Zero and negative values + will be treated as 0 (evict immediately) by the system. + format: int64 + type: integer + value: + description: Value is the taint value the toleration matches + to. If the operator is Exists, the value should be empty, + otherwise just a regular string. + type: string + type: object + type: array type: object type: object - paused: - description: Indicates that the BackupConfiguration is paused from taking - backup. Default value is 'false' - type: boolean - repository: - description: Repository refer to the Repository crd that holds backend - information - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - type: object - retentionPolicy: - description: RetentionPolicy indicates the policy to follow to clean - old backup snapshots - properties: - dryRun: - type: boolean - keepDaily: - format: int64 - type: integer - keepHourly: - format: int64 - type: integer - keepLast: - format: int64 - type: integer - keepMonthly: - format: int64 - type: integer - keepTags: - items: - type: string - type: array - keepWeekly: - format: int64 - type: integer - keepYearly: - format: int64 - type: integer - name: - type: string - prune: - type: boolean - required: - - name - - prune - type: object schedule: description: Schedule specifies the schedule for invoking backup sessions type: string diff --git a/api/crds/stash.appscode.com_backupsessions.yaml b/api/crds/stash.appscode.com_backupsessions.yaml index 468b2b551..1e4d070d9 100644 --- a/api/crds/stash.appscode.com_backupsessions.yaml +++ b/api/crds/stash.appscode.com_backupsessions.yaml @@ -78,87 +78,109 @@ spec: type: string sessionDuration: description: SessionDuration specify total time taken to complete current - backup session (sum of backup duration of all hosts) + backup session (sum of backup duration of all targets) type: string - stats: - description: Stats shows statistics of individual hosts for this backup - session + targets: + description: Targets specify the backup status of individual targets + optional items: properties: - duration: - description: Duration indicates total time taken to complete backup - for this hosts - type: string - error: - description: Error indicates string value of error in case of - backup failure - type: string - hostname: - description: Hostname indicate name of the host that has been - backed up - type: string phase: - description: Phase indicates backup phase of this host + description: Phase indicates backup phase of this target type: string - snapshots: - description: Snapshots specifies the stats of individual snapshots - that has been taken for this host in current backup session + ref: + description: Ref refers to the backup target + properties: + apiVersion: + type: string + kind: + type: string + name: + type: string + type: object + stats: + description: Stats shows statistics of individual hosts for this + backup session items: properties: - fileStats: - description: FileStats shows statistics of files of this - snapshot - properties: - modifiedFiles: - description: ModifiedFiles shows total number of files - that has been modified since last backup - format: int64 - type: integer - newFiles: - description: NewFiles shows total number of new files - that has been created since last backup - format: int64 - type: integer - totalFiles: - description: TotalFiles shows total number of files - that has been backed up - format: int64 - type: integer - unmodifiedFiles: - description: UnmodifiedFiles shows total number of files - that has not been changed since last backup - format: int64 - type: integer - type: object - name: - description: Name indicates the name of the backup snapshot - created for this host - type: string - path: - description: Path indicates the directory that has been - backed up in this snapshot + duration: + description: Duration indicates total time taken to complete + backup for this hosts type: string - processingTime: - description: ProcessingTime indicates time taken to process - the target data + error: + description: Error indicates string value of error in case + of backup failure type: string - totalSize: - description: TotalSize indicates the size of data to backup - in target directory + hostname: + description: Hostname indicate name of the host that has + been backed up type: string - uploaded: - description: Uploaded indicates size of data uploaded to - backend for this snapshot + phase: + description: Phase indicates backup phase of this host type: string + snapshots: + description: Snapshots specifies the stats of individual + snapshots that has been taken for this host in current + backup session + items: + properties: + fileStats: + description: FileStats shows statistics of files of + this snapshot + properties: + modifiedFiles: + description: ModifiedFiles shows total number + of files that has been modified since last backup + format: int64 + type: integer + newFiles: + description: NewFiles shows total number of new + files that has been created since last backup + format: int64 + type: integer + totalFiles: + description: TotalFiles shows total number of + files that has been backed up + format: int64 + type: integer + unmodifiedFiles: + description: UnmodifiedFiles shows total number + of files that has not been changed since last + backup + format: int64 + type: integer + type: object + name: + description: Name indicates the name of the backup + snapshot created for this host + type: string + path: + description: Path indicates the directory that has + been backed up in this snapshot + type: string + processingTime: + description: ProcessingTime indicates time taken to + process the target data + type: string + totalSize: + description: TotalSize indicates the size of data + to backup in target directory + type: string + uploaded: + description: Uploaded indicates size of data uploaded + to backend for this snapshot + type: string + type: object + type: array type: object type: array + totalHosts: + description: TotalHosts specifies total number of hosts for this + target that will be backed up for a BackupSession + format: int32 + type: integer type: object type: array - totalHosts: - description: TotalHosts specifies total number of hosts that will be - backed up for this BackupSession - format: int32 - type: integer type: object type: object version: v1beta1 diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 76c9288b0..44ea9aeae 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -10128,13 +10128,6 @@ "retentionPolicy" ], "properties": { - "backupConfigurationTemplates": { - "description": "backupConfigurationTemplates is a list of backup configurations that are part of this batch", - "type": "array", - "items": { - "$ref": "#/definitions/dev.appscode.stash.stash.apis.stash.v1beta1.BackupConfigurationTemplate" - } - }, "backupHistoryLimit": { "description": "BackupHistoryLimit specifies the number of BackupSession and it's associate resources to keep. This is helpful for debugging purpose. Default: 1", "type": "integer", @@ -10148,6 +10141,13 @@ "description": "Actions that Stash should take in response to backup sessions. Cannot be updated.", "$ref": "#/definitions/dev.appscode.stash.stash.apis.stash.v1beta1.BackupHooks" }, + "members": { + "description": "members is a list of backup configurations that are part of this batch", + "type": "array", + "items": { + "$ref": "#/definitions/dev.appscode.stash.stash.apis.stash.v1beta1.BackupConfigurationTemplateSpec" + } + }, "paused": { "description": "Indicates that the BackupConfiguration is paused from taking backup. Default value is 'false'", "type": "boolean" @@ -10160,6 +10160,10 @@ "description": "RetentionPolicy indicates the policy to follow to clean old backup snapshots", "$ref": "#/definitions/dev.appscode.stash.stash.apis.stash.v1alpha1.RetentionPolicy" }, + "runtimeSettings": { + "description": "RuntimeSettings allow to specify Resources, NodeSelector, Affinity, Toleration, ReadinessProbe etc, and used to create service account for CronJob.", + "$ref": "#/definitions/xyz.kmodules.offshoot-api.api.v1.RuntimeSettings" + }, "schedule": { "description": "Schedule specifies the schedule for invoking backup sessions", "type": "string" @@ -10400,25 +10404,6 @@ } } }, - "dev.appscode.stash.stash.apis.stash.v1beta1.BackupConfigurationTemplate": { - "type": "object", - "properties": { - "apiVersion": { - "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - "type": "string" - }, - "kind": { - "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - "type": "string" - }, - "metadata": { - "$ref": "#/definitions/xyz.kmodules.offshoot-api.api.v1.PartialObjectMeta" - }, - "spec": { - "$ref": "#/definitions/dev.appscode.stash.stash.apis.stash.v1beta1.BackupConfigurationTemplateSpec" - } - } - }, "dev.appscode.stash.stash.apis.stash.v1beta1.BackupConfigurationTemplateSpec": { "type": "object", "properties": { @@ -10559,20 +10544,15 @@ "type": "string" }, "sessionDuration": { - "description": "SessionDuration specify total time taken to complete current backup session (sum of backup duration of all hosts)", + "description": "SessionDuration specify total time taken to complete current backup session (sum of backup duration of all targets)", "type": "string" }, - "stats": { - "description": "Stats shows statistics of individual hosts for this backup session", + "targets": { + "description": "Targets specify the backup status of individual targets optional", "type": "array", "items": { - "$ref": "#/definitions/dev.appscode.stash.stash.apis.stash.v1beta1.HostBackupStats" + "$ref": "#/definitions/dev.appscode.stash.stash.apis.stash.v1beta1.Target" } - }, - "totalHosts": { - "description": "TotalHosts specifies total number of hosts that will be backed up for this BackupSession", - "type": "integer", - "format": "int32" } } }, @@ -11074,6 +11054,31 @@ } } }, + "dev.appscode.stash.stash.apis.stash.v1beta1.Target": { + "type": "object", + "properties": { + "phase": { + "description": "Phase indicates backup phase of this target", + "type": "string" + }, + "ref": { + "description": "Ref refers to the backup target", + "$ref": "#/definitions/dev.appscode.stash.stash.apis.stash.v1beta1.TargetRef" + }, + "stats": { + "description": "Stats shows statistics of individual hosts for this backup session", + "type": "array", + "items": { + "$ref": "#/definitions/dev.appscode.stash.stash.apis.stash.v1beta1.HostBackupStats" + } + }, + "totalHosts": { + "description": "TotalHosts specifies total number of hosts for this target that will be backed up for a BackupSession", + "type": "integer", + "format": "int32" + } + } + }, "dev.appscode.stash.stash.apis.stash.v1beta1.TargetRef": { "type": "object", "properties": { diff --git a/apis/constants.go b/apis/constants.go index 063126b03..88d52d4bb 100644 --- a/apis/constants.go +++ b/apis/constants.go @@ -16,6 +16,8 @@ limitations under the License. package apis +import "time" + const ( StashDockerRegistry = "STASH_DOCKER_REGISTRY" StashDockerImage = "STASH_DOCKER_IMAGE" @@ -92,3 +94,54 @@ const ( PreTaskHook = "pre-task-hook" PostTaskHook = "post-task-hook" ) + +const ( + StashContainer = "stash" + StashInitContainer = "stash-init" + LocalVolumeName = "stash-local" + ScratchDirVolumeName = "stash-scratchdir" + TmpDirVolumeName = "tmp-dir" + TmpDirMountPath = "/tmp" + PodinfoVolumeName = "stash-podinfo" + + RecoveryJobPrefix = "stash-recovery-" + ScaledownCronPrefix = "stash-scaledown-cron-" + CheckJobPrefix = "stash-check-" + + AnnotationRestic = "restic" + AnnotationRecovery = "recovery" + AnnotationOperation = "operation" + AnnotationOldReplica = "old-replica" + + OperationRecovery = "recovery" + OperationCheck = "check" + + AppLabelStash = "stash" + AppLabelStashV1Beta1 = "stash-v1beta1" + OperationScaleDown = "scale-down" + + RepositoryFinalizer = "stash" + SnapshotIDLength = 8 + + ModelSidecar = "sidecar" + ModelCronJob = "cronjob" + LabelApp = "app" + LabelInvokerType = StashKey + "/invoker-type" + LabelInvokerName = StashKey + "/invoker-name" + StashSecretVolume = "stash-secret-volume" + StashSecretMountDir = "/etc/stash/repository/secret" + + KeyPodName = "POD_NAME" + KeyNodeName = "NODE_NAME" + KeyPodOrdinal = "POD_ORDINAL" + + RetryInterval = 50 * time.Millisecond + ReadinessTimeout = 2 * time.Minute +) + +const ( + CallerWebhook = "webhook" + CallerController = "controller" + PushgatewayLocalURL = "http://localhost:56789" + DefaultHost = "host-0" +) diff --git a/apis/invoker.go b/apis/invoker.go new file mode 100644 index 000000000..195f68ca9 --- /dev/null +++ b/apis/invoker.go @@ -0,0 +1,180 @@ +/* +Copyright The Stash Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package apis + +import ( + "fmt" + + "stash.appscode.dev/stash/apis/stash/v1alpha1" + "stash.appscode.dev/stash/apis/stash/v1beta1" + cs "stash.appscode.dev/stash/client/clientset/versioned" + stash_scheme "stash.appscode.dev/stash/client/clientset/versioned/scheme" + v1beta1_util "stash.appscode.dev/stash/client/clientset/versioned/typed/stash/v1beta1/util" + + core "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/tools/reference" + core_util "kmodules.xyz/client-go/core/v1" + "kmodules.xyz/client-go/meta" + ofst "kmodules.xyz/offshoot-api/api/v1" +) + +type TargetInfo struct { + Task v1beta1.TaskRef + Target *v1beta1.BackupTarget + RuntimeSettings ofst.RuntimeSettings + TempDir v1beta1.EmptyDirSettings + InterimVolumeTemplate *ofst.PersistentVolumeClaim + Hooks *v1beta1.BackupHooks +} + +type Invoker struct { + ObjectMeta metav1.ObjectMeta + Labels map[string]string + Hash string + Driver v1beta1.Snapshotter + Schedule string + Paused bool + Repository string + RetentionPolicy v1alpha1.RetentionPolicy + RuntimeSettings ofst.RuntimeSettings + BackupHistoryLimit *int32 + TargetsInfo []TargetInfo + Hooks *v1beta1.BackupHooks + ObjectRef *core.ObjectReference + OwnerRef *metav1.OwnerReference + ObjectJson []byte + AddFinalizer func() error + RemoveFinalizer func() error +} + +func ExtractBackupInvokerInfo(stashClient cs.Interface, invokerType, invokerName, namespace string) (Invoker, error) { + var invoker Invoker + switch invokerType { + case v1beta1.ResourceKindBackupBatch: + // get BackupBatch + backupBatch, err := stashClient.StashV1beta1().BackupBatches(namespace).Get(invokerName, metav1.GetOptions{}) + if err != nil { + return invoker, err + } + + invoker.ObjectMeta = backupBatch.ObjectMeta + invoker.Labels = backupBatch.OffshootLabels() + invoker.Hash = backupBatch.GetSpecHash() + invoker.Driver = backupBatch.Spec.Driver + invoker.Schedule = backupBatch.Spec.Schedule + invoker.Paused = backupBatch.Spec.Paused + invoker.Repository = backupBatch.Spec.Repository.Name + invoker.RetentionPolicy = backupBatch.Spec.RetentionPolicy + invoker.RuntimeSettings = backupBatch.Spec.RuntimeSettings + invoker.BackupHistoryLimit = backupBatch.Spec.BackupHistoryLimit + invoker.Hooks = backupBatch.Spec.Hooks + invoker.OwnerRef = metav1.NewControllerRef(backupBatch, v1beta1.SchemeGroupVersion.WithKind(v1beta1.ResourceKindBackupBatch)) + invoker.ObjectRef, err = reference.GetReference(stash_scheme.Scheme, backupBatch) + if err != nil { + return invoker, err + } + + invoker.ObjectJson, err = meta.MarshalToJson(backupBatch, v1beta1.SchemeGroupVersion) + if err != nil { + return invoker, err + } + + for _, member := range backupBatch.Spec.Members { + invoker.TargetsInfo = append(invoker.TargetsInfo, TargetInfo{ + Task: member.Task, + Target: member.Target, + RuntimeSettings: member.RuntimeSettings, + TempDir: member.TempDir, + InterimVolumeTemplate: member.InterimVolumeTemplate, + Hooks: member.Hooks, + }) + } + invoker.AddFinalizer = func() error { + _, _, err := v1beta1_util.PatchBackupBatch(stashClient.StashV1beta1(), backupBatch, func(in *v1beta1.BackupBatch) *v1beta1.BackupBatch { + in.ObjectMeta = core_util.AddFinalizer(in.ObjectMeta, v1beta1.StashKey) + return in + + }) + return err + } + invoker.RemoveFinalizer = func() error { + _, _, err := v1beta1_util.PatchBackupBatch(stashClient.StashV1beta1(), backupBatch, func(in *v1beta1.BackupBatch) *v1beta1.BackupBatch { + in.ObjectMeta = core_util.RemoveFinalizer(in.ObjectMeta, v1beta1.StashKey) + return in + + }) + return err + } + case v1beta1.ResourceKindBackupConfiguration: + // get BackupConfiguration + backupConfig, err := stashClient.StashV1beta1().BackupConfigurations(namespace).Get(invokerName, metav1.GetOptions{}) + if err != nil { + return invoker, err + } + + invoker.ObjectMeta = backupConfig.ObjectMeta + invoker.Labels = backupConfig.OffshootLabels() + invoker.Hash = backupConfig.GetSpecHash() + invoker.Driver = backupConfig.Spec.Driver + invoker.Schedule = backupConfig.Spec.Schedule + invoker.Paused = backupConfig.Spec.Paused + invoker.Repository = backupConfig.Spec.Repository.Name + invoker.RetentionPolicy = backupConfig.Spec.RetentionPolicy + invoker.RuntimeSettings = backupConfig.Spec.RuntimeSettings + invoker.BackupHistoryLimit = backupConfig.Spec.BackupHistoryLimit + invoker.OwnerRef = metav1.NewControllerRef(backupConfig, v1beta1.SchemeGroupVersion.WithKind(v1beta1.ResourceKindBackupConfiguration)) + invoker.ObjectRef, err = reference.GetReference(stash_scheme.Scheme, backupConfig) + if err != nil { + return invoker, err + } + + invoker.ObjectJson, err = meta.MarshalToJson(backupConfig, v1beta1.SchemeGroupVersion) + if err != nil { + return invoker, err + } + + invoker.TargetsInfo = append(invoker.TargetsInfo, TargetInfo{ + Task: backupConfig.Spec.Task, + Target: backupConfig.Spec.Target, + RuntimeSettings: backupConfig.Spec.RuntimeSettings, + TempDir: backupConfig.Spec.TempDir, + InterimVolumeTemplate: backupConfig.Spec.InterimVolumeTemplate, + Hooks: backupConfig.Spec.Hooks, + }) + invoker.AddFinalizer = func() error { + _, _, err := v1beta1_util.PatchBackupConfiguration(stashClient.StashV1beta1(), backupConfig, func(in *v1beta1.BackupConfiguration) *v1beta1.BackupConfiguration { + in.ObjectMeta = core_util.AddFinalizer(in.ObjectMeta, v1beta1.StashKey) + return in + + }) + return err + } + invoker.RemoveFinalizer = func() error { + _, _, err := v1beta1_util.PatchBackupConfiguration(stashClient.StashV1beta1(), backupConfig, func(in *v1beta1.BackupConfiguration) *v1beta1.BackupConfiguration { + in.ObjectMeta = core_util.RemoveFinalizer(in.ObjectMeta, v1beta1.StashKey) + return in + + }) + return err + } + + default: + return invoker, fmt.Errorf("failed to extract invoker info. Reason: unknown invoker") + } + return invoker, nil +} diff --git a/apis/stash/v1alpha1/workload.go b/apis/stash/v1alpha1/workload.go index a46c1b141..406d6936b 100644 --- a/apis/stash/v1alpha1/workload.go +++ b/apis/stash/v1alpha1/workload.go @@ -19,8 +19,19 @@ package v1alpha1 import ( "fmt" "strings" +) - "stash.appscode.dev/stash/apis" +const ( + KindDeployment = "Deployment" + KindReplicaSet = "ReplicaSet" + KindReplicationController = "ReplicationController" + KindStatefulSet = "StatefulSet" + KindDaemonSet = "DaemonSet" + KindPod = "Pod" + KindPersistentVolumeClaim = "PersistentVolumeClaim" + KindAppBinding = "AppBinding" + KindDeploymentConfig = "DeploymentConfig" + KindSecret = "Secret" ) // LocalTypedReference contains enough information to let you inspect or modify the referred object. @@ -44,15 +55,15 @@ func (workload *LocalTypedReference) Canonicalize() error { } switch strings.ToLower(workload.Kind) { case "deployments", "deployment", "deploy": - workload.Kind = apis.KindDeployment + workload.Kind = KindDeployment case "replicasets", "replicaset", "rs": - workload.Kind = apis.KindReplicaSet + workload.Kind = KindReplicaSet case "replicationcontrollers", "replicationcontroller", "rc": - workload.Kind = apis.KindReplicationController + workload.Kind = KindReplicationController case "statefulsets", "statefulset": - workload.Kind = apis.KindStatefulSet + workload.Kind = KindStatefulSet case "daemonsets", "daemonset", "ds": - workload.Kind = apis.KindDaemonSet + workload.Kind = KindDaemonSet default: return fmt.Errorf(`unrecognized workload "Kind" %v`, workload.Kind) } @@ -62,11 +73,11 @@ func (workload *LocalTypedReference) Canonicalize() error { func (workload LocalTypedReference) GetRepositoryCRDName(podName, nodeName string) string { name := "" switch workload.Kind { - case apis.KindDeployment, apis.KindReplicaSet, apis.KindReplicationController: + case KindDeployment, KindReplicaSet, KindReplicationController: name = strings.ToLower(workload.Kind) + "." + workload.Name - case apis.KindStatefulSet: + case KindStatefulSet: name = strings.ToLower(workload.Kind) + "." + podName - case apis.KindDaemonSet: + case KindDaemonSet: name = strings.ToLower(workload.Kind) + "." + workload.Name + "." + nodeName } return name @@ -81,16 +92,16 @@ func (workload LocalTypedReference) HostnamePrefix(podName, nodeName string) (ho return "", "", fmt.Errorf("missing workload name or kind") } switch workload.Kind { - case apis.KindDeployment, apis.KindReplicaSet, apis.KindReplicationController: + case KindDeployment, KindReplicaSet, KindReplicationController: return workload.Name, strings.ToLower(workload.Kind) + "/" + workload.Name, nil - case apis.KindStatefulSet: + case KindStatefulSet: if podName == "" { - return "", "", fmt.Errorf("missing podName for %s", apis.KindStatefulSet) + return "", "", fmt.Errorf("missing podName for %s", KindStatefulSet) } return podName, strings.ToLower(workload.Kind) + "/" + podName, nil - case apis.KindDaemonSet: + case KindDaemonSet: if nodeName == "" { - return "", "", fmt.Errorf("missing nodeName for %s", apis.KindDaemonSet) + return "", "", fmt.Errorf("missing nodeName for %s", KindDaemonSet) } return nodeName, strings.ToLower(workload.Kind) + "/" + workload.Name + "/" + nodeName, nil default: diff --git a/apis/stash/v1beta1/annotations.go b/apis/stash/v1beta1/annotations.go index 1f4db8830..974b91d59 100644 --- a/apis/stash/v1beta1/annotations.go +++ b/apis/stash/v1beta1/annotations.go @@ -24,9 +24,10 @@ const ( KeyTargetPaths = StashKey + "/target-paths" KeyVolumeMounts = StashKey + "/volume-mounts" - KeyLastAppliedRestoreSession = StashKey + "/last-applied-restoresession" - KeyLastAppliedBackupConfiguration = StashKey + "/last-applied-backupconfiguration" + KeyLastAppliedRestoreSession = StashKey + "/last-applied-restoresession" + KeyLastAppliedBackupInvoker = StashKey + "/last-applied-backup-invoker" + KeyLastAppliedBackupInvokerKind = StashKey + "/last-applied-backup-invoker-kind" - AppliedBackupConfigurationSpecHash = StashKey + "/last-applied-backupconfiguration-hash" - AppliedRestoreSessionSpecHash = StashKey + "/last-applied-restoresession-hash" + AppliedBackupInvokerSpecHash = StashKey + "/last-applied-backup-invoker-hash" + AppliedRestoreSessionSpecHash = StashKey + "/last-applied-restoresession-hash" ) diff --git a/apis/stash/v1beta1/backup_batch_types.go b/apis/stash/v1beta1/backup_batch_types.go index 231f3dd11..c8bdd4160 100644 --- a/apis/stash/v1beta1/backup_batch_types.go +++ b/apis/stash/v1beta1/backup_batch_types.go @@ -21,6 +21,7 @@ import ( core "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + ofst "kmodules.xyz/offshoot-api/api/v1" ) const ( @@ -47,34 +48,38 @@ type BackupBatch struct { } type BackupBatchSpec struct { - // backupConfigurationTemplates is a list of backup configurations that are part of this batch + // members is a list of backup configurations that are part of this batch // +optional - BackupConfigurationTemplates []BackupConfigurationTemplate `json:"backupConfigurationTemplates,omitempty" protobuf:"bytes,1,rep,name=backupConfigurationTemplates"` + Members []BackupConfigurationTemplateSpec `json:"members,omitempty" protobuf:"bytes,1,rep,name=members"` // Schedule specifies the schedule for invoking backup sessions // +optional Schedule string `json:"schedule,omitempty" protobuf:"bytes,2,opt,name=schedule"` + // RuntimeSettings allow to specify Resources, NodeSelector, Affinity, Toleration, ReadinessProbe etc, + // and used to create service account for CronJob. + // +optional + RuntimeSettings ofst.RuntimeSettings `json:"runtimeSettings,omitempty" protobuf:"bytes,3,opt,name=runtimeSettings"` // Driver indicates the name of the agent to use to backup the target. // Supported values are "Restic", "VolumeSnapshotter". // Default value is "Restic". // +optional - Driver Snapshotter `json:"driver,omitempty" protobuf:"bytes,3,opt,name=driver,casttype=Snapshotter"` + Driver Snapshotter `json:"driver,omitempty" protobuf:"bytes,4,opt,name=driver,casttype=Snapshotter"` // Repository refer to the Repository crd that holds backend information // +optional - Repository core.LocalObjectReference `json:"repository,omitempty" protobuf:"bytes,4,opt,name=repository"` + Repository core.LocalObjectReference `json:"repository,omitempty" protobuf:"bytes,5,opt,name=repository"` // RetentionPolicy indicates the policy to follow to clean old backup snapshots - RetentionPolicy v1alpha1.RetentionPolicy `json:"retentionPolicy" protobuf:"bytes,5,opt,name=retentionPolicy"` + RetentionPolicy v1alpha1.RetentionPolicy `json:"retentionPolicy" protobuf:"bytes,6,opt,name=retentionPolicy"` // Indicates that the BackupConfiguration is paused from taking backup. Default value is 'false' // +optional - Paused bool `json:"paused,omitempty" protobuf:"varint,6,opt,name=paused"` + Paused bool `json:"paused,omitempty" protobuf:"varint,7,opt,name=paused"` // BackupHistoryLimit specifies the number of BackupSession and it's associate resources to keep. // This is helpful for debugging purpose. // Default: 1 // +optional - BackupHistoryLimit *int32 `json:"backupHistoryLimit,omitempty" protobuf:"varint,7,opt,name=backupHistoryLimit"` + BackupHistoryLimit *int32 `json:"backupHistoryLimit,omitempty" protobuf:"varint,8,opt,name=backupHistoryLimit"` // Actions that Stash should take in response to backup sessions. // Cannot be updated. // +optional - Hooks *BackupHooks `json:"hooks,omitempty" protobuf:"bytes,8,opt,name=hooks"` + Hooks *BackupHooks `json:"hooks,omitempty" protobuf:"bytes,9,opt,name=hooks"` } type BackupBatchStatus struct { diff --git a/apis/stash/v1beta1/backup_configuration_types.go b/apis/stash/v1beta1/backup_configuration_types.go index de3c46262..73dd7f650 100644 --- a/apis/stash/v1beta1/backup_configuration_types.go +++ b/apis/stash/v1beta1/backup_configuration_types.go @@ -50,14 +50,6 @@ type BackupConfiguration struct { Status BackupConfigurationStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"` } -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -type BackupConfigurationTemplate struct { - metav1.TypeMeta `json:",inline,omitempty"` - ofst.PartialObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - Spec BackupConfigurationTemplateSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"` -} - type BackupConfigurationTemplateSpec struct { // Task specify the Task crd that specifies the steps to take backup // +optional diff --git a/apis/stash/v1beta1/backup_session_types.go b/apis/stash/v1beta1/backup_session_types.go index c26866a2c..9bea2d670 100644 --- a/apis/stash/v1beta1/backup_session_types.go +++ b/apis/stash/v1beta1/backup_session_types.go @@ -68,17 +68,37 @@ const ( HostBackupFailed HostBackupPhase = "Failed" ) +type TargetPhase string + +const ( + TargetBackupSucceeded TargetPhase = "Succeeded" + TargetBackupRunning TargetPhase = "Running" + TargetBackupFailed TargetPhase = "Failed" +) + type BackupSessionStatus struct { // Phase indicates the overall phase of the backup process for this BackupSession. Phase will be "Succeeded" only if // phase of all hosts are "Succeeded". If any of the host fail to complete backup, Phase will be "Failed". // +optional Phase BackupSessionPhase `json:"phase,omitempty" protobuf:"bytes,1,opt,name=phase,casttype=BackupSessionPhase"` - // TotalHosts specifies total number of hosts that will be backed up for this BackupSession + // SessionDuration specify total time taken to complete current backup session (sum of backup duration of all targets) + // +optional + SessionDuration string `json:"sessionDuration,omitempty" protobuf:"bytes,2,opt,name=sessionDuration"` + // Targets specify the backup status of individual targets + // optional + Targets []Target `json:"targets,omitempty" protobuf:"bytes,3,rep,name=targets"` +} + +type Target struct { + // Ref refers to the backup target + // +optional + Ref TargetRef `json:"ref,omitempty" protobuf:"bytes,1,opt,name=ref"` + // TotalHosts specifies total number of hosts for this target that will be backed up for a BackupSession // +optional TotalHosts *int32 `json:"totalHosts,omitempty" protobuf:"varint,2,opt,name=totalHosts"` - // SessionDuration specify total time taken to complete current backup session (sum of backup duration of all hosts) + // Phase indicates backup phase of this target // +optional - SessionDuration string `json:"sessionDuration,omitempty" protobuf:"bytes,3,opt,name=sessionDuration"` + Phase TargetPhase `json:"phase,omitempty" protobuf:"bytes,3,opt,name=phase"` // Stats shows statistics of individual hosts for this backup session // +optional Stats []HostBackupStats `json:"stats,omitempty" protobuf:"bytes,4,rep,name=stats"` diff --git a/apis/stash/v1beta1/generated.pb.go b/apis/stash/v1beta1/generated.pb.go index cce31fef7..a8a5b0f4a 100644 --- a/apis/stash/v1beta1/generated.pb.go +++ b/apis/stash/v1beta1/generated.pb.go @@ -29,9 +29,9 @@ import ( proto "github.com/gogo/protobuf/proto" k8s_io_api_core_v1 "k8s.io/api/core/v1" - v11 "k8s.io/api/core/v1" + v12 "k8s.io/api/core/v1" resource "k8s.io/apimachinery/pkg/api/resource" - v12 "kmodules.xyz/offshoot-api/api/v1" + v11 "kmodules.xyz/offshoot-api/api/v1" v13 "kmodules.xyz/prober/api/v1" ) @@ -354,38 +354,10 @@ func (m *BackupConfigurationStatus) XXX_DiscardUnknown() { var xxx_messageInfo_BackupConfigurationStatus proto.InternalMessageInfo -func (m *BackupConfigurationTemplate) Reset() { *m = BackupConfigurationTemplate{} } -func (*BackupConfigurationTemplate) ProtoMessage() {} -func (*BackupConfigurationTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_b6a1a327c174b3d5, []int{11} -} -func (m *BackupConfigurationTemplate) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *BackupConfigurationTemplate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *BackupConfigurationTemplate) XXX_Merge(src proto.Message) { - xxx_messageInfo_BackupConfigurationTemplate.Merge(m, src) -} -func (m *BackupConfigurationTemplate) XXX_Size() int { - return m.Size() -} -func (m *BackupConfigurationTemplate) XXX_DiscardUnknown() { - xxx_messageInfo_BackupConfigurationTemplate.DiscardUnknown(m) -} - -var xxx_messageInfo_BackupConfigurationTemplate proto.InternalMessageInfo - func (m *BackupConfigurationTemplateSpec) Reset() { *m = BackupConfigurationTemplateSpec{} } func (*BackupConfigurationTemplateSpec) ProtoMessage() {} func (*BackupConfigurationTemplateSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_b6a1a327c174b3d5, []int{12} + return fileDescriptor_b6a1a327c174b3d5, []int{11} } func (m *BackupConfigurationTemplateSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -413,7 +385,7 @@ var xxx_messageInfo_BackupConfigurationTemplateSpec proto.InternalMessageInfo func (m *BackupHooks) Reset() { *m = BackupHooks{} } func (*BackupHooks) ProtoMessage() {} func (*BackupHooks) Descriptor() ([]byte, []int) { - return fileDescriptor_b6a1a327c174b3d5, []int{13} + return fileDescriptor_b6a1a327c174b3d5, []int{12} } func (m *BackupHooks) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -441,7 +413,7 @@ var xxx_messageInfo_BackupHooks proto.InternalMessageInfo func (m *BackupInvokerRef) Reset() { *m = BackupInvokerRef{} } func (*BackupInvokerRef) ProtoMessage() {} func (*BackupInvokerRef) Descriptor() ([]byte, []int) { - return fileDescriptor_b6a1a327c174b3d5, []int{14} + return fileDescriptor_b6a1a327c174b3d5, []int{13} } func (m *BackupInvokerRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -469,7 +441,7 @@ var xxx_messageInfo_BackupInvokerRef proto.InternalMessageInfo func (m *BackupSession) Reset() { *m = BackupSession{} } func (*BackupSession) ProtoMessage() {} func (*BackupSession) Descriptor() ([]byte, []int) { - return fileDescriptor_b6a1a327c174b3d5, []int{15} + return fileDescriptor_b6a1a327c174b3d5, []int{14} } func (m *BackupSession) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -497,7 +469,7 @@ var xxx_messageInfo_BackupSession proto.InternalMessageInfo func (m *BackupSessionList) Reset() { *m = BackupSessionList{} } func (*BackupSessionList) ProtoMessage() {} func (*BackupSessionList) Descriptor() ([]byte, []int) { - return fileDescriptor_b6a1a327c174b3d5, []int{16} + return fileDescriptor_b6a1a327c174b3d5, []int{15} } func (m *BackupSessionList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -525,7 +497,7 @@ var xxx_messageInfo_BackupSessionList proto.InternalMessageInfo func (m *BackupSessionSpec) Reset() { *m = BackupSessionSpec{} } func (*BackupSessionSpec) ProtoMessage() {} func (*BackupSessionSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_b6a1a327c174b3d5, []int{17} + return fileDescriptor_b6a1a327c174b3d5, []int{16} } func (m *BackupSessionSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -553,7 +525,7 @@ var xxx_messageInfo_BackupSessionSpec proto.InternalMessageInfo func (m *BackupSessionStatus) Reset() { *m = BackupSessionStatus{} } func (*BackupSessionStatus) ProtoMessage() {} func (*BackupSessionStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_b6a1a327c174b3d5, []int{18} + return fileDescriptor_b6a1a327c174b3d5, []int{17} } func (m *BackupSessionStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -581,7 +553,7 @@ var xxx_messageInfo_BackupSessionStatus proto.InternalMessageInfo func (m *BackupTarget) Reset() { *m = BackupTarget{} } func (*BackupTarget) ProtoMessage() {} func (*BackupTarget) Descriptor() ([]byte, []int) { - return fileDescriptor_b6a1a327c174b3d5, []int{19} + return fileDescriptor_b6a1a327c174b3d5, []int{18} } func (m *BackupTarget) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -609,7 +581,7 @@ var xxx_messageInfo_BackupTarget proto.InternalMessageInfo func (m *EmptyDirSettings) Reset() { *m = EmptyDirSettings{} } func (*EmptyDirSettings) ProtoMessage() {} func (*EmptyDirSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_b6a1a327c174b3d5, []int{20} + return fileDescriptor_b6a1a327c174b3d5, []int{19} } func (m *EmptyDirSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -637,7 +609,7 @@ var xxx_messageInfo_EmptyDirSettings proto.InternalMessageInfo func (m *FileStats) Reset() { *m = FileStats{} } func (*FileStats) ProtoMessage() {} func (*FileStats) Descriptor() ([]byte, []int) { - return fileDescriptor_b6a1a327c174b3d5, []int{21} + return fileDescriptor_b6a1a327c174b3d5, []int{20} } func (m *FileStats) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -665,7 +637,7 @@ var xxx_messageInfo_FileStats proto.InternalMessageInfo func (m *Function) Reset() { *m = Function{} } func (*Function) ProtoMessage() {} func (*Function) Descriptor() ([]byte, []int) { - return fileDescriptor_b6a1a327c174b3d5, []int{22} + return fileDescriptor_b6a1a327c174b3d5, []int{21} } func (m *Function) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -693,7 +665,7 @@ var xxx_messageInfo_Function proto.InternalMessageInfo func (m *FunctionList) Reset() { *m = FunctionList{} } func (*FunctionList) ProtoMessage() {} func (*FunctionList) Descriptor() ([]byte, []int) { - return fileDescriptor_b6a1a327c174b3d5, []int{23} + return fileDescriptor_b6a1a327c174b3d5, []int{22} } func (m *FunctionList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -721,7 +693,7 @@ var xxx_messageInfo_FunctionList proto.InternalMessageInfo func (m *FunctionRef) Reset() { *m = FunctionRef{} } func (*FunctionRef) ProtoMessage() {} func (*FunctionRef) Descriptor() ([]byte, []int) { - return fileDescriptor_b6a1a327c174b3d5, []int{24} + return fileDescriptor_b6a1a327c174b3d5, []int{23} } func (m *FunctionRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -749,7 +721,7 @@ var xxx_messageInfo_FunctionRef proto.InternalMessageInfo func (m *FunctionSpec) Reset() { *m = FunctionSpec{} } func (*FunctionSpec) ProtoMessage() {} func (*FunctionSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_b6a1a327c174b3d5, []int{25} + return fileDescriptor_b6a1a327c174b3d5, []int{24} } func (m *FunctionSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -777,7 +749,7 @@ var xxx_messageInfo_FunctionSpec proto.InternalMessageInfo func (m *HostBackupStats) Reset() { *m = HostBackupStats{} } func (*HostBackupStats) ProtoMessage() {} func (*HostBackupStats) Descriptor() ([]byte, []int) { - return fileDescriptor_b6a1a327c174b3d5, []int{26} + return fileDescriptor_b6a1a327c174b3d5, []int{25} } func (m *HostBackupStats) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -805,7 +777,7 @@ var xxx_messageInfo_HostBackupStats proto.InternalMessageInfo func (m *HostRestoreStats) Reset() { *m = HostRestoreStats{} } func (*HostRestoreStats) ProtoMessage() {} func (*HostRestoreStats) Descriptor() ([]byte, []int) { - return fileDescriptor_b6a1a327c174b3d5, []int{27} + return fileDescriptor_b6a1a327c174b3d5, []int{26} } func (m *HostRestoreStats) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -833,7 +805,7 @@ var xxx_messageInfo_HostRestoreStats proto.InternalMessageInfo func (m *Param) Reset() { *m = Param{} } func (*Param) ProtoMessage() {} func (*Param) Descriptor() ([]byte, []int) { - return fileDescriptor_b6a1a327c174b3d5, []int{28} + return fileDescriptor_b6a1a327c174b3d5, []int{27} } func (m *Param) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -861,7 +833,7 @@ var xxx_messageInfo_Param proto.InternalMessageInfo func (m *RestoreHooks) Reset() { *m = RestoreHooks{} } func (*RestoreHooks) ProtoMessage() {} func (*RestoreHooks) Descriptor() ([]byte, []int) { - return fileDescriptor_b6a1a327c174b3d5, []int{29} + return fileDescriptor_b6a1a327c174b3d5, []int{28} } func (m *RestoreHooks) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -889,7 +861,7 @@ var xxx_messageInfo_RestoreHooks proto.InternalMessageInfo func (m *RestoreSession) Reset() { *m = RestoreSession{} } func (*RestoreSession) ProtoMessage() {} func (*RestoreSession) Descriptor() ([]byte, []int) { - return fileDescriptor_b6a1a327c174b3d5, []int{30} + return fileDescriptor_b6a1a327c174b3d5, []int{29} } func (m *RestoreSession) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -917,7 +889,7 @@ var xxx_messageInfo_RestoreSession proto.InternalMessageInfo func (m *RestoreSessionList) Reset() { *m = RestoreSessionList{} } func (*RestoreSessionList) ProtoMessage() {} func (*RestoreSessionList) Descriptor() ([]byte, []int) { - return fileDescriptor_b6a1a327c174b3d5, []int{31} + return fileDescriptor_b6a1a327c174b3d5, []int{30} } func (m *RestoreSessionList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -945,7 +917,7 @@ var xxx_messageInfo_RestoreSessionList proto.InternalMessageInfo func (m *RestoreSessionSpec) Reset() { *m = RestoreSessionSpec{} } func (*RestoreSessionSpec) ProtoMessage() {} func (*RestoreSessionSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_b6a1a327c174b3d5, []int{32} + return fileDescriptor_b6a1a327c174b3d5, []int{31} } func (m *RestoreSessionSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -973,7 +945,7 @@ var xxx_messageInfo_RestoreSessionSpec proto.InternalMessageInfo func (m *RestoreSessionStatus) Reset() { *m = RestoreSessionStatus{} } func (*RestoreSessionStatus) ProtoMessage() {} func (*RestoreSessionStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_b6a1a327c174b3d5, []int{33} + return fileDescriptor_b6a1a327c174b3d5, []int{32} } func (m *RestoreSessionStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1001,7 +973,7 @@ var xxx_messageInfo_RestoreSessionStatus proto.InternalMessageInfo func (m *RestoreTarget) Reset() { *m = RestoreTarget{} } func (*RestoreTarget) ProtoMessage() {} func (*RestoreTarget) Descriptor() ([]byte, []int) { - return fileDescriptor_b6a1a327c174b3d5, []int{34} + return fileDescriptor_b6a1a327c174b3d5, []int{33} } func (m *RestoreTarget) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1029,7 +1001,7 @@ var xxx_messageInfo_RestoreTarget proto.InternalMessageInfo func (m *Rule) Reset() { *m = Rule{} } func (*Rule) ProtoMessage() {} func (*Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_b6a1a327c174b3d5, []int{35} + return fileDescriptor_b6a1a327c174b3d5, []int{34} } func (m *Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1057,7 +1029,7 @@ var xxx_messageInfo_Rule proto.InternalMessageInfo func (m *SnapshotStats) Reset() { *m = SnapshotStats{} } func (*SnapshotStats) ProtoMessage() {} func (*SnapshotStats) Descriptor() ([]byte, []int) { - return fileDescriptor_b6a1a327c174b3d5, []int{36} + return fileDescriptor_b6a1a327c174b3d5, []int{35} } func (m *SnapshotStats) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1082,6 +1054,34 @@ func (m *SnapshotStats) XXX_DiscardUnknown() { var xxx_messageInfo_SnapshotStats proto.InternalMessageInfo +func (m *Target) Reset() { *m = Target{} } +func (*Target) ProtoMessage() {} +func (*Target) Descriptor() ([]byte, []int) { + return fileDescriptor_b6a1a327c174b3d5, []int{36} +} +func (m *Target) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Target) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *Target) XXX_Merge(src proto.Message) { + xxx_messageInfo_Target.Merge(m, src) +} +func (m *Target) XXX_Size() int { + return m.Size() +} +func (m *Target) XXX_DiscardUnknown() { + xxx_messageInfo_Target.DiscardUnknown(m) +} + +var xxx_messageInfo_Target proto.InternalMessageInfo + func (m *TargetRef) Reset() { *m = TargetRef{} } func (*TargetRef) ProtoMessage() {} func (*TargetRef) Descriptor() ([]byte, []int) { @@ -1234,7 +1234,6 @@ func init() { proto.RegisterType((*BackupConfigurationList)(nil), "stash.appscode.dev.stash.apis.stash.v1beta1.BackupConfigurationList") proto.RegisterType((*BackupConfigurationSpec)(nil), "stash.appscode.dev.stash.apis.stash.v1beta1.BackupConfigurationSpec") proto.RegisterType((*BackupConfigurationStatus)(nil), "stash.appscode.dev.stash.apis.stash.v1beta1.BackupConfigurationStatus") - proto.RegisterType((*BackupConfigurationTemplate)(nil), "stash.appscode.dev.stash.apis.stash.v1beta1.BackupConfigurationTemplate") proto.RegisterType((*BackupConfigurationTemplateSpec)(nil), "stash.appscode.dev.stash.apis.stash.v1beta1.BackupConfigurationTemplateSpec") proto.RegisterType((*BackupHooks)(nil), "stash.appscode.dev.stash.apis.stash.v1beta1.BackupHooks") proto.RegisterType((*BackupInvokerRef)(nil), "stash.appscode.dev.stash.apis.stash.v1beta1.BackupInvokerRef") @@ -1260,6 +1259,7 @@ func init() { proto.RegisterType((*RestoreTarget)(nil), "stash.appscode.dev.stash.apis.stash.v1beta1.RestoreTarget") proto.RegisterType((*Rule)(nil), "stash.appscode.dev.stash.apis.stash.v1beta1.Rule") proto.RegisterType((*SnapshotStats)(nil), "stash.appscode.dev.stash.apis.stash.v1beta1.SnapshotStats") + proto.RegisterType((*Target)(nil), "stash.appscode.dev.stash.apis.stash.v1beta1.Target") proto.RegisterType((*TargetRef)(nil), "stash.appscode.dev.stash.apis.stash.v1beta1.TargetRef") proto.RegisterType((*Task)(nil), "stash.appscode.dev.stash.apis.stash.v1beta1.Task") proto.RegisterType((*TaskList)(nil), "stash.appscode.dev.stash.apis.stash.v1beta1.TaskList") @@ -1272,183 +1272,184 @@ func init() { } var fileDescriptor_b6a1a327c174b3d5 = []byte{ - // 2814 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0x6d, 0x8f, 0x5b, 0x47, - 0xf5, 0xcf, 0xf5, 0xda, 0xbb, 0xf6, 0xec, 0x53, 0x32, 0x49, 0x5a, 0x37, 0xff, 0xfc, 0xd7, 0x5b, - 0xa7, 0xc0, 0x8a, 0xd2, 0xeb, 0xee, 0xd2, 0x3c, 0x34, 0x4d, 0x42, 0x72, 0x77, 0x93, 0x6e, 0x4a, - 0x92, 0x9a, 0xf1, 0x66, 0xab, 0xa6, 0x4d, 0x93, 0x59, 0x7b, 0x6c, 0xdf, 0xda, 0xbe, 0xf7, 0xea, - 0xce, 0xd8, 0x65, 0x23, 0x90, 0x22, 0x81, 0x04, 0x88, 0x37, 0xf0, 0x05, 0x78, 0x89, 0xc4, 0x3b, - 0x84, 0x90, 0xfa, 0x02, 0x21, 0xca, 0xbb, 0x20, 0x21, 0x5a, 0x21, 0x44, 0x2b, 0x10, 0x2b, 0xb2, - 0x7c, 0x08, 0x44, 0x90, 0x10, 0x9a, 0x87, 0xfb, 0x68, 0x7b, 0x77, 0xed, 0x5d, 0x1c, 0x21, 0xf1, - 0x62, 0xb5, 0xf7, 0x9e, 0x39, 0x0f, 0x73, 0x66, 0xe6, 0x9c, 0xf3, 0x9b, 0x73, 0x0d, 0x5e, 0xa3, - 0x0c, 0xd3, 0xba, 0x8e, 0x1d, 0x87, 0x96, 0xed, 0x0a, 0xd1, 0x2b, 0xa4, 0x53, 0x10, 0xa4, 0x02, - 0x76, 0x4c, 0xaa, 0x1e, 0x3b, 0x8b, 0x1b, 0x84, 0xe1, 0xc5, 0x42, 0x8d, 0x58, 0xc4, 0xc5, 0x8c, - 0x54, 0x74, 0xc7, 0xb5, 0x99, 0x0d, 0x5f, 0xec, 0x16, 0xd6, 0x3d, 0x92, 0x49, 0xd5, 0xa3, 0x12, - 0x3e, 0xf1, 0x52, 0xcd, 0x64, 0xf5, 0xf6, 0x86, 0x5e, 0xb6, 0x5b, 0x85, 0x9a, 0x5d, 0xb3, 0x0b, - 0x42, 0xc7, 0x46, 0xbb, 0x2a, 0xde, 0xc4, 0x8b, 0x78, 0x92, 0xba, 0x4f, 0xe4, 0x1b, 0xe7, 0xa8, - 0x6e, 0xda, 0x7c, 0x1a, 0x85, 0xb2, 0xed, 0x92, 0x42, 0xa7, 0xcb, 0xfe, 0x89, 0x57, 0x02, 0x9e, - 0x16, 0x2e, 0xd7, 0x4d, 0x8b, 0xb8, 0x9b, 0x05, 0xa7, 0x51, 0x13, 0x42, 0x2e, 0xa1, 0x76, 0xdb, - 0x2d, 0x93, 0x81, 0xa4, 0x68, 0xa1, 0x45, 0x18, 0xee, 0x65, 0xab, 0xd0, 0x4f, 0xca, 0x6d, 0x5b, - 0xcc, 0x6c, 0x75, 0x9b, 0x39, 0xb3, 0x9b, 0x00, 0x2d, 0xd7, 0x49, 0x0b, 0x77, 0xc9, 0xbd, 0xdc, - 0x68, 0xd9, 0x95, 0x76, 0x93, 0x50, 0xfd, 0xeb, 0x9b, 0x0f, 0x0a, 0x76, 0xb5, 0x4a, 0xeb, 0xb6, - 0xcd, 0x5e, 0xe2, 0x2e, 0xf1, 0xbf, 0x1e, 0x53, 0xfb, 0x62, 0x44, 0xc2, 0x71, 0xed, 0x0d, 0xe2, - 0xf6, 0xe3, 0xbd, 0xb0, 0xb7, 0xfd, 0xc6, 0x4d, 0xa7, 0xde, 0xbd, 0xe1, 0xf9, 0x0f, 0x13, 0x60, - 0xd2, 0xc0, 0xe5, 0x46, 0xdb, 0x31, 0x30, 0x2b, 0xd7, 0xe1, 0x7d, 0x90, 0xe6, 0xeb, 0x55, 0xc1, - 0x0c, 0x67, 0xb5, 0x79, 0x6d, 0x61, 0x72, 0xe9, 0x65, 0x5d, 0xba, 0xad, 0x87, 0xdd, 0xd6, 0x9d, - 0x46, 0x4d, 0x1e, 0x09, 0xce, 0xad, 0x77, 0x16, 0xf5, 0x37, 0x37, 0xde, 0x27, 0x65, 0x76, 0x93, - 0x30, 0x6c, 0xc0, 0x47, 0x5b, 0xb9, 0x43, 0xdb, 0x5b, 0x39, 0x10, 0xd0, 0x90, 0xaf, 0x15, 0xbe, - 0x07, 0x92, 0xd4, 0x21, 0xe5, 0x6c, 0x42, 0x68, 0xbf, 0xa0, 0x0f, 0x70, 0xe2, 0xf4, 0xd0, 0x4c, - 0x4b, 0x0e, 0x29, 0x1b, 0x53, 0xca, 0x52, 0x92, 0xbf, 0x21, 0xa1, 0x17, 0x56, 0xc1, 0x38, 0x65, - 0x98, 0xb5, 0x69, 0x76, 0x4c, 0x58, 0xb8, 0x34, 0xb4, 0x05, 0xa1, 0xc5, 0x98, 0x51, 0x36, 0xc6, - 0xe5, 0x3b, 0x52, 0xda, 0xf3, 0xbf, 0xd3, 0xc0, 0x6c, 0x88, 0xfb, 0x86, 0x49, 0x19, 0x7c, 0xb7, - 0x6b, 0xf5, 0xf4, 0xbd, 0xad, 0x1e, 0x97, 0x16, 0x6b, 0x77, 0x58, 0x59, 0x4b, 0x7b, 0x94, 0xd0, - 0xca, 0xdd, 0x05, 0x29, 0x93, 0x91, 0x16, 0xcd, 0x26, 0xe6, 0xc7, 0x16, 0x26, 0x97, 0xce, 0x0d, - 0xeb, 0x98, 0x31, 0xad, 0x8c, 0xa4, 0xae, 0x73, 0x75, 0x48, 0x6a, 0xcd, 0x7f, 0x9a, 0x8a, 0x38, - 0xc4, 0x97, 0x14, 0xfe, 0x4c, 0x03, 0x27, 0x37, 0x04, 0x6d, 0xd9, 0xb6, 0xaa, 0x66, 0xad, 0xed, - 0x62, 0x66, 0xda, 0xd6, 0x1a, 0x69, 0x39, 0x4d, 0xcc, 0x08, 0xcd, 0x6a, 0x62, 0x2a, 0xab, 0x43, - 0x4c, 0xa5, 0xa7, 0x42, 0xe3, 0x05, 0x35, 0xb5, 0x93, 0x3b, 0x30, 0x51, 0xb4, 0xe3, 0x9c, 0xe0, - 0x97, 0x40, 0x9a, 0x47, 0x22, 0x0f, 0x20, 0x71, 0xca, 0x32, 0xc1, 0xaa, 0x96, 0x14, 0x1d, 0xf9, - 0x1c, 0xf0, 0x34, 0x18, 0xaf, 0xb8, 0x66, 0x87, 0xb8, 0xe2, 0xbc, 0x64, 0x8c, 0xff, 0xf7, 0xf6, - 0x7b, 0x45, 0x50, 0x9f, 0x6c, 0xe5, 0x26, 0x4b, 0x16, 0x76, 0x68, 0xdd, 0x66, 0x8c, 0xb8, 0x48, - 0x31, 0xc3, 0x77, 0x01, 0x70, 0x89, 0x63, 0x53, 0x93, 0xd9, 0xee, 0x66, 0x36, 0x29, 0x36, 0x7b, - 0x21, 0xb4, 0xd9, 0x3a, 0x4f, 0x71, 0x62, 0x6b, 0xed, 0x32, 0x6e, 0xca, 0x48, 0x40, 0xa4, 0x4a, - 0x5c, 0x62, 0x95, 0x49, 0x10, 0x22, 0xc8, 0xd7, 0x81, 0x42, 0xfa, 0xe0, 0x43, 0x0d, 0xcc, 0xba, - 0x84, 0x11, 0x8b, 0x7b, 0x56, 0xb4, 0x9b, 0x66, 0x79, 0x33, 0x9b, 0x12, 0x36, 0x2e, 0xee, 0x71, - 0xa9, 0x65, 0xbc, 0xeb, 0x28, 0xaa, 0xc4, 0x78, 0x56, 0x19, 0x9e, 0x8d, 0x0d, 0xa0, 0xb8, 0x39, - 0xf8, 0x79, 0x30, 0xee, 0xe0, 0x36, 0x25, 0x95, 0xec, 0xf8, 0xbc, 0xb6, 0x90, 0x0e, 0xe2, 0xa0, - 0x28, 0xa8, 0x48, 0x8d, 0xc2, 0x6b, 0x00, 0xca, 0xdd, 0x58, 0x35, 0x29, 0x9f, 0xfb, 0x0d, 0xb3, - 0x65, 0xb2, 0xec, 0xc4, 0xbc, 0xb6, 0x90, 0x32, 0x9e, 0xd9, 0xde, 0xca, 0x41, 0xa3, 0x6b, 0x14, - 0xf5, 0x90, 0x80, 0x6f, 0x83, 0x54, 0xdd, 0xb6, 0x1b, 0x34, 0x9b, 0x16, 0x7e, 0x0e, 0x73, 0xba, - 0x57, 0xb9, 0xbc, 0x91, 0xe1, 0x27, 0x5b, 0x3c, 0x22, 0xa9, 0x31, 0x7f, 0x0f, 0x1c, 0xe9, 0x8a, - 0x6b, 0xf8, 0x06, 0x80, 0xf6, 0x06, 0x25, 0x6e, 0x87, 0x54, 0x5e, 0x97, 0x49, 0xd1, 0xb4, 0x2d, - 0x11, 0xb5, 0x63, 0xc6, 0x09, 0xe5, 0x2b, 0x7c, 0xb3, 0x8b, 0x03, 0xf5, 0x90, 0xca, 0x7f, 0x1a, - 0xe4, 0x82, 0x66, 0x9b, 0x38, 0xae, 0x69, 0xb1, 0x11, 0x64, 0xd2, 0x8d, 0x48, 0x26, 0xbd, 0x3c, - 0x4c, 0x3a, 0xf0, 0x66, 0xdb, 0x2f, 0x9b, 0xe6, 0xff, 0xa8, 0x81, 0xa3, 0x31, 0xde, 0x11, 0x64, - 0x3a, 0x1c, 0xcd, 0x74, 0x17, 0xf6, 0xe3, 0x5a, 0x9f, 0x6c, 0xf7, 0xf1, 0x78, 0x97, 0x63, 0x22, - 0xe3, 0x7d, 0x03, 0xcc, 0x04, 0x71, 0xc8, 0x29, 0xca, 0xbd, 0x0b, 0x83, 0xc6, 0x5d, 0x58, 0x87, - 0xf1, 0x8c, 0x9a, 0xc3, 0x4c, 0x94, 0x8e, 0x62, 0xb6, 0x06, 0x4c, 0x5d, 0xeb, 0x20, 0xc9, 0x30, - 0x6d, 0xa8, 0x42, 0xf7, 0xca, 0x40, 0xab, 0xb4, 0x86, 0x69, 0x03, 0x91, 0x6a, 0xb0, 0xe9, 0x82, - 0x20, 0xf4, 0xf5, 0xcc, 0x3e, 0xc9, 0xd1, 0x66, 0x1f, 0x06, 0x66, 0x15, 0xaa, 0x2a, 0x11, 0xc6, - 0x4c, 0xab, 0x46, 0x55, 0xfe, 0x5b, 0xd4, 0xc3, 0xd8, 0x48, 0xf7, 0xd0, 0xd4, 0x3d, 0x9e, 0x72, - 0xf9, 0x5f, 0x67, 0x51, 0x47, 0x51, 0xc1, 0x90, 0xd5, 0xe8, 0x00, 0x8a, 0x9b, 0x80, 0x75, 0x30, - 0xc1, 0x48, 0xcb, 0x59, 0x31, 0x5d, 0x91, 0xf4, 0xf6, 0xee, 0xaf, 0x5c, 0xd3, 0xab, 0x2d, 0x87, - 0x6d, 0xae, 0x98, 0xae, 0x6f, 0x79, 0x56, 0x59, 0x9e, 0x58, 0x93, 0x5a, 0x91, 0xa7, 0x1e, 0x7e, - 0x57, 0x03, 0xc7, 0x4d, 0x8b, 0x11, 0xd7, 0x6c, 0xad, 0xdb, 0xcd, 0x76, 0x8b, 0x78, 0xe5, 0x4b, - 0x64, 0xce, 0xc9, 0xa5, 0xb3, 0xbb, 0xbb, 0x59, 0x24, 0x2e, 0x35, 0x29, 0x5f, 0x36, 0xa9, 0x61, - 0xb9, 0x89, 0xcd, 0x96, 0xf1, 0xdc, 0xf6, 0x56, 0xee, 0xf8, 0xf5, 0x5e, 0x9a, 0x51, 0x6f, 0x83, - 0x7d, 0x12, 0x78, 0x7a, 0xd0, 0x04, 0x9e, 0xff, 0x38, 0xe1, 0x45, 0x54, 0xa4, 0x2e, 0x8f, 0x20, - 0x11, 0x56, 0x23, 0x89, 0x70, 0x65, 0xbf, 0x60, 0xa4, 0x2f, 0xb4, 0xb4, 0x62, 0xd0, 0xf2, 0xda, - 0xbe, 0x2d, 0xed, 0x0c, 0x31, 0xb7, 0x34, 0xf0, 0x6c, 0x0f, 0xa9, 0x11, 0x24, 0x60, 0x12, 0x4d, - 0xc0, 0x97, 0xf7, 0xeb, 0x68, 0x9f, 0x24, 0xfc, 0xc3, 0x54, 0x4f, 0x07, 0x45, 0x2a, 0xfc, 0x95, - 0x06, 0x72, 0x3b, 0xc0, 0xbc, 0x50, 0x6a, 0xbe, 0x71, 0x50, 0xe8, 0x53, 0x6c, 0xfc, 0x17, 0xd4, - 0x4c, 0x73, 0xbb, 0x30, 0xa2, 0xdd, 0x66, 0xf7, 0x3f, 0x1c, 0xfa, 0xdf, 0x88, 0x43, 0xf3, 0x35, - 0xf0, 0x5c, 0xdf, 0x48, 0x3d, 0x50, 0xd0, 0xf8, 0x0f, 0x0d, 0xfc, 0xdf, 0x0e, 0x67, 0x0c, 0xbe, - 0xdf, 0x15, 0xe1, 0x5f, 0xde, 0x43, 0x51, 0xc0, 0x2e, 0x33, 0xbd, 0x7d, 0x16, 0x61, 0xfe, 0x9c, - 0x9a, 0xd6, 0x91, 0xae, 0xa1, 0x50, 0xbc, 0x5b, 0x91, 0x0c, 0x7a, 0xb0, 0x01, 0xd5, 0x0b, 0x56, - 0xfe, 0x28, 0x05, 0x76, 0x8b, 0x2f, 0x1f, 0xdd, 0x68, 0x07, 0x8c, 0x6e, 0xee, 0x82, 0x71, 0x86, - 0xdd, 0x1a, 0x61, 0xca, 0xdb, 0x57, 0x87, 0xf0, 0x76, 0x4d, 0x28, 0x30, 0x00, 0x3f, 0x87, 0xf2, - 0x19, 0x29, 0xa5, 0xbd, 0x90, 0xcb, 0xd8, 0x48, 0x91, 0x4b, 0xf2, 0x69, 0x21, 0x97, 0xd4, 0xa8, - 0x91, 0x8b, 0x7f, 0x65, 0x1c, 0x3f, 0xf0, 0x2b, 0xe3, 0xcf, 0x35, 0xaf, 0x2f, 0x26, 0xc8, 0xb0, - 0x08, 0x32, 0x8e, 0x4b, 0x24, 0x45, 0x9d, 0xc8, 0x53, 0x51, 0x47, 0x65, 0x97, 0xce, 0x73, 0x71, - 0x15, 0x5b, 0x95, 0x26, 0x71, 0x8d, 0xe9, 0xed, 0xad, 0x5c, 0xa6, 0xe8, 0x49, 0xa2, 0x40, 0x09, - 0x2c, 0x01, 0xe0, 0xd8, 0x94, 0x29, 0x95, 0x89, 0xbd, 0xab, 0x9c, 0xe1, 0xf9, 0xba, 0xe8, 0x8b, - 0xa2, 0x90, 0x9a, 0xfc, 0xb7, 0x35, 0x70, 0x58, 0x3e, 0x5e, 0xb7, 0x3a, 0x76, 0x83, 0xb8, 0x88, - 0x54, 0x79, 0x1d, 0xc2, 0x8e, 0xf9, 0xba, 0x6b, 0xab, 0xa9, 0x87, 0xea, 0xd0, 0x95, 0xe2, 0x75, - 0x41, 0x47, 0x3e, 0x07, 0x9c, 0x07, 0xc9, 0x86, 0x69, 0x55, 0x54, 0xc5, 0xf2, 0x03, 0xe8, 0xab, - 0xa6, 0x55, 0x41, 0x62, 0x84, 0x73, 0x58, 0xb8, 0x45, 0x54, 0x9d, 0xf2, 0x39, 0x6e, 0xe1, 0x16, - 0x41, 0x62, 0x24, 0xff, 0xcb, 0x04, 0x98, 0x96, 0xd3, 0x28, 0x11, 0x4a, 0x47, 0x03, 0x02, 0xef, - 0x47, 0x52, 0xd8, 0x30, 0x5d, 0x3f, 0x35, 0xd7, 0xbe, 0xf0, 0xaf, 0x1e, 0x83, 0x7f, 0x97, 0xf7, - 0x61, 0x63, 0x67, 0xe0, 0xf7, 0x7b, 0xcd, 0xeb, 0x58, 0x28, 0xfe, 0x11, 0x40, 0xbe, 0x7b, 0x51, - 0xc8, 0x77, 0x7e, 0x78, 0xe7, 0xfa, 0x80, 0xbd, 0x6f, 0xc6, 0x7c, 0x2a, 0xc9, 0x35, 0x9d, 0x30, - 0xe5, 0x49, 0x55, 0x2e, 0x5d, 0x1c, 0xc2, 0x6e, 0x70, 0xd6, 0x83, 0xbc, 0xe5, 0xd1, 0x3c, 0xf5, - 0xf9, 0x1f, 0xfb, 0xd7, 0x93, 0xc8, 0x1e, 0xc0, 0x57, 0x41, 0xca, 0xa9, 0x63, 0x4a, 0x54, 0x68, - 0x9c, 0xf2, 0xe6, 0x5e, 0xe4, 0xc4, 0x27, 0x3e, 0x6e, 0x50, 0x42, 0x82, 0x8a, 0xa4, 0x04, 0xd4, - 0x01, 0x60, 0x36, 0xc3, 0xcd, 0x55, 0x9b, 0x32, 0x2a, 0x0e, 0x5e, 0x4a, 0x46, 0xe7, 0x9a, 0x4f, - 0x45, 0x21, 0x0e, 0x78, 0x05, 0xcc, 0x52, 0xa9, 0x66, 0x45, 0x15, 0x3c, 0x15, 0x43, 0x7e, 0x9e, - 0x2f, 0x45, 0x87, 0x51, 0x9c, 0x1f, 0x62, 0x90, 0xe2, 0x67, 0x84, 0x66, 0x93, 0x43, 0x74, 0x46, - 0x56, 0xfd, 0x44, 0xc1, 0x7d, 0xa7, 0xc1, 0x3e, 0x89, 0x57, 0x24, 0x35, 0xe7, 0xff, 0x94, 0x00, - 0x53, 0xe1, 0x2a, 0x07, 0x6f, 0x83, 0x31, 0x97, 0x54, 0xd5, 0xfe, 0x9c, 0x19, 0xb0, 0x0e, 0x8b, - 0xda, 0x48, 0xaa, 0xc6, 0xa4, 0xb2, 0x35, 0x86, 0x48, 0x15, 0x71, 0x7d, 0x30, 0x07, 0x52, 0x0e, - 0x66, 0x75, 0x79, 0xe0, 0x32, 0x32, 0x07, 0x17, 0x39, 0x01, 0x49, 0x3a, 0x7c, 0x1b, 0x4c, 0x75, - 0x44, 0xc2, 0xbf, 0x69, 0xb7, 0x2d, 0xc6, 0xa3, 0x8e, 0xbb, 0x9c, 0xeb, 0x05, 0x6e, 0xd7, 0x03, - 0x3e, 0xe3, 0x98, 0xb2, 0x34, 0x15, 0x22, 0x52, 0x14, 0x51, 0x05, 0x17, 0x40, 0xda, 0x25, 0x4e, - 0xd3, 0x2c, 0x63, 0x2a, 0xea, 0x65, 0xca, 0x98, 0xe2, 0x61, 0x81, 0x14, 0x0d, 0xf9, 0xa3, 0xf0, - 0x26, 0x38, 0x42, 0x15, 0xec, 0x5e, 0x6e, 0x62, 0x4a, 0x79, 0x96, 0x13, 0x95, 0x2e, 0x63, 0xe4, - 0x94, 0xa1, 0x67, 0xa5, 0xa1, 0x52, 0x9c, 0x0d, 0x75, 0x4b, 0xe6, 0xff, 0xa9, 0x81, 0xc3, 0xf1, - 0x62, 0x0b, 0xdf, 0x00, 0xe3, 0x2d, 0x52, 0x31, 0xdb, 0x2d, 0x75, 0x06, 0x97, 0xbc, 0xb4, 0x70, - 0x53, 0x50, 0x9f, 0x6c, 0xe5, 0xe6, 0xbb, 0xbf, 0x9d, 0xe9, 0x25, 0x66, 0xbb, 0xb8, 0x46, 0x24, - 0x0f, 0x52, 0x1a, 0xe0, 0x3b, 0x20, 0x43, 0xcd, 0x07, 0x44, 0xa2, 0xdf, 0xc4, 0xee, 0x59, 0x42, - 0xf7, 0xbe, 0xaa, 0xe9, 0x5f, 0x6b, 0x63, 0x8b, 0x99, 0x6c, 0x53, 0xd6, 0xac, 0x92, 0xa7, 0x04, - 0x05, 0xfa, 0xe0, 0x25, 0x30, 0x53, 0x31, 0x29, 0xde, 0x68, 0x92, 0x65, 0xa1, 0xa7, 0x26, 0xce, - 0x6f, 0x3a, 0x68, 0x6f, 0xad, 0x44, 0x46, 0x51, 0x8c, 0x3b, 0xff, 0x17, 0x0d, 0x64, 0xae, 0x99, - 0x4d, 0x22, 0xce, 0x9b, 0x1f, 0x3e, 0x9c, 0x42, 0x15, 0x88, 0x0e, 0xc2, 0x47, 0x50, 0x51, 0x88, - 0x83, 0x6f, 0x9a, 0x45, 0x3e, 0x90, 0xdc, 0x09, 0xc1, 0x2d, 0x36, 0xed, 0x96, 0xa2, 0x21, 0x7f, - 0x14, 0x9e, 0x05, 0xd3, 0x2d, 0xbb, 0x62, 0x56, 0x4d, 0x52, 0x91, 0xec, 0x63, 0x82, 0xfd, 0xc8, - 0xf6, 0x56, 0x6e, 0xfa, 0x66, 0x78, 0x00, 0x45, 0xf9, 0xe0, 0x45, 0x30, 0xdb, 0xb6, 0xa2, 0xa2, - 0x49, 0x21, 0x7a, 0x94, 0x47, 0xe7, 0xed, 0xe8, 0x10, 0x8a, 0xf3, 0xe6, 0x7f, 0xa3, 0x81, 0xf4, - 0xb5, 0xb6, 0x55, 0x1e, 0x51, 0xdf, 0xe3, 0x9d, 0x48, 0xc9, 0x1b, 0x0c, 0xc7, 0x7a, 0xd3, 0xec, - 0x0b, 0xd1, 0x1f, 0x69, 0x60, 0xca, 0x63, 0x1a, 0x41, 0xf9, 0xb9, 0x13, 0x2d, 0x3f, 0xa7, 0x87, - 0x72, 0xa6, 0x4f, 0xe5, 0xf9, 0xbe, 0x06, 0x26, 0x3d, 0x16, 0x0e, 0x88, 0x3c, 0x00, 0xa3, 0xf5, - 0x03, 0x30, 0xf0, 0x0e, 0xbf, 0x74, 0xba, 0xd8, 0x9f, 0xce, 0xd2, 0x40, 0xd3, 0x29, 0x72, 0xd1, - 0xf0, 0x45, 0x95, 0x6b, 0x42, 0x4a, 0x63, 0xfe, 0x5f, 0xc9, 0x60, 0x61, 0x45, 0x0d, 0x3c, 0x05, - 0x52, 0x66, 0x0b, 0xd7, 0xbc, 0xf9, 0x04, 0x3e, 0x70, 0x22, 0x92, 0x63, 0xf0, 0x73, 0x60, 0xa2, - 0x6c, 0xb7, 0x5a, 0x58, 0x20, 0x33, 0x9e, 0x2f, 0x27, 0x79, 0x95, 0x5b, 0x96, 0x24, 0xe4, 0x8d, - 0xc1, 0x93, 0x20, 0x89, 0xdd, 0x9a, 0xcc, 0x95, 0x19, 0x23, 0xcd, 0xdd, 0xba, 0xe2, 0xd6, 0x28, - 0x12, 0x54, 0xb8, 0x04, 0xc0, 0x07, 0xb6, 0xdb, 0x30, 0xad, 0x9a, 0x77, 0x51, 0xc8, 0x04, 0x47, - 0xec, 0x2d, 0x7f, 0x04, 0x85, 0xb8, 0xe0, 0x35, 0x90, 0x72, 0x6c, 0x97, 0xd1, 0x6c, 0x4a, 0xac, - 0xc4, 0xf3, 0xbd, 0xd2, 0xef, 0xb2, 0x6d, 0x31, 0xcc, 0x77, 0xbf, 0x68, 0xbb, 0xa1, 0x86, 0x3b, - 0x7f, 0xe3, 0xd9, 0x9c, 0xff, 0xeb, 0xca, 0xe6, 0xe3, 0x07, 0x97, 0xcd, 0xef, 0x82, 0x69, 0xf9, - 0xbe, 0x42, 0x3a, 0x66, 0x99, 0xd0, 0xec, 0x84, 0xd0, 0x3d, 0xdf, 0x5f, 0xb7, 0x64, 0x34, 0x8e, - 0x2b, 0xe5, 0xd3, 0x61, 0x2a, 0x45, 0x51, 0x6d, 0x70, 0xb3, 0xfb, 0x46, 0x27, 0xbf, 0x51, 0x9d, - 0xdf, 0xfd, 0xaa, 0xe3, 0xaf, 0x4c, 0xfc, 0x6a, 0x77, 0x74, 0x4f, 0xd7, 0xba, 0x12, 0x38, 0xee, - 0xd8, 0x95, 0x12, 0x29, 0xb7, 0x5d, 0x93, 0x6d, 0xca, 0x8e, 0x88, 0xa8, 0x40, 0x99, 0x48, 0x8f, - 0xe8, 0x78, 0xb1, 0x17, 0x13, 0xea, 0x2d, 0x9b, 0xff, 0x30, 0x01, 0x66, 0x63, 0x50, 0x80, 0xdf, - 0x11, 0xea, 0x36, 0x65, 0xa1, 0xb0, 0xf0, 0x83, 0x75, 0x55, 0xd1, 0x91, 0xcf, 0x01, 0xcf, 0x78, - 0x98, 0x49, 0x5e, 0x12, 0xe6, 0xe3, 0x98, 0x29, 0xa4, 0x3e, 0x02, 0x98, 0x1a, 0x20, 0xe3, 0x95, - 0x44, 0xaf, 0x9c, 0x0f, 0x86, 0x33, 0xbd, 0x1a, 0x2b, 0xf1, 0xcb, 0x11, 0x65, 0x37, 0xe3, 0x91, - 0x29, 0x0a, 0xf4, 0x73, 0x97, 0x2a, 0x1e, 0xcc, 0x4a, 0x46, 0x5d, 0xf2, 0xf1, 0x95, 0xcf, 0xc1, - 0x83, 0x90, 0xb8, 0xae, 0xed, 0xaa, 0xda, 0xee, 0x9f, 0xe1, 0xab, 0x9c, 0x88, 0xe4, 0x58, 0xfe, - 0xb7, 0x1a, 0x38, 0xcc, 0x5d, 0x43, 0x84, 0x32, 0xdb, 0x25, 0xc3, 0x2c, 0xdd, 0xd9, 0xe8, 0xd2, - 0x3d, 0x1f, 0x5f, 0xba, 0xb0, 0xfe, 0xc8, 0xda, 0x85, 0xdd, 0x19, 0xdb, 0xbb, 0x3b, 0xc9, 0x1d, - 0xdc, 0xb9, 0x05, 0x52, 0x22, 0x37, 0xed, 0x21, 0x21, 0x9e, 0x02, 0xa9, 0x0e, 0x6e, 0xb6, 0xbd, - 0x69, 0xfb, 0xfa, 0xd6, 0x39, 0x11, 0xc9, 0xb1, 0xfc, 0x2f, 0x34, 0x30, 0xa5, 0xa6, 0x2e, 0x6f, - 0xcd, 0xfc, 0x8e, 0xeb, 0x12, 0x45, 0x1a, 0xe4, 0xda, 0x2c, 0xef, 0xb8, 0xbe, 0x28, 0x0a, 0xa9, - 0x81, 0xeb, 0x60, 0xd2, 0x09, 0xd6, 0x68, 0x90, 0x9b, 0xf3, 0xec, 0xf6, 0x56, 0x6e, 0xb2, 0x18, - 0xc8, 0xa2, 0xb0, 0xa2, 0xfc, 0x47, 0x09, 0x30, 0xe3, 0x6d, 0xec, 0xc8, 0x6e, 0xad, 0x38, 0x52, - 0xc2, 0xbf, 0x32, 0x50, 0x30, 0x44, 0x27, 0xdb, 0xf7, 0xda, 0x6a, 0xc6, 0xae, 0xad, 0x57, 0xf6, - 0x63, 0x64, 0xe7, 0x7b, 0xeb, 0x1f, 0x34, 0x00, 0xa3, 0x02, 0x23, 0x40, 0x0e, 0xf7, 0xa3, 0xc8, - 0xe1, 0xb5, 0x7d, 0xb8, 0xd7, 0x07, 0x3f, 0x3c, 0x9c, 0x88, 0xbb, 0x25, 0xea, 0x76, 0xd0, 0xb1, - 0xd7, 0x86, 0xef, 0xd8, 0x27, 0x0e, 0xb8, 0x63, 0xff, 0x9f, 0xfa, 0x26, 0xfc, 0x9e, 0xdf, 0x35, - 0x4d, 0xaa, 0xda, 0x37, 0xc4, 0x32, 0xef, 0xd0, 0x36, 0x5d, 0x07, 0x29, 0x97, 0x87, 0xaf, 0x82, - 0x19, 0x8b, 0x83, 0xa9, 0x6f, 0x37, 0x49, 0xb0, 0x77, 0xfc, 0x8d, 0x22, 0xa9, 0xae, 0x57, 0x3b, - 0x76, 0x7c, 0xa4, 0xed, 0xd8, 0x89, 0xa7, 0xd5, 0x8e, 0x4d, 0x8f, 0xba, 0x1d, 0x7b, 0xc7, 0x6b, - 0xc7, 0x66, 0x86, 0xb8, 0x8f, 0x84, 0xeb, 0x46, 0x8f, 0x7e, 0xec, 0x4f, 0x12, 0xe0, 0x58, 0xaf, - 0x54, 0x04, 0xcf, 0x47, 0xdb, 0x37, 0x2f, 0xc4, 0xeb, 0xe9, 0xd1, 0xa8, 0xd4, 0xd3, 0xee, 0xdf, - 0x6c, 0x44, 0xfb, 0x37, 0x17, 0x07, 0xee, 0xdf, 0x84, 0xa1, 0x47, 0x9f, 0x06, 0xce, 0xdf, 0x13, - 0x60, 0x3a, 0x12, 0x70, 0x5e, 0x07, 0x27, 0x71, 0xc0, 0x1d, 0x9c, 0x11, 0x35, 0x68, 0xb4, 0x1d, - 0x1b, 0x34, 0xdf, 0xd3, 0xc0, 0xb1, 0x4e, 0x70, 0x6e, 0x83, 0x9f, 0x26, 0xca, 0x15, 0x1e, 0xfa, - 0xfc, 0x9f, 0x54, 0xb3, 0x3c, 0xb6, 0xde, 0x43, 0x39, 0xea, 0x69, 0x92, 0x03, 0xa0, 0x24, 0xcf, - 0x3e, 0x70, 0x11, 0x4c, 0xca, 0xbc, 0x26, 0x8f, 0x96, 0x26, 0x6e, 0x63, 0x02, 0x7e, 0xac, 0x05, - 0x64, 0x14, 0xe6, 0xe1, 0x77, 0x33, 0xd9, 0x88, 0xe1, 0xaf, 0x0a, 0x66, 0xf9, 0xc9, 0xbe, 0xe4, - 0x8f, 0xa0, 0x10, 0x17, 0x7c, 0x31, 0x8e, 0xa7, 0x33, 0xaa, 0x79, 0xd3, 0x0b, 0x0f, 0xfb, 0xfd, - 0xb6, 0x64, 0xef, 0x7e, 0x5b, 0xfe, 0xcf, 0x09, 0x30, 0x1d, 0x01, 0xd8, 0x7b, 0xc0, 0x85, 0xf3, - 0x20, 0xc9, 0x85, 0xe3, 0x5f, 0x0b, 0xb8, 0x5e, 0x24, 0x46, 0x60, 0x01, 0x64, 0x44, 0x08, 0x95, - 0xcc, 0x07, 0xf2, 0xc7, 0x2d, 0x99, 0x00, 0xb7, 0xaf, 0x79, 0x03, 0x28, 0xe0, 0xe1, 0x40, 0xb7, - 0xed, 0x34, 0x6d, 0x5c, 0x21, 0x95, 0x38, 0x6e, 0xbf, 0xad, 0xe8, 0xc8, 0xe7, 0x80, 0x97, 0xc0, - 0x8c, 0xe3, 0xda, 0x65, 0x1e, 0x66, 0x56, 0x6d, 0xcd, 0xf4, 0x9b, 0x73, 0x7e, 0x4b, 0xaa, 0x18, - 0x19, 0x45, 0x31, 0x6e, 0x58, 0x03, 0x99, 0xaa, 0xd7, 0x91, 0x52, 0x95, 0x61, 0xb0, 0x00, 0xf1, - 0xfb, 0x59, 0x81, 0x5b, 0x3e, 0x09, 0x05, 0xba, 0xf3, 0xdf, 0xd2, 0x40, 0xc6, 0x0f, 0x26, 0xbe, - 0xdb, 0xd8, 0x31, 0xd7, 0xf9, 0xc9, 0x53, 0x1f, 0x90, 0x43, 0xbb, 0x7d, 0xa5, 0x78, 0x5d, 0x8d, - 0xa0, 0x10, 0xd7, 0x81, 0x7c, 0x99, 0xf9, 0xb5, 0x06, 0x44, 0x55, 0x1f, 0x01, 0xb4, 0x7d, 0x2b, - 0x02, 0x6d, 0x4f, 0x0f, 0x8c, 0x44, 0xfa, 0x76, 0xa6, 0x3e, 0xd2, 0x40, 0x9a, 0x33, 0x8c, 0x00, - 0x5b, 0xae, 0x47, 0xb1, 0xe5, 0xe2, 0xc0, 0x4e, 0xf4, 0x41, 0x94, 0xdf, 0xd1, 0xc0, 0x84, 0x42, - 0x5b, 0x4f, 0xb9, 0x1b, 0xf5, 0x53, 0xb5, 0x98, 0x02, 0xd1, 0xde, 0xe5, 0xd5, 0x89, 0x38, 0xde, - 0xcf, 0xba, 0xcf, 0x0d, 0xd5, 0x84, 0xe3, 0xb5, 0x22, 0x54, 0x98, 0x88, 0x23, 0x0a, 0x13, 0x71, - 0x28, 0xbc, 0x0a, 0x26, 0x64, 0xda, 0xf4, 0x1c, 0x39, 0xd1, 0xbf, 0x54, 0x04, 0x90, 0x47, 0xbe, - 0x53, 0xe4, 0xc9, 0x1a, 0x2f, 0x3d, 0x7a, 0x3c, 0x77, 0xe8, 0x93, 0xc7, 0x73, 0x87, 0x3e, 0x7b, - 0x3c, 0x77, 0xe8, 0xe1, 0xf6, 0x9c, 0xf6, 0x68, 0x7b, 0x4e, 0xfb, 0x64, 0x7b, 0x4e, 0xfb, 0x6c, - 0x7b, 0x4e, 0xfb, 0xeb, 0xf6, 0x9c, 0xf6, 0x83, 0xbf, 0xcd, 0x1d, 0xba, 0x33, 0xa1, 0xe6, 0xf5, - 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0xbc, 0x8a, 0x05, 0xdb, 0x11, 0x33, 0x00, 0x00, + // 2826 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0xdb, 0x8f, 0x5b, 0x47, + 0x19, 0xcf, 0xf1, 0xfa, 0x3a, 0x7b, 0x4b, 0x26, 0x49, 0xeb, 0x46, 0x65, 0xbd, 0x75, 0xb8, 0xac, + 0x68, 0x6b, 0x77, 0x97, 0x36, 0xb7, 0x26, 0x21, 0xf1, 0x6e, 0xd2, 0xa4, 0x64, 0x53, 0x33, 0xde, + 0x6c, 0xd5, 0xb4, 0xb9, 0x8c, 0xed, 0xb1, 0x7d, 0xb0, 0xcf, 0x45, 0x67, 0x8e, 0x37, 0x6c, 0x04, + 0x52, 0x24, 0x90, 0x00, 0xf1, 0x02, 0xff, 0x00, 0x8f, 0x48, 0xbc, 0xf1, 0x80, 0xd4, 0x07, 0x84, + 0x28, 0x6f, 0x41, 0x42, 0xb4, 0x42, 0x08, 0x2a, 0x10, 0x2b, 0xb2, 0xfc, 0x09, 0x3c, 0x20, 0x05, + 0x09, 0xa1, 0xb9, 0x9d, 0x9b, 0xed, 0xdd, 0xb5, 0x77, 0xe3, 0x3c, 0x44, 0x39, 0xe7, 0x9b, 0x6f, + 0xbe, 0x99, 0x6f, 0xce, 0x7c, 0xbf, 0xef, 0xf7, 0x7d, 0x5e, 0xf0, 0x36, 0x75, 0x31, 0x6d, 0x15, + 0xb0, 0x6d, 0xd3, 0x9a, 0x55, 0x27, 0x85, 0x3a, 0xd9, 0x28, 0x72, 0x51, 0x11, 0xdb, 0x3a, 0x95, + 0x8f, 0x1b, 0x8b, 0x55, 0xe2, 0xe2, 0xc5, 0x62, 0x93, 0x98, 0xc4, 0xc1, 0x2e, 0xa9, 0x17, 0x6c, + 0xc7, 0x72, 0x2d, 0xf8, 0x6a, 0xef, 0xe4, 0x82, 0x12, 0xe9, 0x54, 0x3e, 0xca, 0xc9, 0x27, 0x5e, + 0x6f, 0xea, 0x6e, 0xab, 0x5b, 0x2d, 0xd4, 0x2c, 0xa3, 0xd8, 0xb4, 0x9a, 0x56, 0x91, 0xdb, 0xa8, + 0x76, 0x1b, 0xfc, 0x8d, 0xbf, 0xf0, 0x27, 0x61, 0xfb, 0x44, 0xbe, 0x7d, 0x86, 0x16, 0x74, 0x8b, + 0x6d, 0xa3, 0x58, 0xb3, 0x1c, 0x52, 0xdc, 0xe8, 0x59, 0xff, 0xc4, 0x9b, 0xbe, 0x8e, 0x81, 0x6b, + 0x2d, 0xdd, 0x24, 0xce, 0x66, 0xd1, 0x6e, 0x37, 0xf9, 0x24, 0x87, 0x50, 0xab, 0xeb, 0xd4, 0xc8, + 0x50, 0xb3, 0x68, 0xd1, 0x20, 0x2e, 0xee, 0xb7, 0x56, 0x71, 0xd0, 0x2c, 0xa7, 0x6b, 0xba, 0xba, + 0xd1, 0xbb, 0xcc, 0xa9, 0xdd, 0x26, 0xd0, 0x5a, 0x8b, 0x18, 0xb8, 0x67, 0xde, 0x1b, 0x6d, 0xc3, + 0xaa, 0x77, 0x3b, 0x84, 0x16, 0xbe, 0xbd, 0xf9, 0xb0, 0x68, 0x35, 0x1a, 0xb4, 0x65, 0x59, 0xee, + 0xeb, 0xcc, 0x25, 0xf6, 0xaf, 0xcf, 0xd6, 0xbe, 0x1a, 0x9a, 0x61, 0x3b, 0x56, 0x95, 0x38, 0x83, + 0x74, 0xcf, 0xef, 0xed, 0x7b, 0xe3, 0x8e, 0xdd, 0xea, 0xfd, 0xe0, 0xf9, 0x8f, 0x63, 0x60, 0xb2, + 0x84, 0x6b, 0xed, 0xae, 0x5d, 0xc2, 0x6e, 0xad, 0x05, 0xef, 0x83, 0x34, 0x3b, 0xaf, 0x3a, 0x76, + 0x71, 0x56, 0x9b, 0xd7, 0x16, 0x26, 0x97, 0xde, 0x28, 0x08, 0xb7, 0x0b, 0x41, 0xb7, 0x0b, 0x76, + 0xbb, 0x29, 0xae, 0x04, 0xd3, 0x2e, 0x6c, 0x2c, 0x16, 0xde, 0xab, 0x7e, 0x8b, 0xd4, 0xdc, 0x55, + 0xe2, 0xe2, 0x12, 0x7c, 0xbc, 0x95, 0x3b, 0xb4, 0xbd, 0x95, 0x03, 0xbe, 0x0c, 0x79, 0x56, 0xe1, + 0x5d, 0x10, 0xa7, 0x36, 0xa9, 0x65, 0x63, 0xdc, 0xfa, 0xf9, 0xc2, 0x10, 0x37, 0xae, 0x10, 0xd8, + 0x69, 0xc5, 0x26, 0xb5, 0xd2, 0x94, 0x5c, 0x29, 0xce, 0xde, 0x10, 0xb7, 0x0b, 0x1b, 0x20, 0x49, + 0x5d, 0xec, 0x76, 0x69, 0x76, 0x82, 0xaf, 0x70, 0x71, 0xe4, 0x15, 0xb8, 0x95, 0xd2, 0x8c, 0x5c, + 0x23, 0x29, 0xde, 0x91, 0xb4, 0x9e, 0xff, 0xa3, 0x06, 0x66, 0x03, 0xda, 0x37, 0x74, 0xea, 0xc2, + 0x8f, 0x7a, 0x4e, 0xaf, 0xb0, 0xb7, 0xd3, 0x63, 0xb3, 0xf9, 0xd9, 0x1d, 0x96, 0xab, 0xa5, 0x95, + 0x24, 0x70, 0x72, 0x77, 0x40, 0x42, 0x77, 0x89, 0x41, 0xb3, 0xb1, 0xf9, 0x89, 0x85, 0xc9, 0xa5, + 0x33, 0xa3, 0x3a, 0x56, 0x9a, 0x96, 0x8b, 0x24, 0xae, 0x33, 0x73, 0x48, 0x58, 0xcd, 0xff, 0x34, + 0x19, 0x72, 0x88, 0x1d, 0x29, 0x7c, 0x00, 0x52, 0x06, 0x31, 0xaa, 0xc4, 0xa1, 0x59, 0x8d, 0x2f, + 0x7a, 0x63, 0x84, 0x45, 0x97, 0x2d, 0xb3, 0xa1, 0x37, 0xbb, 0x0e, 0x76, 0x75, 0xcb, 0x5c, 0x23, + 0x86, 0xdd, 0xc1, 0x2e, 0xe1, 0xdf, 0x6f, 0x56, 0x6e, 0x24, 0xb5, 0x2a, 0x16, 0x41, 0x6a, 0x35, + 0xf8, 0x1a, 0x48, 0xb3, 0x68, 0x62, 0x41, 0xc0, 0x6f, 0x4a, 0xc6, 0x3f, 0x99, 0x8a, 0x94, 0x23, + 0x4f, 0x03, 0xba, 0x60, 0x56, 0xc6, 0x60, 0x85, 0xb8, 0xae, 0x6e, 0x36, 0xd5, 0xc7, 0x5f, 0x2c, + 0x04, 0x23, 0xa9, 0xa0, 0x62, 0xef, 0x1e, 0xb6, 0x75, 0xb6, 0x5f, 0x76, 0xf4, 0x28, 0x3c, 0xb1, + 0xf4, 0xa2, 0x5c, 0x67, 0x36, 0x32, 0x80, 0xa2, 0x4b, 0xc0, 0xb7, 0x40, 0xb2, 0xee, 0xe8, 0x1b, + 0xc4, 0xc9, 0xc6, 0xf9, 0x0e, 0xbf, 0xa0, 0x6e, 0xca, 0x0a, 0x97, 0x3e, 0xdd, 0xca, 0x4d, 0x56, + 0x4c, 0x6c, 0xd3, 0x96, 0xe5, 0xba, 0xc4, 0x41, 0x52, 0x19, 0x7e, 0x04, 0x80, 0x43, 0x6c, 0x8b, + 0xea, 0xae, 0xe5, 0x6c, 0x66, 0x13, 0x7c, 0x9f, 0x0b, 0x81, 0x6b, 0x52, 0x60, 0xe0, 0xc8, 0x2f, + 0x85, 0x55, 0xc3, 0x1d, 0x11, 0x43, 0x88, 0x34, 0x88, 0x43, 0xcc, 0x1a, 0xf1, 0x83, 0x0b, 0x79, + 0x36, 0x50, 0xc0, 0x1e, 0x7c, 0xa4, 0x81, 0x59, 0x87, 0xb8, 0xc4, 0x64, 0x87, 0x5d, 0xb6, 0x3a, + 0x7a, 0x6d, 0x33, 0x9b, 0xe4, 0x6b, 0x5c, 0xd8, 0xe3, 0xa7, 0x13, 0x48, 0x51, 0x40, 0x61, 0x23, + 0x81, 0x73, 0x09, 0x0f, 0xa0, 0xe8, 0x72, 0xf0, 0xcb, 0x20, 0x69, 0xe3, 0x2e, 0x25, 0xf5, 0x6c, + 0x6a, 0x5e, 0x5b, 0x48, 0xfb, 0x11, 0x54, 0xe6, 0x52, 0x24, 0x47, 0xe1, 0x55, 0x00, 0xab, 0xfc, + 0x82, 0x5c, 0xd3, 0x29, 0xdb, 0xfb, 0x0d, 0xdd, 0xd0, 0xdd, 0x6c, 0x7a, 0x5e, 0x5b, 0x48, 0x94, + 0x5e, 0xd8, 0xde, 0xca, 0xc1, 0x52, 0xcf, 0x28, 0xea, 0x33, 0x03, 0x7e, 0x00, 0x12, 0x2d, 0xcb, + 0x6a, 0xd3, 0x6c, 0x86, 0xfb, 0x39, 0x4a, 0x5c, 0x5c, 0x63, 0xf3, 0x4b, 0x19, 0x16, 0x13, 0xfc, + 0x11, 0x09, 0x8b, 0xf9, 0x7b, 0xe0, 0x48, 0x0f, 0x22, 0xc0, 0x77, 0x01, 0xb4, 0xaa, 0x94, 0x38, + 0x1b, 0xa4, 0xfe, 0x8e, 0x80, 0x53, 0xdd, 0x32, 0x79, 0xbc, 0x4f, 0x94, 0x4e, 0x48, 0x5f, 0xe1, + 0x7b, 0x3d, 0x1a, 0xa8, 0xcf, 0xac, 0xfc, 0x5f, 0x7d, 0x14, 0xe9, 0x74, 0x89, 0xed, 0xe8, 0xa6, + 0x3b, 0x06, 0x0c, 0xae, 0x86, 0x30, 0xf8, 0xd2, 0x28, 0x40, 0xa2, 0x76, 0x3b, 0x08, 0x87, 0xf3, + 0x7f, 0xd1, 0xc0, 0xd1, 0x88, 0xee, 0x18, 0x30, 0x12, 0x87, 0x31, 0xf2, 0xfc, 0x7e, 0x5c, 0x1b, + 0x80, 0x93, 0x9f, 0x26, 0x7b, 0x1c, 0xe3, 0x58, 0xf9, 0x1d, 0x30, 0xe3, 0xc7, 0x21, 0x93, 0x48, + 0xf7, 0xce, 0x0f, 0x1b, 0x77, 0x41, 0x1b, 0xa5, 0x17, 0xe4, 0x1e, 0x66, 0xc2, 0x72, 0x14, 0x59, + 0x6b, 0x48, 0xc0, 0x5c, 0x07, 0x71, 0x17, 0xd3, 0xb6, 0x44, 0xc9, 0x37, 0x87, 0x3a, 0xa5, 0x35, + 0x4c, 0xdb, 0x88, 0x34, 0xfc, 0x8f, 0xce, 0x05, 0xdc, 0x5e, 0x5f, 0xf4, 0x89, 0x8f, 0x17, 0x7d, + 0xfa, 0xe4, 0x82, 0xc4, 0xb3, 0xcf, 0x05, 0x2d, 0x90, 0x72, 0x89, 0x61, 0xaf, 0xe8, 0xce, 0x90, + 0x68, 0x2b, 0xce, 0xf4, 0x8a, 0x61, 0xbb, 0x9b, 0x2b, 0xba, 0xe3, 0xad, 0xec, 0x65, 0xc6, 0x35, + 0x61, 0x15, 0x29, 0xf3, 0xf0, 0x87, 0x1a, 0x38, 0xae, 0x9b, 0x2e, 0x71, 0x74, 0x63, 0xdd, 0xea, + 0x74, 0x0d, 0xa2, 0x32, 0x2a, 0x47, 0xdb, 0xc9, 0xa5, 0xd3, 0xbb, 0xbb, 0x59, 0x26, 0x0e, 0xd5, + 0x29, 0x3b, 0x36, 0x61, 0x61, 0xb9, 0x83, 0x75, 0xa3, 0xf4, 0xd2, 0xf6, 0x56, 0xee, 0xf8, 0xf5, + 0x7e, 0x96, 0x51, 0xff, 0x05, 0x0f, 0x0a, 0xc0, 0xf3, 0x9f, 0xc6, 0x54, 0x44, 0x85, 0xa8, 0xc2, + 0x18, 0x80, 0xb0, 0x11, 0x02, 0xc2, 0x95, 0xfd, 0x92, 0x9b, 0x81, 0xa4, 0xd4, 0x8c, 0x90, 0xd2, + 0xab, 0xfb, 0x5e, 0x69, 0x67, 0x72, 0xba, 0xa5, 0x81, 0x17, 0xfb, 0xcc, 0x1a, 0x03, 0x00, 0x93, + 0x30, 0x00, 0x5f, 0xda, 0xaf, 0xa3, 0x83, 0xc8, 0x6a, 0xa2, 0xaf, 0x83, 0x1c, 0x0a, 0x7f, 0xab, + 0x81, 0x5c, 0x75, 0x67, 0xe6, 0x29, 0x1d, 0x3f, 0x58, 0x36, 0xfb, 0x15, 0xb9, 0xd3, 0xdc, 0x2e, + 0x8a, 0x68, 0xb7, 0xdd, 0x0d, 0x09, 0xe6, 0x3e, 0x0f, 0x9d, 0x18, 0x9d, 0x87, 0xc6, 0xc7, 0xc0, + 0x43, 0x13, 0xcf, 0x8b, 0x87, 0x26, 0x47, 0xe0, 0xa1, 0xa9, 0xa1, 0x61, 0xac, 0x09, 0x5e, 0x1a, + 0x18, 0xa9, 0x07, 0x4a, 0x1a, 0x7f, 0x96, 0x00, 0xbb, 0xdd, 0x31, 0x2f, 0xc3, 0x6b, 0x07, 0x9c, + 0xe1, 0xef, 0x80, 0xa4, 0x8b, 0x9d, 0x26, 0x71, 0x25, 0x66, 0x9e, 0x1d, 0x21, 0x84, 0xd6, 0xb8, + 0x81, 0x12, 0x60, 0xdf, 0x42, 0x3c, 0x23, 0x69, 0xf4, 0x39, 0x55, 0x72, 0x81, 0xec, 0x1d, 0x7f, + 0x5e, 0xd9, 0x3b, 0x31, 0xee, 0xec, 0xed, 0x95, 0x4d, 0xc9, 0x03, 0x2f, 0x9b, 0x7e, 0xa5, 0xa9, + 0xae, 0x12, 0x17, 0xc3, 0x32, 0xc8, 0xd8, 0x0e, 0x11, 0x12, 0x79, 0x23, 0x4f, 0x86, 0x1d, 0x15, + 0x3d, 0x2e, 0xe5, 0xe2, 0x35, 0x6c, 0xd6, 0x3b, 0xc4, 0x29, 0x4d, 0x6f, 0x6f, 0xe5, 0x32, 0x65, + 0x35, 0x13, 0xf9, 0x46, 0x60, 0x05, 0x00, 0xdb, 0xa2, 0xae, 0x34, 0x19, 0xdb, 0xbb, 0xc9, 0x19, + 0x86, 0x59, 0x65, 0x6f, 0x2a, 0x0a, 0x98, 0xc9, 0x7f, 0x5f, 0x03, 0x87, 0xc5, 0xe3, 0x75, 0x73, + 0xc3, 0x6a, 0x13, 0x07, 0x91, 0x06, 0xc3, 0x62, 0x6c, 0xeb, 0xef, 0x38, 0x96, 0xdc, 0x7a, 0x00, + 0x8b, 0x2f, 0x97, 0xaf, 0x73, 0x39, 0xf2, 0x34, 0xe0, 0x3c, 0x88, 0xb7, 0x75, 0xb3, 0x2e, 0x51, + 0xdb, 0x0b, 0xa0, 0x6f, 0xe8, 0x66, 0x1d, 0xf1, 0x11, 0xa6, 0x61, 0x62, 0x83, 0x48, 0xac, 0xf6, + 0x34, 0x6e, 0x62, 0x83, 0x20, 0x3e, 0x92, 0xff, 0x4d, 0x0c, 0x4c, 0x8b, 0x6d, 0x54, 0x08, 0xa5, + 0xe3, 0x21, 0x42, 0xf7, 0x43, 0x44, 0x68, 0x94, 0x9e, 0x99, 0xdc, 0xeb, 0x40, 0x0a, 0xd4, 0x8a, + 0x50, 0xa0, 0x4b, 0xfb, 0x58, 0x63, 0x67, 0xf2, 0xf3, 0x27, 0x4d, 0x55, 0xed, 0x52, 0x7f, 0x0c, + 0xb4, 0xe7, 0x5e, 0x98, 0xf6, 0x9c, 0x1b, 0xdd, 0xb9, 0x01, 0x84, 0xe7, 0xbb, 0x11, 0x9f, 0x2a, + 0xe2, 0x4c, 0x53, 0xba, 0xb8, 0xa9, 0xd2, 0xa5, 0x0b, 0x23, 0xac, 0xeb, 0xdf, 0x75, 0x1f, 0xb7, + 0x94, 0x4c, 0x99, 0xcf, 0xff, 0xdb, 0xab, 0xe6, 0x43, 0xdf, 0x00, 0x9e, 0x05, 0x09, 0xbb, 0x85, + 0x29, 0x91, 0xa1, 0x71, 0x52, 0xed, 0xbd, 0xcc, 0x84, 0x4f, 0xbd, 0xdc, 0x29, 0x27, 0x71, 0x29, + 0x12, 0x33, 0xe0, 0x65, 0x30, 0x4b, 0x85, 0x78, 0x45, 0x26, 0x30, 0x19, 0x35, 0x1e, 0x6e, 0x57, + 0xc2, 0xc3, 0x28, 0xaa, 0x0f, 0xef, 0x82, 0x94, 0xc8, 0x1b, 0xec, 0x52, 0xb1, 0x73, 0xff, 0xda, + 0x90, 0x79, 0x8e, 0xe7, 0x21, 0x1f, 0xad, 0x85, 0x2d, 0xa4, 0x8c, 0xe6, 0xff, 0x16, 0x03, 0x53, + 0xc1, 0x94, 0x05, 0x6f, 0x81, 0x09, 0x87, 0x34, 0xe4, 0x61, 0x9f, 0x1a, 0x61, 0x31, 0x76, 0xca, + 0x93, 0x72, 0xbd, 0x09, 0x44, 0x1a, 0x88, 0xd9, 0x83, 0x39, 0x90, 0xb0, 0xb1, 0xdb, 0x12, 0xb7, + 0x27, 0x23, 0x00, 0xb5, 0xcc, 0x04, 0x48, 0xc8, 0xe1, 0x07, 0x60, 0x6a, 0x83, 0xa3, 0xf7, 0xaa, + 0xd5, 0x35, 0x3d, 0x6f, 0x73, 0xfd, 0xd8, 0xda, 0xba, 0xaf, 0x57, 0x3a, 0x26, 0x57, 0x9a, 0x0a, + 0x08, 0x29, 0x0a, 0x99, 0x82, 0x0b, 0x20, 0xed, 0x10, 0xbb, 0xa3, 0xd7, 0x30, 0xe5, 0xc9, 0x2f, + 0x51, 0x9a, 0x62, 0x77, 0x1c, 0x49, 0x19, 0xf2, 0x46, 0xe1, 0x2a, 0x38, 0x42, 0x25, 0x8f, 0x5c, + 0xee, 0x60, 0x4a, 0x19, 0x64, 0xf1, 0xb4, 0x95, 0x29, 0xe5, 0xe4, 0x42, 0x2f, 0x8a, 0x85, 0x2a, + 0x51, 0x35, 0xd4, 0x3b, 0x33, 0xff, 0x5f, 0x0d, 0x1c, 0x8e, 0x66, 0x4e, 0xf8, 0x2e, 0x48, 0x1a, + 0xa4, 0xae, 0x77, 0x0d, 0x79, 0xa1, 0x96, 0x54, 0x8c, 0xaf, 0x72, 0xe9, 0xd3, 0xad, 0xdc, 0x7c, + 0xef, 0xcf, 0x48, 0x85, 0x8a, 0x6b, 0x39, 0xb8, 0x49, 0x84, 0x0e, 0x92, 0x16, 0xe0, 0x87, 0x20, + 0x43, 0xf5, 0x87, 0x44, 0xd0, 0xb9, 0xd8, 0xee, 0x21, 0x5f, 0x50, 0x3f, 0x30, 0x15, 0xbe, 0xd9, + 0xc5, 0xa6, 0xab, 0xbb, 0x9b, 0x22, 0x01, 0x55, 0x94, 0x11, 0xe4, 0xdb, 0x83, 0x17, 0xc1, 0x4c, + 0x5d, 0xa7, 0xb8, 0xda, 0x21, 0xcb, 0xdc, 0x4e, 0x93, 0xc3, 0x5a, 0xda, 0xef, 0xd7, 0xac, 0x84, + 0x46, 0x51, 0x44, 0x3b, 0xff, 0x0f, 0x0d, 0x64, 0xae, 0xea, 0x1d, 0xc2, 0xe2, 0x88, 0xc2, 0x02, + 0x00, 0xae, 0xe5, 0xe2, 0x0e, 0x93, 0x50, 0xc9, 0x0a, 0x79, 0xa6, 0x5a, 0xf3, 0xa4, 0x28, 0xa0, + 0xc1, 0x3e, 0x9a, 0x49, 0x1e, 0x08, 0xed, 0x18, 0xd7, 0xe6, 0x1f, 0xed, 0xa6, 0x94, 0x21, 0x6f, + 0x14, 0x9e, 0x06, 0xd3, 0x86, 0x55, 0xd7, 0x1b, 0x3a, 0xa9, 0x0b, 0xf5, 0x09, 0xae, 0x7e, 0x64, + 0x7b, 0x2b, 0x37, 0xbd, 0x1a, 0x1c, 0x40, 0x61, 0x3d, 0x78, 0x01, 0xcc, 0x76, 0xcd, 0xf0, 0xd4, + 0x38, 0x9f, 0x7a, 0x94, 0x85, 0xe6, 0xad, 0xf0, 0x10, 0x8a, 0xea, 0xe6, 0x7f, 0xaf, 0x81, 0xf4, + 0xd5, 0xae, 0x59, 0x1b, 0x53, 0x21, 0xff, 0x61, 0x28, 0x7f, 0x0d, 0x47, 0x4a, 0xd5, 0x36, 0x07, + 0xb6, 0x32, 0x1f, 0x6b, 0x60, 0x4a, 0x29, 0x8d, 0x21, 0x97, 0xdc, 0x0e, 0xe7, 0x92, 0xb7, 0x46, + 0x72, 0x66, 0x40, 0x1a, 0xf9, 0xb1, 0x06, 0x26, 0x95, 0x0a, 0x63, 0x37, 0x8a, 0x8d, 0x68, 0x83, + 0xd8, 0x08, 0xbc, 0xcd, 0xaa, 0x28, 0x07, 0x7b, 0xdb, 0x59, 0x1a, 0x6a, 0x3b, 0x65, 0x36, 0x35, + 0x58, 0x79, 0x31, 0x4b, 0x48, 0x5a, 0xcc, 0xff, 0x2f, 0xee, 0x1f, 0x2c, 0x4f, 0x68, 0x27, 0x41, + 0x42, 0x37, 0x70, 0x53, 0xed, 0xc7, 0xf7, 0x81, 0x09, 0x91, 0x18, 0x83, 0x5f, 0x02, 0xa9, 0x9a, + 0x65, 0x18, 0x98, 0xd3, 0x2c, 0x86, 0x97, 0x93, 0x0c, 0xbc, 0x97, 0x85, 0x08, 0xa9, 0x31, 0xf8, + 0x32, 0x88, 0x63, 0xa7, 0x29, 0xb0, 0x32, 0x53, 0x4a, 0x33, 0xb7, 0x2e, 0x3b, 0x4d, 0x8a, 0xb8, + 0x14, 0x2e, 0x01, 0xf0, 0xc0, 0x72, 0xda, 0xba, 0xd9, 0x54, 0xac, 0x3f, 0xe3, 0x5f, 0xb1, 0xf7, + 0xbd, 0x11, 0x14, 0xd0, 0x82, 0x57, 0x41, 0xc2, 0xb6, 0x1c, 0x97, 0x66, 0x13, 0xfc, 0x24, 0x5e, + 0xe9, 0x07, 0xbf, 0xcb, 0x96, 0xe9, 0x62, 0xf6, 0xf5, 0xcb, 0x96, 0x13, 0xe8, 0x20, 0xb3, 0x37, + 0x86, 0xe6, 0xec, 0xbf, 0x1e, 0x34, 0x4f, 0x1e, 0x1c, 0x9a, 0xdf, 0x01, 0xd3, 0xe2, 0x7d, 0x85, + 0x6c, 0xe8, 0x35, 0x42, 0xb3, 0x29, 0x6e, 0x7b, 0x7e, 0xb0, 0x6d, 0xa1, 0x58, 0x3a, 0x2e, 0x8d, + 0x4f, 0x07, 0xa5, 0x14, 0x85, 0xad, 0xc1, 0xcd, 0xde, 0xf2, 0x2c, 0xcd, 0xef, 0xff, 0xb9, 0xdd, + 0xeb, 0x16, 0xef, 0x64, 0xa2, 0x75, 0xda, 0xd1, 0x3d, 0xd5, 0x68, 0x15, 0x70, 0xdc, 0xb6, 0xea, + 0x15, 0x52, 0xeb, 0x3a, 0xba, 0xbb, 0x29, 0x4a, 0x7c, 0x9e, 0x81, 0x32, 0xa1, 0xa6, 0xc7, 0xf1, + 0x72, 0x3f, 0x25, 0xd4, 0x7f, 0x6e, 0xfe, 0xe3, 0x18, 0x98, 0xbd, 0xe6, 0x15, 0x00, 0x02, 0x8b, + 0x5f, 0x03, 0xe9, 0x96, 0x45, 0xdd, 0x40, 0x58, 0x78, 0xc1, 0x7a, 0x4d, 0xca, 0x91, 0xa7, 0x01, + 0x4f, 0x29, 0x02, 0x24, 0xb8, 0xcb, 0x7c, 0x94, 0x00, 0x05, 0xcc, 0x87, 0xd8, 0x4f, 0x1b, 0x64, + 0x54, 0x4a, 0x54, 0xe9, 0x7c, 0x38, 0xd2, 0xa8, 0x72, 0x2c, 0xdf, 0x74, 0xe9, 0x88, 0x5c, 0x37, + 0xa3, 0xc4, 0x14, 0xf9, 0xf6, 0x99, 0x4b, 0x75, 0xc5, 0xb1, 0xe2, 0x61, 0x97, 0x3c, 0x72, 0xe5, + 0x69, 0xb0, 0x20, 0x24, 0x8e, 0x63, 0x39, 0x32, 0xb7, 0x7b, 0x77, 0xf8, 0x0a, 0x13, 0x22, 0x31, + 0x96, 0xff, 0x83, 0x06, 0x0e, 0x33, 0xd7, 0x10, 0xa1, 0xae, 0xe5, 0x90, 0x51, 0x8e, 0xee, 0x74, + 0xf8, 0xe8, 0x5e, 0x89, 0x1e, 0x5d, 0xd0, 0x7e, 0xe8, 0xec, 0x82, 0xee, 0x4c, 0xec, 0xdd, 0x9d, + 0xf8, 0x0e, 0xee, 0xdc, 0x04, 0x09, 0x8e, 0x4d, 0x7b, 0x00, 0xc4, 0x93, 0x20, 0xb1, 0x81, 0x3b, + 0x5d, 0xb5, 0x6d, 0xcf, 0xde, 0x3a, 0x13, 0x22, 0x31, 0x96, 0xff, 0xb5, 0x06, 0xa6, 0xe4, 0xd6, + 0x45, 0x09, 0xcc, 0x0a, 0x56, 0x87, 0x48, 0xd1, 0x30, 0x35, 0xb0, 0x28, 0x58, 0xbd, 0xa9, 0x28, + 0x60, 0x06, 0xae, 0x83, 0x49, 0xdb, 0x3f, 0xa3, 0x61, 0xca, 0xe0, 0xd9, 0xed, 0xad, 0xdc, 0x64, + 0xd9, 0x9f, 0x8b, 0x82, 0x86, 0xf2, 0x9f, 0xc4, 0xc0, 0x8c, 0xfa, 0xb0, 0x63, 0x2b, 0x41, 0x71, + 0x28, 0x85, 0x7f, 0x7d, 0xa8, 0x60, 0x08, 0x6f, 0x76, 0x60, 0x0d, 0xaa, 0x47, 0x6a, 0xd0, 0xcb, + 0xfb, 0x59, 0x64, 0xe7, 0x22, 0xf4, 0xcf, 0x1a, 0x80, 0xe1, 0x09, 0x63, 0x60, 0x0e, 0xf7, 0xc3, + 0xcc, 0xe1, 0xed, 0x7d, 0xb8, 0x37, 0x80, 0x3f, 0x3c, 0x4a, 0x45, 0xdd, 0xe2, 0x79, 0xdb, 0x6f, + 0x41, 0x6b, 0xa3, 0xb7, 0xa0, 0x63, 0x07, 0xdc, 0x82, 0x7e, 0x56, 0x3f, 0x72, 0xde, 0xf5, 0x5a, + 0xa0, 0x71, 0x99, 0xfb, 0x46, 0x38, 0xe6, 0x1d, 0x7a, 0xa0, 0xeb, 0x20, 0xe1, 0xb0, 0xf0, 0x95, + 0x34, 0x63, 0x71, 0x38, 0xf3, 0xdd, 0x0e, 0xf1, 0xbf, 0x1d, 0x7b, 0xa3, 0x48, 0x98, 0xeb, 0xd7, + 0x5b, 0x4d, 0x8e, 0xb5, 0xb7, 0x9a, 0x7a, 0x5e, 0xbd, 0xd5, 0xf4, 0xb8, 0x7b, 0xab, 0xb7, 0xc3, + 0x7f, 0x92, 0x72, 0x76, 0x94, 0x1b, 0x32, 0xa8, 0xb9, 0xfa, 0x8b, 0x18, 0x38, 0xd6, 0x0f, 0x8a, + 0xe0, 0xb9, 0x70, 0x2f, 0xe6, 0x8b, 0xd1, 0x7c, 0x7a, 0x34, 0x3c, 0x2b, 0x94, 0x52, 0x55, 0x01, + 0xca, 0x52, 0xae, 0x28, 0x29, 0x13, 0x81, 0x02, 0x94, 0x4b, 0x51, 0x40, 0xa3, 0x5f, 0xf3, 0x66, + 0x62, 0xc8, 0xe6, 0x4d, 0x15, 0x24, 0x18, 0x56, 0xb2, 0xb2, 0x72, 0x62, 0xe8, 0x6b, 0x11, 0xa5, + 0x1e, 0xfe, 0x95, 0xe7, 0xaf, 0x48, 0x98, 0xce, 0xff, 0x27, 0x06, 0xa6, 0x43, 0x01, 0xa7, 0x3a, + 0x38, 0xb1, 0x03, 0xee, 0xe0, 0x8c, 0xa9, 0x41, 0xa3, 0xed, 0xd8, 0xa0, 0xf9, 0x91, 0x06, 0x8e, + 0x6d, 0xf8, 0xf7, 0x56, 0xdd, 0x46, 0x75, 0xc2, 0x23, 0xdf, 0xff, 0x97, 0xe5, 0x2e, 0x8f, 0xad, + 0xf7, 0x31, 0x8e, 0xfa, 0x2e, 0xc9, 0x08, 0x50, 0x9c, 0xa1, 0x0f, 0x5c, 0x04, 0x93, 0x02, 0xd7, + 0xc4, 0xd5, 0xd2, 0x78, 0x35, 0xc6, 0xe9, 0xc7, 0x9a, 0x2f, 0x46, 0x41, 0x1d, 0x56, 0x9b, 0x89, + 0x46, 0x0c, 0x7b, 0x95, 0x34, 0xcb, 0x03, 0xfb, 0x8a, 0x37, 0x82, 0x02, 0x5a, 0xf0, 0xd5, 0x28, + 0x9f, 0xce, 0xc8, 0xe6, 0x4d, 0x3f, 0x3e, 0xec, 0xf5, 0xdb, 0xe2, 0xfd, 0xfb, 0x6d, 0xf9, 0xbf, + 0xc7, 0xc0, 0x74, 0x88, 0x60, 0xef, 0x81, 0x17, 0xce, 0x83, 0x38, 0x9b, 0x1c, 0x6d, 0xfd, 0x33, + 0xbb, 0x88, 0x8f, 0xc0, 0x22, 0xc8, 0xf0, 0x10, 0xaa, 0xe8, 0x0f, 0xc5, 0x5f, 0x6b, 0x64, 0x7c, + 0xde, 0xbe, 0xa6, 0x06, 0x90, 0xaf, 0xc3, 0x88, 0x6e, 0xd7, 0xee, 0x58, 0xb8, 0x4e, 0xea, 0x51, + 0xde, 0x7e, 0x4b, 0xca, 0x91, 0xa7, 0x01, 0x2f, 0x82, 0x19, 0xdb, 0xb1, 0x6a, 0x2c, 0xcc, 0xcc, + 0xe6, 0x9a, 0xee, 0x35, 0xe7, 0xbc, 0x96, 0x54, 0x39, 0x34, 0x8a, 0x22, 0xda, 0xb0, 0x09, 0x32, + 0x0d, 0xd5, 0x91, 0x92, 0x99, 0x61, 0xb8, 0x00, 0xf1, 0xfa, 0x59, 0xbe, 0x5b, 0x9e, 0x08, 0xf9, + 0xb6, 0xf3, 0x3f, 0x8f, 0x81, 0xe4, 0xb3, 0x6d, 0xa8, 0x0e, 0x0b, 0x67, 0x4b, 0x0a, 0x3a, 0x05, + 0x88, 0xbd, 0x1c, 0x85, 0x4e, 0x79, 0x57, 0x43, 0x90, 0x89, 0xc3, 0xf8, 0x75, 0x7e, 0x68, 0xfc, + 0x0a, 0x14, 0x9d, 0x03, 0xe0, 0xeb, 0x7b, 0x1a, 0xc8, 0x78, 0x6e, 0xb2, 0xb0, 0xc0, 0xb6, 0xbe, + 0xce, 0x42, 0x54, 0xfe, 0x74, 0x1c, 0x08, 0x8b, 0xcb, 0xe5, 0xeb, 0x72, 0x04, 0x05, 0xb4, 0x0e, + 0xe4, 0xf7, 0xa8, 0xdf, 0x69, 0x80, 0xd3, 0x9f, 0x31, 0xd4, 0x00, 0xef, 0x87, 0x6a, 0x80, 0xb7, + 0x86, 0xa6, 0x6c, 0x03, 0x5b, 0x78, 0x9f, 0x68, 0x20, 0xcd, 0x14, 0xc6, 0x40, 0xc2, 0xd7, 0xc3, + 0x24, 0x7c, 0x71, 0x68, 0x27, 0x06, 0x50, 0xef, 0x1f, 0x68, 0x20, 0x25, 0x69, 0xe9, 0x73, 0x6e, + 0xdb, 0xfd, 0x52, 0x1e, 0x26, 0xa7, 0xfe, 0x77, 0x58, 0x18, 0x10, 0x5b, 0xfd, 0x81, 0xf8, 0x99, + 0x91, 0xba, 0x95, 0x2c, 0x8a, 0x03, 0x21, 0x40, 0x6c, 0x1e, 0x02, 0xc4, 0xa6, 0xf0, 0x0a, 0x48, + 0x89, 0xfc, 0xa2, 0x1c, 0x39, 0x31, 0x38, 0xa7, 0xfa, 0xdc, 0x50, 0xbc, 0x53, 0xa4, 0xe6, 0x96, + 0x5e, 0x7f, 0xfc, 0x64, 0xee, 0xd0, 0x67, 0x4f, 0xe6, 0x0e, 0x7d, 0xfe, 0x64, 0xee, 0xd0, 0xa3, + 0xed, 0x39, 0xed, 0xf1, 0xf6, 0x9c, 0xf6, 0xd9, 0xf6, 0x9c, 0xf6, 0xf9, 0xf6, 0x9c, 0xf6, 0xcf, + 0xed, 0x39, 0xed, 0x27, 0xff, 0x9a, 0x3b, 0x74, 0x3b, 0x25, 0xf7, 0xf5, 0xff, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x69, 0x81, 0xea, 0xe5, 0x45, 0x33, 0x00, 0x00, } func (m *BackupBatch) Marshal() (dAtA []byte, err error) { @@ -1581,12 +1582,12 @@ func (m *BackupBatchSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x42 + dAtA[i] = 0x4a } if m.BackupHistoryLimit != nil { i = encodeVarintGenerated(dAtA, i, uint64(*m.BackupHistoryLimit)) i-- - dAtA[i] = 0x38 + dAtA[i] = 0x40 } i-- if m.Paused { @@ -1595,7 +1596,7 @@ func (m *BackupBatchSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0 } i-- - dAtA[i] = 0x30 + dAtA[i] = 0x38 { size, err := m.RetentionPolicy.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -1605,7 +1606,7 @@ func (m *BackupBatchSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x2a + dAtA[i] = 0x32 { size, err := m.Repository.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -1615,21 +1616,31 @@ func (m *BackupBatchSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x22 + dAtA[i] = 0x2a i -= len(m.Driver) copy(dAtA[i:], m.Driver) i = encodeVarintGenerated(dAtA, i, uint64(len(m.Driver))) i-- + dAtA[i] = 0x22 + { + size, err := m.RuntimeSettings.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- dAtA[i] = 0x1a i -= len(m.Schedule) copy(dAtA[i:], m.Schedule) i = encodeVarintGenerated(dAtA, i, uint64(len(m.Schedule))) i-- dAtA[i] = 0x12 - if len(m.BackupConfigurationTemplates) > 0 { - for iNdEx := len(m.BackupConfigurationTemplates) - 1; iNdEx >= 0; iNdEx-- { + if len(m.Members) > 0 { + for iNdEx := len(m.Members) - 1; iNdEx >= 0; iNdEx-- { { - size, err := m.BackupConfigurationTemplates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Members[iNdEx].MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -2056,49 +2067,6 @@ func (m *BackupConfigurationStatus) MarshalToSizedBuffer(dAtA []byte) (int, erro return len(dAtA) - i, nil } -func (m *BackupConfigurationTemplate) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *BackupConfigurationTemplate) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *BackupConfigurationTemplate) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size, err := m.PartialObjectMeta.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - func (m *BackupConfigurationTemplateSpec) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -2426,10 +2394,10 @@ func (m *BackupSessionStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.Stats) > 0 { - for iNdEx := len(m.Stats) - 1; iNdEx >= 0; iNdEx-- { + if len(m.Targets) > 0 { + for iNdEx := len(m.Targets) - 1; iNdEx >= 0; iNdEx-- { { - size, err := m.Stats[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Targets[iNdEx].MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -2437,19 +2405,14 @@ func (m *BackupSessionStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x22 + dAtA[i] = 0x1a } } i -= len(m.SessionDuration) copy(dAtA[i:], m.SessionDuration) i = encodeVarintGenerated(dAtA, i, uint64(len(m.SessionDuration))) i-- - dAtA[i] = 0x1a - if m.TotalHosts != nil { - i = encodeVarintGenerated(dAtA, i, uint64(*m.TotalHosts)) - i-- - dAtA[i] = 0x10 - } + dAtA[i] = 0x12 i -= len(m.Phase) copy(dAtA[i:], m.Phase) i = encodeVarintGenerated(dAtA, i, uint64(len(m.Phase))) @@ -3486,6 +3449,63 @@ func (m *SnapshotStats) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *Target) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Target) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Target) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Stats) > 0 { + for iNdEx := len(m.Stats) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Stats[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } + i -= len(m.Phase) + copy(dAtA[i:], m.Phase) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Phase))) + i-- + dAtA[i] = 0x1a + if m.TotalHosts != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.TotalHosts)) + i-- + dAtA[i] = 0x10 + } + { + size, err := m.Ref.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *TargetRef) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -3756,14 +3776,16 @@ func (m *BackupBatchSpec) Size() (n int) { } var l int _ = l - if len(m.BackupConfigurationTemplates) > 0 { - for _, e := range m.BackupConfigurationTemplates { + if len(m.Members) > 0 { + for _, e := range m.Members { l = e.Size() n += 1 + l + sovGenerated(uint64(l)) } } l = len(m.Schedule) n += 1 + l + sovGenerated(uint64(l)) + l = m.RuntimeSettings.Size() + n += 1 + l + sovGenerated(uint64(l)) l = len(m.Driver) n += 1 + l + sovGenerated(uint64(l)) l = m.Repository.Size() @@ -3914,19 +3936,6 @@ func (m *BackupConfigurationStatus) Size() (n int) { return n } -func (m *BackupConfigurationTemplate) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.PartialObjectMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - l = m.Spec.Size() - n += 1 + l + sovGenerated(uint64(l)) - return n -} - func (m *BackupConfigurationTemplateSpec) Size() (n int) { if m == nil { return 0 @@ -4037,13 +4046,10 @@ func (m *BackupSessionStatus) Size() (n int) { _ = l l = len(m.Phase) n += 1 + l + sovGenerated(uint64(l)) - if m.TotalHosts != nil { - n += 1 + sovGenerated(uint64(*m.TotalHosts)) - } l = len(m.SessionDuration) n += 1 + l + sovGenerated(uint64(l)) - if len(m.Stats) > 0 { - for _, e := range m.Stats { + if len(m.Targets) > 0 { + for _, e := range m.Targets { l = e.Size() n += 1 + l + sovGenerated(uint64(l)) } @@ -4449,6 +4455,28 @@ func (m *SnapshotStats) Size() (n int) { return n } +func (m *Target) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Ref.Size() + n += 1 + l + sovGenerated(uint64(l)) + if m.TotalHosts != nil { + n += 1 + sovGenerated(uint64(*m.TotalHosts)) + } + l = len(m.Phase) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Stats) > 0 { + for _, e := range m.Stats { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + func (m *TargetRef) Size() (n int) { if m == nil { return 0 @@ -4570,16 +4598,17 @@ func (this *BackupBatchSpec) String() string { if this == nil { return "nil" } - repeatedStringForBackupConfigurationTemplates := "[]BackupConfigurationTemplate{" - for _, f := range this.BackupConfigurationTemplates { - repeatedStringForBackupConfigurationTemplates += strings.Replace(strings.Replace(f.String(), "BackupConfigurationTemplate", "BackupConfigurationTemplate", 1), `&`, ``, 1) + "," + repeatedStringForMembers := "[]BackupConfigurationTemplateSpec{" + for _, f := range this.Members { + repeatedStringForMembers += strings.Replace(strings.Replace(f.String(), "BackupConfigurationTemplateSpec", "BackupConfigurationTemplateSpec", 1), `&`, ``, 1) + "," } - repeatedStringForBackupConfigurationTemplates += "}" + repeatedStringForMembers += "}" s := strings.Join([]string{`&BackupBatchSpec{`, - `BackupConfigurationTemplates:` + repeatedStringForBackupConfigurationTemplates + `,`, + `Members:` + repeatedStringForMembers + `,`, `Schedule:` + fmt.Sprintf("%v", this.Schedule) + `,`, + `RuntimeSettings:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.RuntimeSettings), "RuntimeSettings", "v11.RuntimeSettings", 1), `&`, ``, 1) + `,`, `Driver:` + fmt.Sprintf("%v", this.Driver) + `,`, - `Repository:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Repository), "LocalObjectReference", "v11.LocalObjectReference", 1), `&`, ``, 1) + `,`, + `Repository:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Repository), "LocalObjectReference", "v12.LocalObjectReference", 1), `&`, ``, 1) + `,`, `RetentionPolicy:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.RetentionPolicy), "RetentionPolicy", "v1alpha1.RetentionPolicy", 1), `&`, ``, 1) + `,`, `Paused:` + fmt.Sprintf("%v", this.Paused) + `,`, `BackupHistoryLimit:` + valueToStringGenerated(this.BackupHistoryLimit) + `,`, @@ -4634,9 +4663,9 @@ func (this *BackupBlueprintSpec) String() string { `Schedule:` + fmt.Sprintf("%v", this.Schedule) + `,`, `Task:` + strings.Replace(strings.Replace(this.Task.String(), "TaskRef", "TaskRef", 1), `&`, ``, 1) + `,`, `RetentionPolicy:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.RetentionPolicy), "RetentionPolicy", "v1alpha1.RetentionPolicy", 1), `&`, ``, 1) + `,`, - `RuntimeSettings:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.RuntimeSettings), "RuntimeSettings", "v12.RuntimeSettings", 1), `&`, ``, 1) + `,`, + `RuntimeSettings:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.RuntimeSettings), "RuntimeSettings", "v11.RuntimeSettings", 1), `&`, ``, 1) + `,`, `TempDir:` + strings.Replace(strings.Replace(this.TempDir.String(), "EmptyDirSettings", "EmptyDirSettings", 1), `&`, ``, 1) + `,`, - `InterimVolumeTemplate:` + strings.Replace(fmt.Sprintf("%v", this.InterimVolumeTemplate), "PersistentVolumeClaim", "v12.PersistentVolumeClaim", 1) + `,`, + `InterimVolumeTemplate:` + strings.Replace(fmt.Sprintf("%v", this.InterimVolumeTemplate), "PersistentVolumeClaim", "v11.PersistentVolumeClaim", 1) + `,`, `BackupHistoryLimit:` + valueToStringGenerated(this.BackupHistoryLimit) + `,`, `}`, }, "") @@ -4678,7 +4707,7 @@ func (this *BackupConfigurationSpec) String() string { `BackupConfigurationTemplateSpec:` + strings.Replace(strings.Replace(this.BackupConfigurationTemplateSpec.String(), "BackupConfigurationTemplateSpec", "BackupConfigurationTemplateSpec", 1), `&`, ``, 1) + `,`, `Schedule:` + fmt.Sprintf("%v", this.Schedule) + `,`, `Driver:` + fmt.Sprintf("%v", this.Driver) + `,`, - `Repository:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Repository), "LocalObjectReference", "v11.LocalObjectReference", 1), `&`, ``, 1) + `,`, + `Repository:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Repository), "LocalObjectReference", "v12.LocalObjectReference", 1), `&`, ``, 1) + `,`, `RetentionPolicy:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.RetentionPolicy), "RetentionPolicy", "v1alpha1.RetentionPolicy", 1), `&`, ``, 1) + `,`, `Paused:` + fmt.Sprintf("%v", this.Paused) + `,`, `BackupHistoryLimit:` + valueToStringGenerated(this.BackupHistoryLimit) + `,`, @@ -4696,17 +4725,6 @@ func (this *BackupConfigurationStatus) String() string { }, "") return s } -func (this *BackupConfigurationTemplate) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&BackupConfigurationTemplate{`, - `PartialObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.PartialObjectMeta), "PartialObjectMeta", "v12.PartialObjectMeta", 1), `&`, ``, 1) + `,`, - `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "BackupConfigurationTemplateSpec", "BackupConfigurationTemplateSpec", 1), `&`, ``, 1) + `,`, - `}`, - }, "") - return s -} func (this *BackupConfigurationTemplateSpec) String() string { if this == nil { return "nil" @@ -4714,9 +4732,9 @@ func (this *BackupConfigurationTemplateSpec) String() string { s := strings.Join([]string{`&BackupConfigurationTemplateSpec{`, `Task:` + strings.Replace(strings.Replace(this.Task.String(), "TaskRef", "TaskRef", 1), `&`, ``, 1) + `,`, `Target:` + strings.Replace(this.Target.String(), "BackupTarget", "BackupTarget", 1) + `,`, - `RuntimeSettings:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.RuntimeSettings), "RuntimeSettings", "v12.RuntimeSettings", 1), `&`, ``, 1) + `,`, + `RuntimeSettings:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.RuntimeSettings), "RuntimeSettings", "v11.RuntimeSettings", 1), `&`, ``, 1) + `,`, `TempDir:` + strings.Replace(strings.Replace(this.TempDir.String(), "EmptyDirSettings", "EmptyDirSettings", 1), `&`, ``, 1) + `,`, - `InterimVolumeTemplate:` + strings.Replace(fmt.Sprintf("%v", this.InterimVolumeTemplate), "PersistentVolumeClaim", "v12.PersistentVolumeClaim", 1) + `,`, + `InterimVolumeTemplate:` + strings.Replace(fmt.Sprintf("%v", this.InterimVolumeTemplate), "PersistentVolumeClaim", "v11.PersistentVolumeClaim", 1) + `,`, `Hooks:` + strings.Replace(this.Hooks.String(), "BackupHooks", "BackupHooks", 1) + `,`, `}`, }, "") @@ -4787,16 +4805,15 @@ func (this *BackupSessionStatus) String() string { if this == nil { return "nil" } - repeatedStringForStats := "[]HostBackupStats{" - for _, f := range this.Stats { - repeatedStringForStats += strings.Replace(strings.Replace(f.String(), "HostBackupStats", "HostBackupStats", 1), `&`, ``, 1) + "," + repeatedStringForTargets := "[]Target{" + for _, f := range this.Targets { + repeatedStringForTargets += strings.Replace(strings.Replace(f.String(), "Target", "Target", 1), `&`, ``, 1) + "," } - repeatedStringForStats += "}" + repeatedStringForTargets += "}" s := strings.Join([]string{`&BackupSessionStatus{`, `Phase:` + fmt.Sprintf("%v", this.Phase) + `,`, - `TotalHosts:` + valueToStringGenerated(this.TotalHosts) + `,`, `SessionDuration:` + fmt.Sprintf("%v", this.SessionDuration) + `,`, - `Stats:` + repeatedStringForStats + `,`, + `Targets:` + repeatedStringForTargets + `,`, `}`, }, "") return s @@ -4915,7 +4932,7 @@ func (this *FunctionSpec) String() string { `Ports:` + repeatedStringForPorts + `,`, `VolumeMounts:` + repeatedStringForVolumeMounts + `,`, `VolumeDevices:` + repeatedStringForVolumeDevices + `,`, - `RuntimeSettings:` + strings.Replace(fmt.Sprintf("%v", this.RuntimeSettings), "ContainerRuntimeSettings", "v12.ContainerRuntimeSettings", 1) + `,`, + `RuntimeSettings:` + strings.Replace(fmt.Sprintf("%v", this.RuntimeSettings), "ContainerRuntimeSettings", "v11.ContainerRuntimeSettings", 1) + `,`, `PodSecurityPolicyName:` + fmt.Sprintf("%v", this.PodSecurityPolicyName) + `,`, `}`, }, "") @@ -5014,13 +5031,13 @@ func (this *RestoreSessionSpec) String() string { repeatedStringForRules += "}" s := strings.Join([]string{`&RestoreSessionSpec{`, `Driver:` + fmt.Sprintf("%v", this.Driver) + `,`, - `Repository:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Repository), "LocalObjectReference", "v11.LocalObjectReference", 1), `&`, ``, 1) + `,`, + `Repository:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Repository), "LocalObjectReference", "v12.LocalObjectReference", 1), `&`, ``, 1) + `,`, `Task:` + strings.Replace(strings.Replace(this.Task.String(), "TaskRef", "TaskRef", 1), `&`, ``, 1) + `,`, `Target:` + strings.Replace(this.Target.String(), "RestoreTarget", "RestoreTarget", 1) + `,`, `Rules:` + repeatedStringForRules + `,`, - `RuntimeSettings:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.RuntimeSettings), "RuntimeSettings", "v12.RuntimeSettings", 1), `&`, ``, 1) + `,`, + `RuntimeSettings:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.RuntimeSettings), "RuntimeSettings", "v11.RuntimeSettings", 1), `&`, ``, 1) + `,`, `TempDir:` + strings.Replace(strings.Replace(this.TempDir.String(), "EmptyDirSettings", "EmptyDirSettings", 1), `&`, ``, 1) + `,`, - `InterimVolumeTemplate:` + strings.Replace(fmt.Sprintf("%v", this.InterimVolumeTemplate), "PersistentVolumeClaim", "v12.PersistentVolumeClaim", 1) + `,`, + `InterimVolumeTemplate:` + strings.Replace(fmt.Sprintf("%v", this.InterimVolumeTemplate), "PersistentVolumeClaim", "v11.PersistentVolumeClaim", 1) + `,`, `Hooks:` + strings.Replace(this.Hooks.String(), "RestoreHooks", "RestoreHooks", 1) + `,`, `}`, }, "") @@ -5095,6 +5112,24 @@ func (this *SnapshotStats) String() string { }, "") return s } +func (this *Target) String() string { + if this == nil { + return "nil" + } + repeatedStringForStats := "[]HostBackupStats{" + for _, f := range this.Stats { + repeatedStringForStats += strings.Replace(strings.Replace(f.String(), "HostBackupStats", "HostBackupStats", 1), `&`, ``, 1) + "," + } + repeatedStringForStats += "}" + s := strings.Join([]string{`&Target{`, + `Ref:` + strings.Replace(strings.Replace(this.Ref.String(), "TargetRef", "TargetRef", 1), `&`, ``, 1) + `,`, + `TotalHosts:` + valueToStringGenerated(this.TotalHosts) + `,`, + `Phase:` + fmt.Sprintf("%v", this.Phase) + `,`, + `Stats:` + repeatedStringForStats + `,`, + `}`, + }, "") + return s +} func (this *TargetRef) String() string { if this == nil { return "nil" @@ -5482,7 +5517,7 @@ func (m *BackupBatchSpec) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BackupConfigurationTemplates", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Members", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -5509,8 +5544,8 @@ func (m *BackupBatchSpec) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.BackupConfigurationTemplates = append(m.BackupConfigurationTemplates, BackupConfigurationTemplate{}) - if err := m.BackupConfigurationTemplates[len(m.BackupConfigurationTemplates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Members = append(m.Members, BackupConfigurationTemplateSpec{}) + if err := m.Members[len(m.Members)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -5547,6 +5582,39 @@ func (m *BackupBatchSpec) Unmarshal(dAtA []byte) error { m.Schedule = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RuntimeSettings", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.RuntimeSettings.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Driver", wireType) } @@ -5578,7 +5646,7 @@ func (m *BackupBatchSpec) Unmarshal(dAtA []byte) error { } m.Driver = Snapshotter(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: + case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Repository", wireType) } @@ -5611,7 +5679,7 @@ func (m *BackupBatchSpec) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 5: + case 6: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field RetentionPolicy", wireType) } @@ -5644,7 +5712,7 @@ func (m *BackupBatchSpec) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 6: + case 7: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field Paused", wireType) } @@ -5664,7 +5732,7 @@ func (m *BackupBatchSpec) Unmarshal(dAtA []byte) error { } } m.Paused = bool(v != 0) - case 7: + case 8: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field BackupHistoryLimit", wireType) } @@ -5684,7 +5752,7 @@ func (m *BackupBatchSpec) Unmarshal(dAtA []byte) error { } } m.BackupHistoryLimit = &v - case 8: + case 9: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Hooks", wireType) } @@ -6311,7 +6379,7 @@ func (m *BackupBlueprintSpec) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.InterimVolumeTemplate == nil { - m.InterimVolumeTemplate = &v12.PersistentVolumeClaim{} + m.InterimVolumeTemplate = &v11.PersistentVolumeClaim{} } if err := m.InterimVolumeTemplate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -6847,82 +6915,9 @@ func (m *BackupConfigurationSpec) Unmarshal(dAtA []byte) error { m.Paused = bool(v != 0) case 7: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field BackupHistoryLimit", wireType) - } - var v int32 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.BackupHistoryLimit = &v - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *BackupConfigurationStatus) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: BackupConfigurationStatus: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: BackupConfigurationStatus: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ObservedGeneration", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field BackupHistoryLimit", wireType) } - m.ObservedGeneration = 0 + var v int32 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -6932,11 +6927,12 @@ func (m *BackupConfigurationStatus) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.ObservedGeneration |= int64(b&0x7F) << shift + v |= int32(b&0x7F) << shift if b < 0x80 { break } } + m.BackupHistoryLimit = &v default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -6961,7 +6957,7 @@ func (m *BackupConfigurationStatus) Unmarshal(dAtA []byte) error { } return nil } -func (m *BackupConfigurationTemplate) Unmarshal(dAtA []byte) error { +func (m *BackupConfigurationStatus) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -6984,50 +6980,17 @@ func (m *BackupConfigurationTemplate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: BackupConfigurationTemplate: wiretype end group for non-group") + return fmt.Errorf("proto: BackupConfigurationStatus: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: BackupConfigurationTemplate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: BackupConfigurationStatus: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PartialObjectMeta", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.PartialObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ObservedGeneration", wireType) } - var msglen int + m.ObservedGeneration = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -7037,25 +7000,11 @@ func (m *BackupConfigurationTemplate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + m.ObservedGeneration |= int64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -7274,7 +7223,7 @@ func (m *BackupConfigurationTemplateSpec) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.InterimVolumeTemplate == nil { - m.InterimVolumeTemplate = &v12.PersistentVolumeClaim{} + m.InterimVolumeTemplate = &v11.PersistentVolumeClaim{} } if err := m.InterimVolumeTemplate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -8034,26 +7983,6 @@ func (m *BackupSessionStatus) Unmarshal(dAtA []byte) error { m.Phase = BackupSessionPhase(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalHosts", wireType) - } - var v int32 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.TotalHosts = &v - case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field SessionDuration", wireType) } @@ -8085,9 +8014,9 @@ func (m *BackupSessionStatus) Unmarshal(dAtA []byte) error { } m.SessionDuration = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Stats", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Targets", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -8114,8 +8043,8 @@ func (m *BackupSessionStatus) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Stats = append(m.Stats, HostBackupStats{}) - if err := m.Stats[len(m.Stats)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Targets = append(m.Targets, Target{}) + if err := m.Targets[len(m.Targets)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -8266,7 +8195,7 @@ func (m *BackupTarget) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.VolumeMounts = append(m.VolumeMounts, v11.VolumeMount{}) + m.VolumeMounts = append(m.VolumeMounts, v12.VolumeMount{}) if err := m.VolumeMounts[len(m.VolumeMounts)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -9165,7 +9094,7 @@ func (m *FunctionSpec) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Ports = append(m.Ports, v11.ContainerPort{}) + m.Ports = append(m.Ports, v12.ContainerPort{}) if err := m.Ports[len(m.Ports)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -9199,7 +9128,7 @@ func (m *FunctionSpec) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.VolumeMounts = append(m.VolumeMounts, v11.VolumeMount{}) + m.VolumeMounts = append(m.VolumeMounts, v12.VolumeMount{}) if err := m.VolumeMounts[len(m.VolumeMounts)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -9233,7 +9162,7 @@ func (m *FunctionSpec) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.VolumeDevices = append(m.VolumeDevices, v11.VolumeDevice{}) + m.VolumeDevices = append(m.VolumeDevices, v12.VolumeDevice{}) if err := m.VolumeDevices[len(m.VolumeDevices)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -9268,7 +9197,7 @@ func (m *FunctionSpec) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.RuntimeSettings == nil { - m.RuntimeSettings = &v12.ContainerRuntimeSettings{} + m.RuntimeSettings = &v11.ContainerRuntimeSettings{} } if err := m.RuntimeSettings.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -10533,7 +10462,7 @@ func (m *RestoreSessionSpec) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.InterimVolumeTemplate == nil { - m.InterimVolumeTemplate = &v12.PersistentVolumeClaim{} + m.InterimVolumeTemplate = &v11.PersistentVolumeClaim{} } if err := m.InterimVolumeTemplate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -10881,7 +10810,7 @@ func (m *RestoreTarget) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.VolumeMounts = append(m.VolumeMounts, v11.VolumeMount{}) + m.VolumeMounts = append(m.VolumeMounts, v12.VolumeMount{}) if err := m.VolumeMounts[len(m.VolumeMounts)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -10915,7 +10844,7 @@ func (m *RestoreTarget) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.VolumeClaimTemplates = append(m.VolumeClaimTemplates, v12.PersistentVolumeClaim{}) + m.VolumeClaimTemplates = append(m.VolumeClaimTemplates, v11.PersistentVolumeClaim{}) if err := m.VolumeClaimTemplates[len(m.VolumeClaimTemplates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -11371,6 +11300,178 @@ func (m *SnapshotStats) Unmarshal(dAtA []byte) error { } return nil } +func (m *Target) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Target: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Target: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Ref", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Ref.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TotalHosts", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.TotalHosts = &v + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Phase", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Phase = TargetPhase(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Stats", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Stats = append(m.Stats, HostBackupStats{}) + if err := m.Stats[len(m.Stats)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *TargetRef) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -11970,7 +12071,7 @@ func (m *TaskSpec) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Volumes = append(m.Volumes, v11.Volume{}) + m.Volumes = append(m.Volumes, v12.Volume{}) if err := m.Volumes[len(m.Volumes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } diff --git a/apis/stash/v1beta1/generated.proto b/apis/stash/v1beta1/generated.proto index ed251a843..2af727f1b 100644 --- a/apis/stash/v1beta1/generated.proto +++ b/apis/stash/v1beta1/generated.proto @@ -54,41 +54,46 @@ message BackupBatchList { } message BackupBatchSpec { - // backupConfigurationTemplates is a list of backup configurations that are part of this batch + // members is a list of backup configurations that are part of this batch // +optional - repeated BackupConfigurationTemplate backupConfigurationTemplates = 1; + repeated BackupConfigurationTemplateSpec members = 1; // Schedule specifies the schedule for invoking backup sessions // +optional optional string schedule = 2; + // RuntimeSettings allow to specify Resources, NodeSelector, Affinity, Toleration, ReadinessProbe etc, + // and used to create service account for CronJob. + // +optional + optional kmodules.xyz.offshoot_api.api.v1.RuntimeSettings runtimeSettings = 3; + // Driver indicates the name of the agent to use to backup the target. // Supported values are "Restic", "VolumeSnapshotter". // Default value is "Restic". // +optional - optional string driver = 3; + optional string driver = 4; // Repository refer to the Repository crd that holds backend information // +optional - optional k8s.io.api.core.v1.LocalObjectReference repository = 4; + optional k8s.io.api.core.v1.LocalObjectReference repository = 5; // RetentionPolicy indicates the policy to follow to clean old backup snapshots - optional .stash.appscode.dev.stash.apis.stash.v1alpha1.RetentionPolicy retentionPolicy = 5; + optional .stash.appscode.dev.stash.apis.stash.v1alpha1.RetentionPolicy retentionPolicy = 6; // Indicates that the BackupConfiguration is paused from taking backup. Default value is 'false' // +optional - optional bool paused = 6; + optional bool paused = 7; // BackupHistoryLimit specifies the number of BackupSession and it's associate resources to keep. // This is helpful for debugging purpose. // Default: 1 // +optional - optional int32 backupHistoryLimit = 7; + optional int32 backupHistoryLimit = 8; // Actions that Stash should take in response to backup sessions. // Cannot be updated. // +optional - optional BackupHooks hooks = 8; + optional BackupHooks hooks = 9; } message BackupBatchStatus { @@ -209,12 +214,6 @@ message BackupConfigurationStatus { optional int64 observedGeneration = 1; } -message BackupConfigurationTemplate { - optional kmodules.xyz.offshoot_api.api.v1.PartialObjectMeta metadata = 1; - - optional BackupConfigurationTemplateSpec spec = 2; -} - message BackupConfigurationTemplateSpec { // Task specify the Task crd that specifies the steps to take backup // +optional @@ -303,17 +302,13 @@ message BackupSessionStatus { // +optional optional string phase = 1; - // TotalHosts specifies total number of hosts that will be backed up for this BackupSession - // +optional - optional int32 totalHosts = 2; - - // SessionDuration specify total time taken to complete current backup session (sum of backup duration of all hosts) + // SessionDuration specify total time taken to complete current backup session (sum of backup duration of all targets) // +optional - optional string sessionDuration = 3; + optional string sessionDuration = 2; - // Stats shows statistics of individual hosts for this backup session - // +optional - repeated HostBackupStats stats = 4; + // Targets specify the backup status of individual targets + // optional + repeated Target targets = 3; } message BackupTarget { @@ -663,6 +658,24 @@ message SnapshotStats { optional FileStats fileStats = 6; } +message Target { + // Ref refers to the backup target + // +optional + optional TargetRef ref = 1; + + // TotalHosts specifies total number of hosts for this target that will be backed up for a BackupSession + // +optional + optional int32 totalHosts = 2; + + // Phase indicates backup phase of this target + // +optional + optional string phase = 3; + + // Stats shows statistics of individual hosts for this backup session + // +optional + repeated HostBackupStats stats = 4; +} + message TargetRef { optional string apiVersion = 1; diff --git a/apis/stash/v1beta1/openapi_generated.go b/apis/stash/v1beta1/openapi_generated.go index 1b52938d3..855badf57 100644 --- a/apis/stash/v1beta1/openapi_generated.go +++ b/apis/stash/v1beta1/openapi_generated.go @@ -379,7 +379,6 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "stash.appscode.dev/stash/apis/stash/v1beta1.BackupConfigurationList": schema_stash_apis_stash_v1beta1_BackupConfigurationList(ref), "stash.appscode.dev/stash/apis/stash/v1beta1.BackupConfigurationSpec": schema_stash_apis_stash_v1beta1_BackupConfigurationSpec(ref), "stash.appscode.dev/stash/apis/stash/v1beta1.BackupConfigurationStatus": schema_stash_apis_stash_v1beta1_BackupConfigurationStatus(ref), - "stash.appscode.dev/stash/apis/stash/v1beta1.BackupConfigurationTemplate": schema_stash_apis_stash_v1beta1_BackupConfigurationTemplate(ref), "stash.appscode.dev/stash/apis/stash/v1beta1.BackupConfigurationTemplateSpec": schema_stash_apis_stash_v1beta1_BackupConfigurationTemplateSpec(ref), "stash.appscode.dev/stash/apis/stash/v1beta1.BackupHooks": schema_stash_apis_stash_v1beta1_BackupHooks(ref), "stash.appscode.dev/stash/apis/stash/v1beta1.BackupInvokerRef": schema_stash_apis_stash_v1beta1_BackupInvokerRef(ref), @@ -405,6 +404,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "stash.appscode.dev/stash/apis/stash/v1beta1.RestoreTarget": schema_stash_apis_stash_v1beta1_RestoreTarget(ref), "stash.appscode.dev/stash/apis/stash/v1beta1.Rule": schema_stash_apis_stash_v1beta1_Rule(ref), "stash.appscode.dev/stash/apis/stash/v1beta1.SnapshotStats": schema_stash_apis_stash_v1beta1_SnapshotStats(ref), + "stash.appscode.dev/stash/apis/stash/v1beta1.Target": schema_stash_apis_stash_v1beta1_Target(ref), "stash.appscode.dev/stash/apis/stash/v1beta1.TargetRef": schema_stash_apis_stash_v1beta1_TargetRef(ref), "stash.appscode.dev/stash/apis/stash/v1beta1.Task": schema_stash_apis_stash_v1beta1_Task(ref), "stash.appscode.dev/stash/apis/stash/v1beta1.TaskList": schema_stash_apis_stash_v1beta1_TaskList(ref), @@ -17487,14 +17487,14 @@ func schema_stash_apis_stash_v1beta1_BackupBatchSpec(ref common.ReferenceCallbac SchemaProps: spec.SchemaProps{ Type: []string{"object"}, Properties: map[string]spec.Schema{ - "backupConfigurationTemplates": { + "members": { SchemaProps: spec.SchemaProps{ - Description: "backupConfigurationTemplates is a list of backup configurations that are part of this batch", + Description: "members is a list of backup configurations that are part of this batch", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("stash.appscode.dev/stash/apis/stash/v1beta1.BackupConfigurationTemplate"), + Ref: ref("stash.appscode.dev/stash/apis/stash/v1beta1.BackupConfigurationTemplateSpec"), }, }, }, @@ -17507,6 +17507,12 @@ func schema_stash_apis_stash_v1beta1_BackupBatchSpec(ref common.ReferenceCallbac Format: "", }, }, + "runtimeSettings": { + SchemaProps: spec.SchemaProps{ + Description: "RuntimeSettings allow to specify Resources, NodeSelector, Affinity, Toleration, ReadinessProbe etc, and used to create service account for CronJob.", + Ref: ref("kmodules.xyz/offshoot-api/api/v1.RuntimeSettings"), + }, + }, "driver": { SchemaProps: spec.SchemaProps{ Description: "Driver indicates the name of the agent to use to backup the target. Supported values are \"Restic\", \"VolumeSnapshotter\". Default value is \"Restic\".", @@ -17551,7 +17557,7 @@ func schema_stash_apis_stash_v1beta1_BackupBatchSpec(ref common.ReferenceCallbac }, }, Dependencies: []string{ - "k8s.io/api/core/v1.LocalObjectReference", "stash.appscode.dev/stash/apis/stash/v1alpha1.RetentionPolicy", "stash.appscode.dev/stash/apis/stash/v1beta1.BackupConfigurationTemplate", "stash.appscode.dev/stash/apis/stash/v1beta1.BackupHooks"}, + "k8s.io/api/core/v1.LocalObjectReference", "kmodules.xyz/offshoot-api/api/v1.RuntimeSettings", "stash.appscode.dev/stash/apis/stash/v1alpha1.RetentionPolicy", "stash.appscode.dev/stash/apis/stash/v1beta1.BackupConfigurationTemplateSpec", "stash.appscode.dev/stash/apis/stash/v1beta1.BackupHooks"}, } } @@ -17926,44 +17932,6 @@ func schema_stash_apis_stash_v1beta1_BackupConfigurationStatus(ref common.Refere } } -func schema_stash_apis_stash_v1beta1_BackupConfigurationTemplate(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "kind": { - SchemaProps: spec.SchemaProps{ - Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", - Type: []string{"string"}, - Format: "", - }, - }, - "apiVersion": { - SchemaProps: spec.SchemaProps{ - Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", - Type: []string{"string"}, - Format: "", - }, - }, - "metadata": { - SchemaProps: spec.SchemaProps{ - Ref: ref("kmodules.xyz/offshoot-api/api/v1.PartialObjectMeta"), - }, - }, - "spec": { - SchemaProps: spec.SchemaProps{ - Ref: ref("stash.appscode.dev/stash/apis/stash/v1beta1.BackupConfigurationTemplateSpec"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "kmodules.xyz/offshoot-api/api/v1.PartialObjectMeta", "stash.appscode.dev/stash/apis/stash/v1beta1.BackupConfigurationTemplateSpec"}, - } -} - func schema_stash_apis_stash_v1beta1_BackupConfigurationTemplateSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -18197,28 +18165,21 @@ func schema_stash_apis_stash_v1beta1_BackupSessionStatus(ref common.ReferenceCal Format: "", }, }, - "totalHosts": { - SchemaProps: spec.SchemaProps{ - Description: "TotalHosts specifies total number of hosts that will be backed up for this BackupSession", - Type: []string{"integer"}, - Format: "int32", - }, - }, "sessionDuration": { SchemaProps: spec.SchemaProps{ - Description: "SessionDuration specify total time taken to complete current backup session (sum of backup duration of all hosts)", + Description: "SessionDuration specify total time taken to complete current backup session (sum of backup duration of all targets)", Type: []string{"string"}, Format: "", }, }, - "stats": { + "targets": { SchemaProps: spec.SchemaProps{ - Description: "Stats shows statistics of individual hosts for this backup session", + Description: "Targets specify the backup status of individual targets optional", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("stash.appscode.dev/stash/apis/stash/v1beta1.HostBackupStats"), + Ref: ref("stash.appscode.dev/stash/apis/stash/v1beta1.Target"), }, }, }, @@ -18228,7 +18189,7 @@ func schema_stash_apis_stash_v1beta1_BackupSessionStatus(ref common.ReferenceCal }, }, Dependencies: []string{ - "stash.appscode.dev/stash/apis/stash/v1beta1.HostBackupStats"}, + "stash.appscode.dev/stash/apis/stash/v1beta1.Target"}, } } @@ -19137,6 +19098,53 @@ func schema_stash_apis_stash_v1beta1_SnapshotStats(ref common.ReferenceCallback) } } +func schema_stash_apis_stash_v1beta1_Target(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "ref": { + SchemaProps: spec.SchemaProps{ + Description: "Ref refers to the backup target", + Ref: ref("stash.appscode.dev/stash/apis/stash/v1beta1.TargetRef"), + }, + }, + "totalHosts": { + SchemaProps: spec.SchemaProps{ + Description: "TotalHosts specifies total number of hosts for this target that will be backed up for a BackupSession", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "phase": { + SchemaProps: spec.SchemaProps{ + Description: "Phase indicates backup phase of this target", + Type: []string{"string"}, + Format: "", + }, + }, + "stats": { + SchemaProps: spec.SchemaProps{ + Description: "Stats shows statistics of individual hosts for this backup session", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("stash.appscode.dev/stash/apis/stash/v1beta1.HostBackupStats"), + }, + }, + }, + }, + }, + }, + }, + }, + Dependencies: []string{ + "stash.appscode.dev/stash/apis/stash/v1beta1.HostBackupStats", "stash.appscode.dev/stash/apis/stash/v1beta1.TargetRef"}, + } +} + func schema_stash_apis_stash_v1beta1_TargetRef(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ diff --git a/apis/stash/v1beta1/zz_generated.deepcopy.go b/apis/stash/v1beta1/zz_generated.deepcopy.go index 4818fa491..2deb4f88a 100644 --- a/apis/stash/v1beta1/zz_generated.deepcopy.go +++ b/apis/stash/v1beta1/zz_generated.deepcopy.go @@ -91,13 +91,14 @@ func (in *BackupBatchList) DeepCopyObject() runtime.Object { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *BackupBatchSpec) DeepCopyInto(out *BackupBatchSpec) { *out = *in - if in.BackupConfigurationTemplates != nil { - in, out := &in.BackupConfigurationTemplates, &out.BackupConfigurationTemplates - *out = make([]BackupConfigurationTemplate, len(*in)) + if in.Members != nil { + in, out := &in.Members, &out.Members + *out = make([]BackupConfigurationTemplateSpec, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } } + in.RuntimeSettings.DeepCopyInto(&out.RuntimeSettings) out.Repository = in.Repository in.RetentionPolicy.DeepCopyInto(&out.RetentionPolicy) if in.BackupHistoryLimit != nil { @@ -331,33 +332,6 @@ func (in *BackupConfigurationStatus) DeepCopy() *BackupConfigurationStatus { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *BackupConfigurationTemplate) DeepCopyInto(out *BackupConfigurationTemplate) { - *out = *in - out.TypeMeta = in.TypeMeta - in.PartialObjectMeta.DeepCopyInto(&out.PartialObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BackupConfigurationTemplate. -func (in *BackupConfigurationTemplate) DeepCopy() *BackupConfigurationTemplate { - if in == nil { - return nil - } - out := new(BackupConfigurationTemplate) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *BackupConfigurationTemplate) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *BackupConfigurationTemplateSpec) DeepCopyInto(out *BackupConfigurationTemplateSpec) { *out = *in @@ -515,14 +489,9 @@ func (in *BackupSessionSpec) DeepCopy() *BackupSessionSpec { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *BackupSessionStatus) DeepCopyInto(out *BackupSessionStatus) { *out = *in - if in.TotalHosts != nil { - in, out := &in.TotalHosts, &out.TotalHosts - *out = new(int32) - **out = **in - } - if in.Stats != nil { - in, out := &in.Stats, &out.Stats - *out = make([]HostBackupStats, len(*in)) + if in.Targets != nil { + in, out := &in.Targets, &out.Targets + *out = make([]Target, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -1054,6 +1023,35 @@ func (in *SnapshotStats) DeepCopy() *SnapshotStats { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Target) DeepCopyInto(out *Target) { + *out = *in + out.Ref = in.Ref + if in.TotalHosts != nil { + in, out := &in.TotalHosts, &out.TotalHosts + *out = new(int32) + **out = **in + } + if in.Stats != nil { + in, out := &in.Stats, &out.Stats + *out = make([]HostBackupStats, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Target. +func (in *Target) DeepCopy() *Target { + if in == nil { + return nil + } + out := new(Target) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *TargetRef) DeepCopyInto(out *TargetRef) { *out = *in diff --git a/client/clientset/versioned/typed/stash/v1beta1/util/backupbatch.go b/client/clientset/versioned/typed/stash/v1beta1/util/backupbatch.go new file mode 100644 index 000000000..f697a7553 --- /dev/null +++ b/client/clientset/versioned/typed/stash/v1beta1/util/backupbatch.go @@ -0,0 +1,142 @@ +/* +Copyright The Stash Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package util + +import ( + "fmt" + + api "stash.appscode.dev/stash/apis/stash/v1beta1" + cs "stash.appscode.dev/stash/client/clientset/versioned/typed/stash/v1beta1" + + jsonpatch "github.com/evanphx/json-patch" + "github.com/golang/glog" + kerr "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/wait" + kutil "kmodules.xyz/client-go" +) + +func CreateOrPatchBackupBatch(c cs.StashV1beta1Interface, meta metav1.ObjectMeta, transform func(in *api.BackupBatch) *api.BackupBatch) (*api.BackupBatch, kutil.VerbType, error) { + cur, err := c.BackupBatches(meta.Namespace).Get(meta.Name, metav1.GetOptions{}) + if kerr.IsNotFound(err) { + glog.V(3).Infof("Creating BackupBatch %s/%s.", meta.Namespace, meta.Name) + out, err := c.BackupBatches(meta.Namespace).Create(transform(&api.BackupBatch{ + TypeMeta: metav1.TypeMeta{ + Kind: "BackupBatch", + APIVersion: api.SchemeGroupVersion.String(), + }, + ObjectMeta: meta, + })) + return out, kutil.VerbCreated, err + } else if err != nil { + return nil, kutil.VerbUnchanged, err + } + return PatchBackupBatch(c, cur, transform) +} + +func PatchBackupBatch(c cs.StashV1beta1Interface, cur *api.BackupBatch, transform func(*api.BackupBatch) *api.BackupBatch) (*api.BackupBatch, kutil.VerbType, error) { + return PatchBackupBatchObject(c, cur, transform(cur.DeepCopy())) +} + +func PatchBackupBatchObject(c cs.StashV1beta1Interface, cur, mod *api.BackupBatch) (*api.BackupBatch, kutil.VerbType, error) { + curJson, err := json.Marshal(cur) + if err != nil { + return nil, kutil.VerbUnchanged, err + } + + modJson, err := json.Marshal(mod) + if err != nil { + return nil, kutil.VerbUnchanged, err + } + + patch, err := jsonpatch.CreateMergePatch(curJson, modJson) + if err != nil { + return nil, kutil.VerbUnchanged, err + } + if len(patch) == 0 || string(patch) == "{}" { + return cur, kutil.VerbUnchanged, nil + } + glog.V(3).Infof("Patching BackupBatch %s/%s with %s.", cur.Namespace, cur.Name, string(patch)) + out, err := c.BackupBatches(cur.Namespace).Patch(cur.Name, types.MergePatchType, patch) + return out, kutil.VerbPatched, err +} + +func TryUpdateBackupBatch(c cs.StashV1beta1Interface, meta metav1.ObjectMeta, transform func(*api.BackupBatch) *api.BackupBatch) (result *api.BackupBatch, err error) { + attempt := 0 + err = wait.PollImmediate(kutil.RetryInterval, kutil.RetryTimeout, func() (bool, error) { + attempt++ + cur, e2 := c.BackupBatches(meta.Namespace).Get(meta.Name, metav1.GetOptions{}) + if kerr.IsNotFound(e2) { + return false, e2 + } else if e2 == nil { + result, e2 = c.BackupBatches(cur.Namespace).Update(transform(cur.DeepCopy())) + return e2 == nil, nil + } + glog.Errorf("Attempt %d failed to update BackupBatch %s/%s due to %v.", attempt, cur.Namespace, cur.Name, e2) + return false, nil + }) + + if err != nil { + err = fmt.Errorf("failed to update BackupBatch %s/%s after %d attempts due to %v", meta.Namespace, meta.Name, attempt, err) + } + return +} + +func UpdateBackupBatchStatus( + c cs.StashV1beta1Interface, + in *api.BackupBatch, + transform func(*api.BackupBatchStatus) *api.BackupBatchStatus, +) (result *api.BackupBatch, err error) { + apply := func(x *api.BackupBatch) *api.BackupBatch { + out := &api.BackupBatch{ + TypeMeta: x.TypeMeta, + ObjectMeta: x.ObjectMeta, + Spec: x.Spec, + Status: *transform(in.Status.DeepCopy()), + } + return out + } + + attempt := 0 + cur := in.DeepCopy() + err = wait.PollImmediate(kutil.RetryInterval, kutil.RetryTimeout, func() (bool, error) { + attempt++ + var e2 error + result, e2 = c.BackupBatches(in.Namespace).UpdateStatus(apply(cur)) + if kerr.IsConflict(e2) { + latest, e3 := c.BackupBatches(in.Namespace).Get(in.Name, metav1.GetOptions{}) + switch { + case e3 == nil: + cur = latest + return false, nil + case kutil.IsRequestRetryable(e3): + return false, nil + default: + return false, e3 + } + } else if err != nil && !kutil.IsRequestRetryable(e2) { + return false, e2 + } + return e2 == nil, nil + }) + + if err != nil { + err = fmt.Errorf("failed to update status of BackupBatch %s/%s after %d attempts due to %v", in.Namespace, in.Name, attempt, err) + } + return +} diff --git a/client/clientset/versioned/typed/stash/v1beta1/util/backupsession.go b/client/clientset/versioned/typed/stash/v1beta1/util/backupsession.go index 0ccc71af6..e16067897 100644 --- a/client/clientset/versioned/typed/stash/v1beta1/util/backupsession.go +++ b/client/clientset/versioned/typed/stash/v1beta1/util/backupsession.go @@ -97,23 +97,56 @@ func TryUpdateBackupSession(c cs.StashV1beta1Interface, meta metav1.ObjectMeta, return } -func UpdateBackupSessionStatusForHost(c cs.StashV1beta1Interface, backupSession *api_v1beta1.BackupSession, hostStats api_v1beta1.HostBackupStats) (*api_v1beta1.BackupSession, error) { - +func UpdateBackupSessionStatusForHost(c cs.StashV1beta1Interface, targetRef api_v1beta1.TargetRef, backupSession *api_v1beta1.BackupSession, hostStats api_v1beta1.HostBackupStats) (*api_v1beta1.BackupSession, error) { out, err := UpdateBackupSessionStatus(c, backupSession, func(in *api_v1beta1.BackupSessionStatus) *api_v1beta1.BackupSessionStatus { - // if an entry already exist for this host then update it - for i, v := range backupSession.Status.Stats { - if v.Hostname == hostStats.Hostname { - in.Stats[i] = hostStats - return in - } + targetIdx, hostIdx, targets := UpsertHostForTarget(backupSession.Status.Targets, targetRef, hostStats) + in.Targets = targets + if int32(len(targets[targetIdx].Stats)) != *targets[targetIdx].TotalHosts { + in.Targets[targetIdx].Phase = api_v1beta1.TargetBackupRunning + return in } - // no entry for this host. so add a new entry. - in.Stats = append(in.Stats, hostStats) + if targets[targetIdx].Stats[hostIdx].Phase == api_v1beta1.HostBackupFailed { + in.Targets[targetIdx].Phase = api_v1beta1.TargetBackupFailed + return in + } + in.Targets[targetIdx].Phase = api_v1beta1.TargetBackupSucceeded return in }) return out, err } +func UpsertHostForTarget(targets []api_v1beta1.Target, targetRef api_v1beta1.TargetRef, stat api_v1beta1.HostBackupStats) (int, int, []api_v1beta1.Target) { + var targetIdx, hostIdx int + for i, target := range targets { + if target.Ref.Name == targetRef.Name && target.Ref.Kind == targetRef.Kind { + targets[i].Stats = UpsertHost(target.Stats, stat) + for j, stat := range target.Stats { + if stat.Hostname == stat.Hostname { + hostIdx = j + } + } + targetIdx = i + } + } + return targetIdx, hostIdx, targets +} + +func UpsertHost(stats []api_v1beta1.HostBackupStats, stat ...api_v1beta1.HostBackupStats) []api_v1beta1.HostBackupStats { + upsert := func(s api_v1beta1.HostBackupStats) { + for i, st := range stats { + if st.Hostname == s.Hostname { + stats[i] = s + return + } + } + stats = append(stats, s) + } + for _, s := range stat { + upsert(s) + } + return stats +} + func UpdateBackupSessionStatus( c cs.StashV1beta1Interface, in *api_v1beta1.BackupSession, diff --git a/pkg/restic/metrics.go b/pkg/restic/metrics.go index 84cc8bfe5..d5be05396 100644 --- a/pkg/restic/metrics.go +++ b/pkg/restic/metrics.go @@ -63,7 +63,7 @@ type BackupSessionMetrics struct { SessionSuccess prometheus.Gauge // SessionDuration indicates total time taken to complete the entire backup session SessionDuration prometheus.Gauge - // HostCount indicates the total number of hosts that was backed up in this backup session + // HostCount indicates the total number of hosts of a target that was backed up in this backup session HostCount prometheus.Gauge } @@ -359,51 +359,58 @@ func newRestoreHostMetrics(labels prometheus.Labels) *RestoreMetrics { } // SendBackupSessionMetrics send backup session metrics to the Pushgateway -func (metricOpt *MetricsOptions) SendBackupSessionMetrics(config *rest.Config, backupConfig *api_v1beta1.BackupConfiguration, status api_v1beta1.BackupSessionStatus) error { +func (metricOpt *MetricsOptions) SendBackupSessionMetrics(config *rest.Config, invoker apis.Invoker, status api_v1beta1.BackupSessionStatus) error { // create metric registry registry := prometheus.NewRegistry() - // generate metrics labels - labels, err := backupMetricLabels(config, backupConfig, metricOpt.Labels) - if err != nil { - return err - } - // create metrics - metrics := newBackupSessionMetrics(labels) - - if status.Phase == api_v1beta1.BackupSessionSucceeded { - // mark entire backup session as succeeded - metrics.BackupSessionMetrics.SessionSuccess.Set(1) - - // set total time taken to complete the backup session - duration, err := time.ParseDuration(status.SessionDuration) + for _, target := range status.Targets { + // generate metrics labels + labels, err := backupMetricLabels(config, invoker, target.Ref, metricOpt.Labels) if err != nil { return err } - metrics.BackupSessionMetrics.SessionDuration.Set(duration.Seconds()) + // create metrics + metrics := newBackupSessionMetrics(labels) - // set total number of host that was backed up in this backup session - if status.TotalHosts != nil { - metrics.BackupSessionMetrics.HostCount.Set(float64(*status.TotalHosts)) - } + if status.Phase == api_v1beta1.BackupSessionSucceeded { + // mark entire backup session as succeeded + metrics.BackupSessionMetrics.SessionSuccess.Set(1) - // register metrics to the registry - registry.MustRegister( - metrics.BackupSessionMetrics.SessionSuccess, - metrics.BackupSessionMetrics.SessionDuration, - metrics.BackupSessionMetrics.HostCount, - ) - } else { - // mark entire backup session as failed - metrics.BackupSessionMetrics.SessionSuccess.Set(0) - registry.MustRegister(metrics.BackupSessionMetrics.SessionSuccess) + // set total time taken to complete the backup session for a target + totalDuration := float64(0) + for i := range target.Stats { + duration, err := time.ParseDuration(target.Stats[i].Duration) + if err != nil { + return err + } + totalDuration += duration.Seconds() + } + metrics.BackupSessionMetrics.SessionDuration.Set(totalDuration) + + // set total number of target that was backed up in this backup session + if target.TotalHosts != nil { + metrics.BackupSessionMetrics.HostCount.Set(float64(*target.TotalHosts)) + } + + // register metrics to the registry + registry.MustRegister( + metrics.BackupSessionMetrics.SessionSuccess, + metrics.BackupSessionMetrics.SessionDuration, + metrics.BackupSessionMetrics.HostCount, + ) + } else { + // mark entire backup session as failed + metrics.BackupSessionMetrics.SessionSuccess.Set(0) + registry.MustRegister(metrics.BackupSessionMetrics.SessionSuccess) + } } + // send metrics to the pushgateway return metricOpt.sendMetrics(registry, metricOpt.JobName) } // SendBackupSessionMetrics send backup metrics for individual hosts to the Pushgateway -func (metricOpt *MetricsOptions) SendBackupHostMetrics(config *rest.Config, backupConfig *api_v1beta1.BackupConfiguration, backupOutput *BackupOutput) error { +func (metricOpt *MetricsOptions) SendBackupHostMetrics(config *rest.Config, invoker apis.Invoker, targetInfo apis.TargetInfo, backupOutput *BackupOutput) error { if backupOutput == nil { return fmt.Errorf("invalid backup output. Backup output shouldn't be nil") } @@ -411,7 +418,12 @@ func (metricOpt *MetricsOptions) SendBackupHostMetrics(config *rest.Config, back // create metric registry registry := prometheus.NewRegistry() - labels, err := backupMetricLabels(config, backupConfig, metricOpt.Labels) + // config, namespace, backupTarget, repoName, driver, metricOpt.Labels + var targetRef api_v1beta1.TargetRef + if targetInfo.Target != nil { + targetRef = targetInfo.Target.Ref + } + labels, err := backupMetricLabels(config, invoker, targetRef, metricOpt.Labels) if err != nil { return err } @@ -456,7 +468,7 @@ func (metricOpt *MetricsOptions) SendBackupHostMetrics(config *rest.Config, back // create repository metrics if backupOutput.RepositoryStats.Integrity != nil { - repoMetricLabels, err := repoMetricLabels(config, backupConfig, metricOpt.Labels) + repoMetricLabels, err := repoMetricLabels(config, invoker, metricOpt.Labels) if err != nil { return err } @@ -660,28 +672,25 @@ func (metricOpt *MetricsOptions) sendMetrics(registry *prometheus.Registry, jobN return nil } -func backupMetricLabels(config *rest.Config, backupConfig *api_v1beta1.BackupConfiguration, userProvidedLabels []string) (prometheus.Labels, error) { +func backupMetricLabels(config *rest.Config, invoker apis.Invoker, targetRef api_v1beta1.TargetRef, userProvidedLabels []string) (prometheus.Labels, error) { // add user provided labels promLabels := parseUserProvidedLabels(userProvidedLabels) // insert target information as metrics label - if backupConfig != nil { - if backupConfig.Spec.Driver == api_v1beta1.VolumeSnapshotter { - promLabels = upsertLabel(promLabels, volumeSnapshotterLabels()) - } else { - promLabels[MetricsLabelDriver] = string(api_v1beta1.ResticSnapshotter) - // insert backup target specific labels - if backupConfig.Spec.Target != nil { - labels, err := targetLabels(config, backupConfig.Spec.Target.Ref, backupConfig.Namespace) - if err != nil { - return nil, err - } - promLabels = upsertLabel(promLabels, labels) - } - promLabels[MetricsLabelRepository] = backupConfig.Spec.Repository.Name + if invoker.Driver == api_v1beta1.VolumeSnapshotter { + promLabels = upsertLabel(promLabels, volumeSnapshotterLabels()) + } else { + promLabels[MetricsLabelDriver] = string(api_v1beta1.ResticSnapshotter) + // insert backup target specific labels + labels, err := targetLabels(config, targetRef, invoker.ObjectMeta.Namespace) + if err != nil { + return nil, err } - promLabels[MetricsLabelNamespace] = backupConfig.Namespace + promLabels = upsertLabel(promLabels, labels) + promLabels[MetricsLabelRepository] = invoker.Repository } + promLabels[MetricsLabelNamespace] = invoker.ObjectMeta.Namespace + return promLabels, nil } @@ -710,42 +719,40 @@ func restoreMetricLabels(config *rest.Config, restoreSession *api_v1beta1.Restor return promLabels, nil } -func repoMetricLabels(clientConfig *rest.Config, backupConfig *api_v1beta1.BackupConfiguration, userProvidedLabels []string) (prometheus.Labels, error) { +func repoMetricLabels(clientConfig *rest.Config, invoker apis.Invoker, userProvidedLabels []string) (prometheus.Labels, error) { // add user provided labels promLabels := parseUserProvidedLabels(userProvidedLabels) // insert repository information as label - if backupConfig != nil && backupConfig.Spec.Target != nil { - stashClient, err := cs.NewForConfig(clientConfig) - if err != nil { - return nil, err - } - repository, err := stashClient.StashV1alpha1().Repositories(backupConfig.Namespace).Get(backupConfig.Spec.Repository.Name, metav1.GetOptions{}) - if err != nil { - return nil, err - } - provider, err := repository.Spec.Backend.Provider() - if err != nil { - return nil, err - } - bucket, err := repository.Spec.Backend.Container() - if err != nil { - return nil, err - } - prefix, err := repository.Spec.Backend.Prefix() - if err != nil { - return nil, err - } + stashClient, err := cs.NewForConfig(clientConfig) + if err != nil { + return nil, err + } + repository, err := stashClient.StashV1alpha1().Repositories(invoker.ObjectMeta.Namespace).Get(invoker.Repository, metav1.GetOptions{}) + if err != nil { + return nil, err + } + provider, err := repository.Spec.Backend.Provider() + if err != nil { + return nil, err + } + bucket, err := repository.Spec.Backend.Container() + if err != nil { + return nil, err + } + prefix, err := repository.Spec.Backend.Prefix() + if err != nil { + return nil, err + } - promLabels[MetricsLabelName] = repository.Name - promLabels[MetricsLabelNamespace] = repository.Namespace - promLabels[MetricsLabelBackend] = provider - if bucket != "" { - promLabels[MetricsLabelBucket] = bucket - } - if prefix != "" { - promLabels[MetricsLabelPrefix] = prefix - } + promLabels[MetricsLabelName] = repository.Name + promLabels[MetricsLabelNamespace] = repository.Namespace + promLabels[MetricsLabelBackend] = provider + if bucket != "" { + promLabels[MetricsLabelBucket] = bucket + } + if prefix != "" { + promLabels[MetricsLabelPrefix] = prefix } return promLabels, nil } diff --git a/vendor/github.com/google/btree/btree_mem.go b/vendor/github.com/google/btree/btree_mem.go new file mode 100644 index 000000000..cb95b7fa1 --- /dev/null +++ b/vendor/github.com/google/btree/btree_mem.go @@ -0,0 +1,76 @@ +// Copyright 2014 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build ignore + +// This binary compares memory usage between btree and gollrb. +package main + +import ( + "flag" + "fmt" + "math/rand" + "runtime" + "time" + + "github.com/google/btree" + "github.com/petar/GoLLRB/llrb" +) + +var ( + size = flag.Int("size", 1000000, "size of the tree to build") + degree = flag.Int("degree", 8, "degree of btree") + gollrb = flag.Bool("llrb", false, "use llrb instead of btree") +) + +func main() { + flag.Parse() + vals := rand.Perm(*size) + var t, v interface{} + v = vals + var stats runtime.MemStats + for i := 0; i < 10; i++ { + runtime.GC() + } + fmt.Println("-------- BEFORE ----------") + runtime.ReadMemStats(&stats) + fmt.Printf("%+v\n", stats) + start := time.Now() + if *gollrb { + tr := llrb.New() + for _, v := range vals { + tr.ReplaceOrInsert(llrb.Int(v)) + } + t = tr // keep it around + } else { + tr := btree.New(*degree) + for _, v := range vals { + tr.ReplaceOrInsert(btree.Int(v)) + } + t = tr // keep it around + } + fmt.Printf("%v inserts in %v\n", *size, time.Since(start)) + fmt.Println("-------- AFTER ----------") + runtime.ReadMemStats(&stats) + fmt.Printf("%+v\n", stats) + for i := 0; i < 10; i++ { + runtime.GC() + } + fmt.Println("-------- AFTER GC ----------") + runtime.ReadMemStats(&stats) + fmt.Printf("%+v\n", stats) + if t == v { + fmt.Println("to make sure vals and tree aren't GC'd") + } +} diff --git a/vendor/golang.org/x/net/html/atom/gen.go b/vendor/golang.org/x/net/html/atom/gen.go new file mode 100644 index 000000000..5d052781b --- /dev/null +++ b/vendor/golang.org/x/net/html/atom/gen.go @@ -0,0 +1,712 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +//go:generate go run gen.go +//go:generate go run gen.go -test + +package main + +import ( + "bytes" + "flag" + "fmt" + "go/format" + "io/ioutil" + "math/rand" + "os" + "sort" + "strings" +) + +// identifier converts s to a Go exported identifier. +// It converts "div" to "Div" and "accept-charset" to "AcceptCharset". +func identifier(s string) string { + b := make([]byte, 0, len(s)) + cap := true + for _, c := range s { + if c == '-' { + cap = true + continue + } + if cap && 'a' <= c && c <= 'z' { + c -= 'a' - 'A' + } + cap = false + b = append(b, byte(c)) + } + return string(b) +} + +var test = flag.Bool("test", false, "generate table_test.go") + +func genFile(name string, buf *bytes.Buffer) { + b, err := format.Source(buf.Bytes()) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + if err := ioutil.WriteFile(name, b, 0644); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} + +func main() { + flag.Parse() + + var all []string + all = append(all, elements...) + all = append(all, attributes...) + all = append(all, eventHandlers...) + all = append(all, extra...) + sort.Strings(all) + + // uniq - lists have dups + w := 0 + for _, s := range all { + if w == 0 || all[w-1] != s { + all[w] = s + w++ + } + } + all = all[:w] + + if *test { + var buf bytes.Buffer + fmt.Fprintln(&buf, "// Code generated by go generate gen.go; DO NOT EDIT.\n") + fmt.Fprintln(&buf, "//go:generate go run gen.go -test\n") + fmt.Fprintln(&buf, "package atom\n") + fmt.Fprintln(&buf, "var testAtomList = []string{") + for _, s := range all { + fmt.Fprintf(&buf, "\t%q,\n", s) + } + fmt.Fprintln(&buf, "}") + + genFile("table_test.go", &buf) + return + } + + // Find hash that minimizes table size. + var best *table + for i := 0; i < 1000000; i++ { + if best != nil && 1<<(best.k-1) < len(all) { + break + } + h := rand.Uint32() + for k := uint(0); k <= 16; k++ { + if best != nil && k >= best.k { + break + } + var t table + if t.init(h, k, all) { + best = &t + break + } + } + } + if best == nil { + fmt.Fprintf(os.Stderr, "failed to construct string table\n") + os.Exit(1) + } + + // Lay out strings, using overlaps when possible. + layout := append([]string{}, all...) + + // Remove strings that are substrings of other strings + for changed := true; changed; { + changed = false + for i, s := range layout { + if s == "" { + continue + } + for j, t := range layout { + if i != j && t != "" && strings.Contains(s, t) { + changed = true + layout[j] = "" + } + } + } + } + + // Join strings where one suffix matches another prefix. + for { + // Find best i, j, k such that layout[i][len-k:] == layout[j][:k], + // maximizing overlap length k. + besti := -1 + bestj := -1 + bestk := 0 + for i, s := range layout { + if s == "" { + continue + } + for j, t := range layout { + if i == j { + continue + } + for k := bestk + 1; k <= len(s) && k <= len(t); k++ { + if s[len(s)-k:] == t[:k] { + besti = i + bestj = j + bestk = k + } + } + } + } + if bestk > 0 { + layout[besti] += layout[bestj][bestk:] + layout[bestj] = "" + continue + } + break + } + + text := strings.Join(layout, "") + + atom := map[string]uint32{} + for _, s := range all { + off := strings.Index(text, s) + if off < 0 { + panic("lost string " + s) + } + atom[s] = uint32(off<<8 | len(s)) + } + + var buf bytes.Buffer + // Generate the Go code. + fmt.Fprintln(&buf, "// Code generated by go generate gen.go; DO NOT EDIT.\n") + fmt.Fprintln(&buf, "//go:generate go run gen.go\n") + fmt.Fprintln(&buf, "package atom\n\nconst (") + + // compute max len + maxLen := 0 + for _, s := range all { + if maxLen < len(s) { + maxLen = len(s) + } + fmt.Fprintf(&buf, "\t%s Atom = %#x\n", identifier(s), atom[s]) + } + fmt.Fprintln(&buf, ")\n") + + fmt.Fprintf(&buf, "const hash0 = %#x\n\n", best.h0) + fmt.Fprintf(&buf, "const maxAtomLen = %d\n\n", maxLen) + + fmt.Fprintf(&buf, "var table = [1<<%d]Atom{\n", best.k) + for i, s := range best.tab { + if s == "" { + continue + } + fmt.Fprintf(&buf, "\t%#x: %#x, // %s\n", i, atom[s], s) + } + fmt.Fprintf(&buf, "}\n") + datasize := (1 << best.k) * 4 + + fmt.Fprintln(&buf, "const atomText =") + textsize := len(text) + for len(text) > 60 { + fmt.Fprintf(&buf, "\t%q +\n", text[:60]) + text = text[60:] + } + fmt.Fprintf(&buf, "\t%q\n\n", text) + + genFile("table.go", &buf) + + fmt.Fprintf(os.Stdout, "%d atoms; %d string bytes + %d tables = %d total data\n", len(all), textsize, datasize, textsize+datasize) +} + +type byLen []string + +func (x byLen) Less(i, j int) bool { return len(x[i]) > len(x[j]) } +func (x byLen) Swap(i, j int) { x[i], x[j] = x[j], x[i] } +func (x byLen) Len() int { return len(x) } + +// fnv computes the FNV hash with an arbitrary starting value h. +func fnv(h uint32, s string) uint32 { + for i := 0; i < len(s); i++ { + h ^= uint32(s[i]) + h *= 16777619 + } + return h +} + +// A table represents an attempt at constructing the lookup table. +// The lookup table uses cuckoo hashing, meaning that each string +// can be found in one of two positions. +type table struct { + h0 uint32 + k uint + mask uint32 + tab []string +} + +// hash returns the two hashes for s. +func (t *table) hash(s string) (h1, h2 uint32) { + h := fnv(t.h0, s) + h1 = h & t.mask + h2 = (h >> 16) & t.mask + return +} + +// init initializes the table with the given parameters. +// h0 is the initial hash value, +// k is the number of bits of hash value to use, and +// x is the list of strings to store in the table. +// init returns false if the table cannot be constructed. +func (t *table) init(h0 uint32, k uint, x []string) bool { + t.h0 = h0 + t.k = k + t.tab = make([]string, 1< len(t.tab) { + return false + } + s := t.tab[i] + h1, h2 := t.hash(s) + j := h1 + h2 - i + if t.tab[j] != "" && !t.push(j, depth+1) { + return false + } + t.tab[j] = s + return true +} + +// The lists of element names and attribute keys were taken from +// https://html.spec.whatwg.org/multipage/indices.html#index +// as of the "HTML Living Standard - Last Updated 16 April 2018" version. + +// "command", "keygen" and "menuitem" have been removed from the spec, +// but are kept here for backwards compatibility. +var elements = []string{ + "a", + "abbr", + "address", + "area", + "article", + "aside", + "audio", + "b", + "base", + "bdi", + "bdo", + "blockquote", + "body", + "br", + "button", + "canvas", + "caption", + "cite", + "code", + "col", + "colgroup", + "command", + "data", + "datalist", + "dd", + "del", + "details", + "dfn", + "dialog", + "div", + "dl", + "dt", + "em", + "embed", + "fieldset", + "figcaption", + "figure", + "footer", + "form", + "h1", + "h2", + "h3", + "h4", + "h5", + "h6", + "head", + "header", + "hgroup", + "hr", + "html", + "i", + "iframe", + "img", + "input", + "ins", + "kbd", + "keygen", + "label", + "legend", + "li", + "link", + "main", + "map", + "mark", + "menu", + "menuitem", + "meta", + "meter", + "nav", + "noscript", + "object", + "ol", + "optgroup", + "option", + "output", + "p", + "param", + "picture", + "pre", + "progress", + "q", + "rp", + "rt", + "ruby", + "s", + "samp", + "script", + "section", + "select", + "slot", + "small", + "source", + "span", + "strong", + "style", + "sub", + "summary", + "sup", + "table", + "tbody", + "td", + "template", + "textarea", + "tfoot", + "th", + "thead", + "time", + "title", + "tr", + "track", + "u", + "ul", + "var", + "video", + "wbr", +} + +// https://html.spec.whatwg.org/multipage/indices.html#attributes-3 +// +// "challenge", "command", "contextmenu", "dropzone", "icon", "keytype", "mediagroup", +// "radiogroup", "spellcheck", "scoped", "seamless", "sortable" and "sorted" have been removed from the spec, +// but are kept here for backwards compatibility. +var attributes = []string{ + "abbr", + "accept", + "accept-charset", + "accesskey", + "action", + "allowfullscreen", + "allowpaymentrequest", + "allowusermedia", + "alt", + "as", + "async", + "autocomplete", + "autofocus", + "autoplay", + "challenge", + "charset", + "checked", + "cite", + "class", + "color", + "cols", + "colspan", + "command", + "content", + "contenteditable", + "contextmenu", + "controls", + "coords", + "crossorigin", + "data", + "datetime", + "default", + "defer", + "dir", + "dirname", + "disabled", + "download", + "draggable", + "dropzone", + "enctype", + "for", + "form", + "formaction", + "formenctype", + "formmethod", + "formnovalidate", + "formtarget", + "headers", + "height", + "hidden", + "high", + "href", + "hreflang", + "http-equiv", + "icon", + "id", + "inputmode", + "integrity", + "is", + "ismap", + "itemid", + "itemprop", + "itemref", + "itemscope", + "itemtype", + "keytype", + "kind", + "label", + "lang", + "list", + "loop", + "low", + "manifest", + "max", + "maxlength", + "media", + "mediagroup", + "method", + "min", + "minlength", + "multiple", + "muted", + "name", + "nomodule", + "nonce", + "novalidate", + "open", + "optimum", + "pattern", + "ping", + "placeholder", + "playsinline", + "poster", + "preload", + "radiogroup", + "readonly", + "referrerpolicy", + "rel", + "required", + "reversed", + "rows", + "rowspan", + "sandbox", + "spellcheck", + "scope", + "scoped", + "seamless", + "selected", + "shape", + "size", + "sizes", + "sortable", + "sorted", + "slot", + "span", + "spellcheck", + "src", + "srcdoc", + "srclang", + "srcset", + "start", + "step", + "style", + "tabindex", + "target", + "title", + "translate", + "type", + "typemustmatch", + "updateviacache", + "usemap", + "value", + "width", + "workertype", + "wrap", +} + +// "onautocomplete", "onautocompleteerror", "onmousewheel", +// "onshow" and "onsort" have been removed from the spec, +// but are kept here for backwards compatibility. +var eventHandlers = []string{ + "onabort", + "onautocomplete", + "onautocompleteerror", + "onauxclick", + "onafterprint", + "onbeforeprint", + "onbeforeunload", + "onblur", + "oncancel", + "oncanplay", + "oncanplaythrough", + "onchange", + "onclick", + "onclose", + "oncontextmenu", + "oncopy", + "oncuechange", + "oncut", + "ondblclick", + "ondrag", + "ondragend", + "ondragenter", + "ondragexit", + "ondragleave", + "ondragover", + "ondragstart", + "ondrop", + "ondurationchange", + "onemptied", + "onended", + "onerror", + "onfocus", + "onhashchange", + "oninput", + "oninvalid", + "onkeydown", + "onkeypress", + "onkeyup", + "onlanguagechange", + "onload", + "onloadeddata", + "onloadedmetadata", + "onloadend", + "onloadstart", + "onmessage", + "onmessageerror", + "onmousedown", + "onmouseenter", + "onmouseleave", + "onmousemove", + "onmouseout", + "onmouseover", + "onmouseup", + "onmousewheel", + "onwheel", + "onoffline", + "ononline", + "onpagehide", + "onpageshow", + "onpaste", + "onpause", + "onplay", + "onplaying", + "onpopstate", + "onprogress", + "onratechange", + "onreset", + "onresize", + "onrejectionhandled", + "onscroll", + "onsecuritypolicyviolation", + "onseeked", + "onseeking", + "onselect", + "onshow", + "onsort", + "onstalled", + "onstorage", + "onsubmit", + "onsuspend", + "ontimeupdate", + "ontoggle", + "onunhandledrejection", + "onunload", + "onvolumechange", + "onwaiting", +} + +// extra are ad-hoc values not covered by any of the lists above. +var extra = []string{ + "acronym", + "align", + "annotation", + "annotation-xml", + "applet", + "basefont", + "bgsound", + "big", + "blink", + "center", + "color", + "desc", + "face", + "font", + "foreignObject", // HTML is case-insensitive, but SVG-embedded-in-HTML is case-sensitive. + "foreignobject", + "frame", + "frameset", + "image", + "isindex", + "listing", + "malignmark", + "marquee", + "math", + "mglyph", + "mi", + "mn", + "mo", + "ms", + "mtext", + "nobr", + "noembed", + "noframes", + "plaintext", + "prompt", + "public", + "rb", + "rtc", + "spacer", + "strike", + "svg", + "system", + "tt", + "xmp", +} diff --git a/vendor/golang.org/x/sys/unix/mkasm_darwin.go b/vendor/golang.org/x/sys/unix/mkasm_darwin.go new file mode 100644 index 000000000..4548b993d --- /dev/null +++ b/vendor/golang.org/x/sys/unix/mkasm_darwin.go @@ -0,0 +1,61 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +// mkasm_darwin.go generates assembly trampolines to call libSystem routines from Go. +//This program must be run after mksyscall.go. +package main + +import ( + "bytes" + "fmt" + "io/ioutil" + "log" + "os" + "strings" +) + +func main() { + in1, err := ioutil.ReadFile("syscall_darwin.go") + if err != nil { + log.Fatalf("can't open syscall_darwin.go: %s", err) + } + arch := os.Args[1] + in2, err := ioutil.ReadFile(fmt.Sprintf("syscall_darwin_%s.go", arch)) + if err != nil { + log.Fatalf("can't open syscall_darwin_%s.go: %s", arch, err) + } + in3, err := ioutil.ReadFile(fmt.Sprintf("zsyscall_darwin_%s.go", arch)) + if err != nil { + log.Fatalf("can't open zsyscall_darwin_%s.go: %s", arch, err) + } + in := string(in1) + string(in2) + string(in3) + + trampolines := map[string]bool{} + + var out bytes.Buffer + + fmt.Fprintf(&out, "// go run mkasm_darwin.go %s\n", strings.Join(os.Args[1:], " ")) + fmt.Fprintf(&out, "// Code generated by the command above; DO NOT EDIT.\n") + fmt.Fprintf(&out, "\n") + fmt.Fprintf(&out, "// +build go1.12\n") + fmt.Fprintf(&out, "\n") + fmt.Fprintf(&out, "#include \"textflag.h\"\n") + for _, line := range strings.Split(in, "\n") { + if !strings.HasPrefix(line, "func ") || !strings.HasSuffix(line, "_trampoline()") { + continue + } + fn := line[5 : len(line)-13] + if !trampolines[fn] { + trampolines[fn] = true + fmt.Fprintf(&out, "TEXT ·%s_trampoline(SB),NOSPLIT,$0-0\n", fn) + fmt.Fprintf(&out, "\tJMP\t%s(SB)\n", fn) + } + } + err = ioutil.WriteFile(fmt.Sprintf("zsyscall_darwin_%s.s", arch), out.Bytes(), 0644) + if err != nil { + log.Fatalf("can't write zsyscall_darwin_%s.s: %s", arch, err) + } +} diff --git a/vendor/golang.org/x/sys/unix/mkpost.go b/vendor/golang.org/x/sys/unix/mkpost.go new file mode 100644 index 000000000..eb4332059 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/mkpost.go @@ -0,0 +1,122 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +// mkpost processes the output of cgo -godefs to +// modify the generated types. It is used to clean up +// the sys API in an architecture specific manner. +// +// mkpost is run after cgo -godefs; see README.md. +package main + +import ( + "bytes" + "fmt" + "go/format" + "io/ioutil" + "log" + "os" + "regexp" +) + +func main() { + // Get the OS and architecture (using GOARCH_TARGET if it exists) + goos := os.Getenv("GOOS") + goarch := os.Getenv("GOARCH_TARGET") + if goarch == "" { + goarch = os.Getenv("GOARCH") + } + // Check that we are using the Docker-based build system if we should be. + if goos == "linux" { + if os.Getenv("GOLANG_SYS_BUILD") != "docker" { + os.Stderr.WriteString("In the Docker-based build system, mkpost should not be called directly.\n") + os.Stderr.WriteString("See README.md\n") + os.Exit(1) + } + } + + b, err := ioutil.ReadAll(os.Stdin) + if err != nil { + log.Fatal(err) + } + + if goos == "aix" { + // Replace type of Atim, Mtim and Ctim by Timespec in Stat_t + // to avoid having both StTimespec and Timespec. + sttimespec := regexp.MustCompile(`_Ctype_struct_st_timespec`) + b = sttimespec.ReplaceAll(b, []byte("Timespec")) + } + + // Intentionally export __val fields in Fsid and Sigset_t + valRegex := regexp.MustCompile(`type (Fsid|Sigset_t) struct {(\s+)X__(bits|val)(\s+\S+\s+)}`) + b = valRegex.ReplaceAll(b, []byte("type $1 struct {${2}Val$4}")) + + // Intentionally export __fds_bits field in FdSet + fdSetRegex := regexp.MustCompile(`type (FdSet) struct {(\s+)X__fds_bits(\s+\S+\s+)}`) + b = fdSetRegex.ReplaceAll(b, []byte("type $1 struct {${2}Bits$3}")) + + // If we have empty Ptrace structs, we should delete them. Only s390x emits + // nonempty Ptrace structs. + ptraceRexexp := regexp.MustCompile(`type Ptrace((Psw|Fpregs|Per) struct {\s*})`) + b = ptraceRexexp.ReplaceAll(b, nil) + + // Replace the control_regs union with a blank identifier for now. + controlRegsRegex := regexp.MustCompile(`(Control_regs)\s+\[0\]uint64`) + b = controlRegsRegex.ReplaceAll(b, []byte("_ [0]uint64")) + + // Remove fields that are added by glibc + // Note that this is unstable as the identifers are private. + removeFieldsRegex := regexp.MustCompile(`X__glibc\S*`) + b = removeFieldsRegex.ReplaceAll(b, []byte("_")) + + // Convert [65]int8 to [65]byte in Utsname members to simplify + // conversion to string; see golang.org/issue/20753 + convertUtsnameRegex := regexp.MustCompile(`((Sys|Node|Domain)name|Release|Version|Machine)(\s+)\[(\d+)\]u?int8`) + b = convertUtsnameRegex.ReplaceAll(b, []byte("$1$3[$4]byte")) + + // Convert [1024]int8 to [1024]byte in Ptmget members + convertPtmget := regexp.MustCompile(`([SC]n)(\s+)\[(\d+)\]u?int8`) + b = convertPtmget.ReplaceAll(b, []byte("$1[$3]byte")) + + // Remove spare fields (e.g. in Statx_t) + spareFieldsRegex := regexp.MustCompile(`X__spare\S*`) + b = spareFieldsRegex.ReplaceAll(b, []byte("_")) + + // Remove cgo padding fields + removePaddingFieldsRegex := regexp.MustCompile(`Pad_cgo_\d+`) + b = removePaddingFieldsRegex.ReplaceAll(b, []byte("_")) + + // Remove padding, hidden, or unused fields + removeFieldsRegex = regexp.MustCompile(`\b(X_\S+|Padding)`) + b = removeFieldsRegex.ReplaceAll(b, []byte("_")) + + // Remove the first line of warning from cgo + b = b[bytes.IndexByte(b, '\n')+1:] + // Modify the command in the header to include: + // mkpost, our own warning, and a build tag. + replacement := fmt.Sprintf(`$1 | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build %s,%s`, goarch, goos) + cgoCommandRegex := regexp.MustCompile(`(cgo -godefs .*)`) + b = cgoCommandRegex.ReplaceAll(b, []byte(replacement)) + + // Rename Stat_t time fields + if goos == "freebsd" && goarch == "386" { + // Hide Stat_t.[AMCB]tim_ext fields + renameStatTimeExtFieldsRegex := regexp.MustCompile(`[AMCB]tim_ext`) + b = renameStatTimeExtFieldsRegex.ReplaceAll(b, []byte("_")) + } + renameStatTimeFieldsRegex := regexp.MustCompile(`([AMCB])(?:irth)?time?(?:spec)?\s+(Timespec|StTimespec)`) + b = renameStatTimeFieldsRegex.ReplaceAll(b, []byte("${1}tim ${2}")) + + // gofmt + b, err = format.Source(b) + if err != nil { + log.Fatal(err) + } + + os.Stdout.Write(b) +} diff --git a/vendor/golang.org/x/sys/unix/mksyscall.go b/vendor/golang.org/x/sys/unix/mksyscall.go new file mode 100644 index 000000000..e4af9424e --- /dev/null +++ b/vendor/golang.org/x/sys/unix/mksyscall.go @@ -0,0 +1,407 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +/* +This program reads a file containing function prototypes +(like syscall_darwin.go) and generates system call bodies. +The prototypes are marked by lines beginning with "//sys" +and read like func declarations if //sys is replaced by func, but: + * The parameter lists must give a name for each argument. + This includes return parameters. + * The parameter lists must give a type for each argument: + the (x, y, z int) shorthand is not allowed. + * If the return parameter is an error number, it must be named errno. + +A line beginning with //sysnb is like //sys, except that the +goroutine will not be suspended during the execution of the system +call. This must only be used for system calls which can never +block, as otherwise the system call could cause all goroutines to +hang. +*/ +package main + +import ( + "bufio" + "flag" + "fmt" + "os" + "regexp" + "strings" +) + +var ( + b32 = flag.Bool("b32", false, "32bit big-endian") + l32 = flag.Bool("l32", false, "32bit little-endian") + plan9 = flag.Bool("plan9", false, "plan9") + openbsd = flag.Bool("openbsd", false, "openbsd") + netbsd = flag.Bool("netbsd", false, "netbsd") + dragonfly = flag.Bool("dragonfly", false, "dragonfly") + arm = flag.Bool("arm", false, "arm") // 64-bit value should use (even, odd)-pair + tags = flag.String("tags", "", "build tags") + filename = flag.String("output", "", "output file name (standard output if omitted)") +) + +// cmdLine returns this programs's commandline arguments +func cmdLine() string { + return "go run mksyscall.go " + strings.Join(os.Args[1:], " ") +} + +// buildTags returns build tags +func buildTags() string { + return *tags +} + +// Param is function parameter +type Param struct { + Name string + Type string +} + +// usage prints the program usage +func usage() { + fmt.Fprintf(os.Stderr, "usage: go run mksyscall.go [-b32 | -l32] [-tags x,y] [file ...]\n") + os.Exit(1) +} + +// parseParamList parses parameter list and returns a slice of parameters +func parseParamList(list string) []string { + list = strings.TrimSpace(list) + if list == "" { + return []string{} + } + return regexp.MustCompile(`\s*,\s*`).Split(list, -1) +} + +// parseParam splits a parameter into name and type +func parseParam(p string) Param { + ps := regexp.MustCompile(`^(\S*) (\S*)$`).FindStringSubmatch(p) + if ps == nil { + fmt.Fprintf(os.Stderr, "malformed parameter: %s\n", p) + os.Exit(1) + } + return Param{ps[1], ps[2]} +} + +func main() { + // Get the OS and architecture (using GOARCH_TARGET if it exists) + goos := os.Getenv("GOOS") + if goos == "" { + fmt.Fprintln(os.Stderr, "GOOS not defined in environment") + os.Exit(1) + } + goarch := os.Getenv("GOARCH_TARGET") + if goarch == "" { + goarch = os.Getenv("GOARCH") + } + + // Check that we are using the Docker-based build system if we should + if goos == "linux" { + if os.Getenv("GOLANG_SYS_BUILD") != "docker" { + fmt.Fprintf(os.Stderr, "In the Docker-based build system, mksyscall should not be called directly.\n") + fmt.Fprintf(os.Stderr, "See README.md\n") + os.Exit(1) + } + } + + flag.Usage = usage + flag.Parse() + if len(flag.Args()) <= 0 { + fmt.Fprintf(os.Stderr, "no files to parse provided\n") + usage() + } + + endianness := "" + if *b32 { + endianness = "big-endian" + } else if *l32 { + endianness = "little-endian" + } + + libc := false + if goos == "darwin" && strings.Contains(buildTags(), ",go1.12") { + libc = true + } + trampolines := map[string]bool{} + + text := "" + for _, path := range flag.Args() { + file, err := os.Open(path) + if err != nil { + fmt.Fprintf(os.Stderr, err.Error()) + os.Exit(1) + } + s := bufio.NewScanner(file) + for s.Scan() { + t := s.Text() + t = strings.TrimSpace(t) + t = regexp.MustCompile(`\s+`).ReplaceAllString(t, ` `) + nonblock := regexp.MustCompile(`^\/\/sysnb `).FindStringSubmatch(t) + if regexp.MustCompile(`^\/\/sys `).FindStringSubmatch(t) == nil && nonblock == nil { + continue + } + + // Line must be of the form + // func Open(path string, mode int, perm int) (fd int, errno error) + // Split into name, in params, out params. + f := regexp.MustCompile(`^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*((?i)SYS_[A-Z0-9_]+))?$`).FindStringSubmatch(t) + if f == nil { + fmt.Fprintf(os.Stderr, "%s:%s\nmalformed //sys declaration\n", path, t) + os.Exit(1) + } + funct, inps, outps, sysname := f[2], f[3], f[4], f[5] + + // ClockGettime doesn't have a syscall number on Darwin, only generate libc wrappers. + if goos == "darwin" && !libc && funct == "ClockGettime" { + continue + } + + // Split argument lists on comma. + in := parseParamList(inps) + out := parseParamList(outps) + + // Try in vain to keep people from editing this file. + // The theory is that they jump into the middle of the file + // without reading the header. + text += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" + + // Go function header. + outDecl := "" + if len(out) > 0 { + outDecl = fmt.Sprintf(" (%s)", strings.Join(out, ", ")) + } + text += fmt.Sprintf("func %s(%s)%s {\n", funct, strings.Join(in, ", "), outDecl) + + // Check if err return available + errvar := "" + for _, param := range out { + p := parseParam(param) + if p.Type == "error" { + errvar = p.Name + break + } + } + + // Prepare arguments to Syscall. + var args []string + n := 0 + for _, param := range in { + p := parseParam(param) + if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { + args = append(args, "uintptr(unsafe.Pointer("+p.Name+"))") + } else if p.Type == "string" && errvar != "" { + text += fmt.Sprintf("\tvar _p%d *byte\n", n) + text += fmt.Sprintf("\t_p%d, %s = BytePtrFromString(%s)\n", n, errvar, p.Name) + text += fmt.Sprintf("\tif %s != nil {\n\t\treturn\n\t}\n", errvar) + args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) + n++ + } else if p.Type == "string" { + fmt.Fprintf(os.Stderr, path+":"+funct+" uses string arguments, but has no error return\n") + text += fmt.Sprintf("\tvar _p%d *byte\n", n) + text += fmt.Sprintf("\t_p%d, _ = BytePtrFromString(%s)\n", n, p.Name) + args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) + n++ + } else if regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type) != nil { + // Convert slice into pointer, length. + // Have to be careful not to take address of &a[0] if len == 0: + // pass dummy pointer in that case. + // Used to pass nil, but some OSes or simulators reject write(fd, nil, 0). + text += fmt.Sprintf("\tvar _p%d unsafe.Pointer\n", n) + text += fmt.Sprintf("\tif len(%s) > 0 {\n\t\t_p%d = unsafe.Pointer(&%s[0])\n\t}", p.Name, n, p.Name) + text += fmt.Sprintf(" else {\n\t\t_p%d = unsafe.Pointer(&_zero)\n\t}\n", n) + args = append(args, fmt.Sprintf("uintptr(_p%d)", n), fmt.Sprintf("uintptr(len(%s))", p.Name)) + n++ + } else if p.Type == "int64" && (*openbsd || *netbsd) { + args = append(args, "0") + if endianness == "big-endian" { + args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name)) + } else if endianness == "little-endian" { + args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name)) + } else { + args = append(args, fmt.Sprintf("uintptr(%s)", p.Name)) + } + } else if p.Type == "int64" && *dragonfly { + if regexp.MustCompile(`^(?i)extp(read|write)`).FindStringSubmatch(funct) == nil { + args = append(args, "0") + } + if endianness == "big-endian" { + args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name)) + } else if endianness == "little-endian" { + args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name)) + } else { + args = append(args, fmt.Sprintf("uintptr(%s)", p.Name)) + } + } else if (p.Type == "int64" || p.Type == "uint64") && endianness != "" { + if len(args)%2 == 1 && *arm { + // arm abi specifies 64-bit argument uses + // (even, odd) pair + args = append(args, "0") + } + if endianness == "big-endian" { + args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name)) + } else { + args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name)) + } + } else { + args = append(args, fmt.Sprintf("uintptr(%s)", p.Name)) + } + } + + // Determine which form to use; pad args with zeros. + asm := "Syscall" + if nonblock != nil { + if errvar == "" && goos == "linux" { + asm = "RawSyscallNoError" + } else { + asm = "RawSyscall" + } + } else { + if errvar == "" && goos == "linux" { + asm = "SyscallNoError" + } + } + if len(args) <= 3 { + for len(args) < 3 { + args = append(args, "0") + } + } else if len(args) <= 6 { + asm += "6" + for len(args) < 6 { + args = append(args, "0") + } + } else if len(args) <= 9 { + asm += "9" + for len(args) < 9 { + args = append(args, "0") + } + } else { + fmt.Fprintf(os.Stderr, "%s:%s too many arguments to system call\n", path, funct) + } + + // System call number. + if sysname == "" { + sysname = "SYS_" + funct + sysname = regexp.MustCompile(`([a-z])([A-Z])`).ReplaceAllString(sysname, `${1}_$2`) + sysname = strings.ToUpper(sysname) + } + + var libcFn string + if libc { + asm = "syscall_" + strings.ToLower(asm[:1]) + asm[1:] // internal syscall call + sysname = strings.TrimPrefix(sysname, "SYS_") // remove SYS_ + sysname = strings.ToLower(sysname) // lowercase + if sysname == "getdirentries64" { + // Special case - libSystem name and + // raw syscall name don't match. + sysname = "__getdirentries64" + } + libcFn = sysname + sysname = "funcPC(libc_" + sysname + "_trampoline)" + } + + // Actual call. + arglist := strings.Join(args, ", ") + call := fmt.Sprintf("%s(%s, %s)", asm, sysname, arglist) + + // Assign return values. + body := "" + ret := []string{"_", "_", "_"} + doErrno := false + for i := 0; i < len(out); i++ { + p := parseParam(out[i]) + reg := "" + if p.Name == "err" && !*plan9 { + reg = "e1" + ret[2] = reg + doErrno = true + } else if p.Name == "err" && *plan9 { + ret[0] = "r0" + ret[2] = "e1" + break + } else { + reg = fmt.Sprintf("r%d", i) + ret[i] = reg + } + if p.Type == "bool" { + reg = fmt.Sprintf("%s != 0", reg) + } + if p.Type == "int64" && endianness != "" { + // 64-bit number in r1:r0 or r0:r1. + if i+2 > len(out) { + fmt.Fprintf(os.Stderr, "%s:%s not enough registers for int64 return\n", path, funct) + } + if endianness == "big-endian" { + reg = fmt.Sprintf("int64(r%d)<<32 | int64(r%d)", i, i+1) + } else { + reg = fmt.Sprintf("int64(r%d)<<32 | int64(r%d)", i+1, i) + } + ret[i] = fmt.Sprintf("r%d", i) + ret[i+1] = fmt.Sprintf("r%d", i+1) + } + if reg != "e1" || *plan9 { + body += fmt.Sprintf("\t%s = %s(%s)\n", p.Name, p.Type, reg) + } + } + if ret[0] == "_" && ret[1] == "_" && ret[2] == "_" { + text += fmt.Sprintf("\t%s\n", call) + } else { + if errvar == "" && goos == "linux" { + // raw syscall without error on Linux, see golang.org/issue/22924 + text += fmt.Sprintf("\t%s, %s := %s\n", ret[0], ret[1], call) + } else { + text += fmt.Sprintf("\t%s, %s, %s := %s\n", ret[0], ret[1], ret[2], call) + } + } + text += body + + if *plan9 && ret[2] == "e1" { + text += "\tif int32(r0) == -1 {\n" + text += "\t\terr = e1\n" + text += "\t}\n" + } else if doErrno { + text += "\tif e1 != 0 {\n" + text += "\t\terr = errnoErr(e1)\n" + text += "\t}\n" + } + text += "\treturn\n" + text += "}\n\n" + + if libc && !trampolines[libcFn] { + // some system calls share a trampoline, like read and readlen. + trampolines[libcFn] = true + // Declare assembly trampoline. + text += fmt.Sprintf("func libc_%s_trampoline()\n", libcFn) + // Assembly trampoline calls the libc_* function, which this magic + // redirects to use the function from libSystem. + text += fmt.Sprintf("//go:linkname libc_%s libc_%s\n", libcFn, libcFn) + text += fmt.Sprintf("//go:cgo_import_dynamic libc_%s %s \"/usr/lib/libSystem.B.dylib\"\n", libcFn, libcFn) + text += "\n" + } + } + if err := s.Err(); err != nil { + fmt.Fprintf(os.Stderr, err.Error()) + os.Exit(1) + } + file.Close() + } + fmt.Printf(srcTemplate, cmdLine(), buildTags(), text) +} + +const srcTemplate = `// %s +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build %s + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +%s +` diff --git a/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc.go b/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc.go new file mode 100644 index 000000000..3be3cdfc3 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc.go @@ -0,0 +1,415 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +/* +This program reads a file containing function prototypes +(like syscall_aix.go) and generates system call bodies. +The prototypes are marked by lines beginning with "//sys" +and read like func declarations if //sys is replaced by func, but: + * The parameter lists must give a name for each argument. + This includes return parameters. + * The parameter lists must give a type for each argument: + the (x, y, z int) shorthand is not allowed. + * If the return parameter is an error number, it must be named err. + * If go func name needs to be different than its libc name, + * or the function is not in libc, name could be specified + * at the end, after "=" sign, like + //sys getsockopt(s int, level int, name int, val uintptr, vallen *_Socklen) (err error) = libsocket.getsockopt +*/ +package main + +import ( + "bufio" + "flag" + "fmt" + "os" + "regexp" + "strings" +) + +var ( + b32 = flag.Bool("b32", false, "32bit big-endian") + l32 = flag.Bool("l32", false, "32bit little-endian") + aix = flag.Bool("aix", false, "aix") + tags = flag.String("tags", "", "build tags") +) + +// cmdLine returns this programs's commandline arguments +func cmdLine() string { + return "go run mksyscall_aix_ppc.go " + strings.Join(os.Args[1:], " ") +} + +// buildTags returns build tags +func buildTags() string { + return *tags +} + +// Param is function parameter +type Param struct { + Name string + Type string +} + +// usage prints the program usage +func usage() { + fmt.Fprintf(os.Stderr, "usage: go run mksyscall_aix_ppc.go [-b32 | -l32] [-tags x,y] [file ...]\n") + os.Exit(1) +} + +// parseParamList parses parameter list and returns a slice of parameters +func parseParamList(list string) []string { + list = strings.TrimSpace(list) + if list == "" { + return []string{} + } + return regexp.MustCompile(`\s*,\s*`).Split(list, -1) +} + +// parseParam splits a parameter into name and type +func parseParam(p string) Param { + ps := regexp.MustCompile(`^(\S*) (\S*)$`).FindStringSubmatch(p) + if ps == nil { + fmt.Fprintf(os.Stderr, "malformed parameter: %s\n", p) + os.Exit(1) + } + return Param{ps[1], ps[2]} +} + +func main() { + flag.Usage = usage + flag.Parse() + if len(flag.Args()) <= 0 { + fmt.Fprintf(os.Stderr, "no files to parse provided\n") + usage() + } + + endianness := "" + if *b32 { + endianness = "big-endian" + } else if *l32 { + endianness = "little-endian" + } + + pack := "" + text := "" + cExtern := "/*\n#include \n#include \n" + for _, path := range flag.Args() { + file, err := os.Open(path) + if err != nil { + fmt.Fprintf(os.Stderr, err.Error()) + os.Exit(1) + } + s := bufio.NewScanner(file) + for s.Scan() { + t := s.Text() + t = strings.TrimSpace(t) + t = regexp.MustCompile(`\s+`).ReplaceAllString(t, ` `) + if p := regexp.MustCompile(`^package (\S+)$`).FindStringSubmatch(t); p != nil && pack == "" { + pack = p[1] + } + nonblock := regexp.MustCompile(`^\/\/sysnb `).FindStringSubmatch(t) + if regexp.MustCompile(`^\/\/sys `).FindStringSubmatch(t) == nil && nonblock == nil { + continue + } + + // Line must be of the form + // func Open(path string, mode int, perm int) (fd int, err error) + // Split into name, in params, out params. + f := regexp.MustCompile(`^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$`).FindStringSubmatch(t) + if f == nil { + fmt.Fprintf(os.Stderr, "%s:%s\nmalformed //sys declaration\n", path, t) + os.Exit(1) + } + funct, inps, outps, modname, sysname := f[2], f[3], f[4], f[5], f[6] + + // Split argument lists on comma. + in := parseParamList(inps) + out := parseParamList(outps) + + inps = strings.Join(in, ", ") + outps = strings.Join(out, ", ") + + // Try in vain to keep people from editing this file. + // The theory is that they jump into the middle of the file + // without reading the header. + text += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" + + // Check if value return, err return available + errvar := "" + retvar := "" + rettype := "" + for _, param := range out { + p := parseParam(param) + if p.Type == "error" { + errvar = p.Name + } else { + retvar = p.Name + rettype = p.Type + } + } + + // System call name. + if sysname == "" { + sysname = funct + } + sysname = regexp.MustCompile(`([a-z])([A-Z])`).ReplaceAllString(sysname, `${1}_$2`) + sysname = strings.ToLower(sysname) // All libc functions are lowercase. + + cRettype := "" + if rettype == "unsafe.Pointer" { + cRettype = "uintptr_t" + } else if rettype == "uintptr" { + cRettype = "uintptr_t" + } else if regexp.MustCompile(`^_`).FindStringSubmatch(rettype) != nil { + cRettype = "uintptr_t" + } else if rettype == "int" { + cRettype = "int" + } else if rettype == "int32" { + cRettype = "int" + } else if rettype == "int64" { + cRettype = "long long" + } else if rettype == "uint32" { + cRettype = "unsigned int" + } else if rettype == "uint64" { + cRettype = "unsigned long long" + } else { + cRettype = "int" + } + if sysname == "exit" { + cRettype = "void" + } + + // Change p.Types to c + var cIn []string + for _, param := range in { + p := parseParam(param) + if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { + cIn = append(cIn, "uintptr_t") + } else if p.Type == "string" { + cIn = append(cIn, "uintptr_t") + } else if regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type) != nil { + cIn = append(cIn, "uintptr_t", "size_t") + } else if p.Type == "unsafe.Pointer" { + cIn = append(cIn, "uintptr_t") + } else if p.Type == "uintptr" { + cIn = append(cIn, "uintptr_t") + } else if regexp.MustCompile(`^_`).FindStringSubmatch(p.Type) != nil { + cIn = append(cIn, "uintptr_t") + } else if p.Type == "int" { + cIn = append(cIn, "int") + } else if p.Type == "int32" { + cIn = append(cIn, "int") + } else if p.Type == "int64" { + cIn = append(cIn, "long long") + } else if p.Type == "uint32" { + cIn = append(cIn, "unsigned int") + } else if p.Type == "uint64" { + cIn = append(cIn, "unsigned long long") + } else { + cIn = append(cIn, "int") + } + } + + if funct != "fcntl" && funct != "FcntlInt" && funct != "readlen" && funct != "writelen" { + if sysname == "select" { + // select is a keyword of Go. Its name is + // changed to c_select. + cExtern += "#define c_select select\n" + } + // Imports of system calls from libc + cExtern += fmt.Sprintf("%s %s", cRettype, sysname) + cIn := strings.Join(cIn, ", ") + cExtern += fmt.Sprintf("(%s);\n", cIn) + } + + // So file name. + if *aix { + if modname == "" { + modname = "libc.a/shr_64.o" + } else { + fmt.Fprintf(os.Stderr, "%s: only syscall using libc are available\n", funct) + os.Exit(1) + } + } + + strconvfunc := "C.CString" + + // Go function header. + if outps != "" { + outps = fmt.Sprintf(" (%s)", outps) + } + if text != "" { + text += "\n" + } + + text += fmt.Sprintf("func %s(%s)%s {\n", funct, strings.Join(in, ", "), outps) + + // Prepare arguments to Syscall. + var args []string + n := 0 + argN := 0 + for _, param := range in { + p := parseParam(param) + if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { + args = append(args, "C.uintptr_t(uintptr(unsafe.Pointer("+p.Name+")))") + } else if p.Type == "string" && errvar != "" { + text += fmt.Sprintf("\t_p%d := uintptr(unsafe.Pointer(%s(%s)))\n", n, strconvfunc, p.Name) + args = append(args, fmt.Sprintf("C.uintptr_t(_p%d)", n)) + n++ + } else if p.Type == "string" { + fmt.Fprintf(os.Stderr, path+":"+funct+" uses string arguments, but has no error return\n") + text += fmt.Sprintf("\t_p%d := uintptr(unsafe.Pointer(%s(%s)))\n", n, strconvfunc, p.Name) + args = append(args, fmt.Sprintf("C.uintptr_t(_p%d)", n)) + n++ + } else if m := regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type); m != nil { + // Convert slice into pointer, length. + // Have to be careful not to take address of &a[0] if len == 0: + // pass nil in that case. + text += fmt.Sprintf("\tvar _p%d *%s\n", n, m[1]) + text += fmt.Sprintf("\tif len(%s) > 0 {\n\t\t_p%d = &%s[0]\n\t}\n", p.Name, n, p.Name) + args = append(args, fmt.Sprintf("C.uintptr_t(uintptr(unsafe.Pointer(_p%d)))", n)) + n++ + text += fmt.Sprintf("\tvar _p%d int\n", n) + text += fmt.Sprintf("\t_p%d = len(%s)\n", n, p.Name) + args = append(args, fmt.Sprintf("C.size_t(_p%d)", n)) + n++ + } else if p.Type == "int64" && endianness != "" { + if endianness == "big-endian" { + args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name)) + } else { + args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name)) + } + n++ + } else if p.Type == "bool" { + text += fmt.Sprintf("\tvar _p%d uint32\n", n) + text += fmt.Sprintf("\tif %s {\n\t\t_p%d = 1\n\t} else {\n\t\t_p%d = 0\n\t}\n", p.Name, n, n) + args = append(args, fmt.Sprintf("_p%d", n)) + } else if regexp.MustCompile(`^_`).FindStringSubmatch(p.Type) != nil { + args = append(args, fmt.Sprintf("C.uintptr_t(uintptr(%s))", p.Name)) + } else if p.Type == "unsafe.Pointer" { + args = append(args, fmt.Sprintf("C.uintptr_t(uintptr(%s))", p.Name)) + } else if p.Type == "int" { + if (argN == 2) && ((funct == "readlen") || (funct == "writelen")) { + args = append(args, fmt.Sprintf("C.size_t(%s)", p.Name)) + } else if argN == 0 && funct == "fcntl" { + args = append(args, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) + } else if (argN == 2) && ((funct == "fcntl") || (funct == "FcntlInt")) { + args = append(args, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) + } else { + args = append(args, fmt.Sprintf("C.int(%s)", p.Name)) + } + } else if p.Type == "int32" { + args = append(args, fmt.Sprintf("C.int(%s)", p.Name)) + } else if p.Type == "int64" { + args = append(args, fmt.Sprintf("C.longlong(%s)", p.Name)) + } else if p.Type == "uint32" { + args = append(args, fmt.Sprintf("C.uint(%s)", p.Name)) + } else if p.Type == "uint64" { + args = append(args, fmt.Sprintf("C.ulonglong(%s)", p.Name)) + } else if p.Type == "uintptr" { + args = append(args, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) + } else { + args = append(args, fmt.Sprintf("C.int(%s)", p.Name)) + } + argN++ + } + + // Actual call. + arglist := strings.Join(args, ", ") + call := "" + if sysname == "exit" { + if errvar != "" { + call += "er :=" + } else { + call += "" + } + } else if errvar != "" { + call += "r0,er :=" + } else if retvar != "" { + call += "r0,_ :=" + } else { + call += "" + } + if sysname == "select" { + // select is a keyword of Go. Its name is + // changed to c_select. + call += fmt.Sprintf("C.c_%s(%s)", sysname, arglist) + } else { + call += fmt.Sprintf("C.%s(%s)", sysname, arglist) + } + + // Assign return values. + body := "" + for i := 0; i < len(out); i++ { + p := parseParam(out[i]) + reg := "" + if p.Name == "err" { + reg = "e1" + } else { + reg = "r0" + } + if reg != "e1" { + body += fmt.Sprintf("\t%s = %s(%s)\n", p.Name, p.Type, reg) + } + } + + // verify return + if sysname != "exit" && errvar != "" { + if regexp.MustCompile(`^uintptr`).FindStringSubmatch(cRettype) != nil { + body += "\tif (uintptr(r0) ==^uintptr(0) && er != nil) {\n" + body += fmt.Sprintf("\t\t%s = er\n", errvar) + body += "\t}\n" + } else { + body += "\tif (r0 ==-1 && er != nil) {\n" + body += fmt.Sprintf("\t\t%s = er\n", errvar) + body += "\t}\n" + } + } else if errvar != "" { + body += "\tif (er != nil) {\n" + body += fmt.Sprintf("\t\t%s = er\n", errvar) + body += "\t}\n" + } + + text += fmt.Sprintf("\t%s\n", call) + text += body + + text += "\treturn\n" + text += "}\n" + } + if err := s.Err(); err != nil { + fmt.Fprintf(os.Stderr, err.Error()) + os.Exit(1) + } + file.Close() + } + imp := "" + if pack != "unix" { + imp = "import \"golang.org/x/sys/unix\"\n" + + } + fmt.Printf(srcTemplate, cmdLine(), buildTags(), pack, cExtern, imp, text) +} + +const srcTemplate = `// %s +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build %s + +package %s + + +%s +*/ +import "C" +import ( + "unsafe" +) + + +%s + +%s +` diff --git a/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc64.go b/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc64.go new file mode 100644 index 000000000..c96009951 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc64.go @@ -0,0 +1,614 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +/* +This program reads a file containing function prototypes +(like syscall_aix.go) and generates system call bodies. +The prototypes are marked by lines beginning with "//sys" +and read like func declarations if //sys is replaced by func, but: + * The parameter lists must give a name for each argument. + This includes return parameters. + * The parameter lists must give a type for each argument: + the (x, y, z int) shorthand is not allowed. + * If the return parameter is an error number, it must be named err. + * If go func name needs to be different than its libc name, + * or the function is not in libc, name could be specified + * at the end, after "=" sign, like + //sys getsockopt(s int, level int, name int, val uintptr, vallen *_Socklen) (err error) = libsocket.getsockopt + + +This program will generate three files and handle both gc and gccgo implementation: + - zsyscall_aix_ppc64.go: the common part of each implementation (error handler, pointer creation) + - zsyscall_aix_ppc64_gc.go: gc part with //go_cgo_import_dynamic and a call to syscall6 + - zsyscall_aix_ppc64_gccgo.go: gccgo part with C function and conversion to C type. + + The generated code looks like this + +zsyscall_aix_ppc64.go +func asyscall(...) (n int, err error) { + // Pointer Creation + r1, e1 := callasyscall(...) + // Type Conversion + // Error Handler + return +} + +zsyscall_aix_ppc64_gc.go +//go:cgo_import_dynamic libc_asyscall asyscall "libc.a/shr_64.o" +//go:linkname libc_asyscall libc_asyscall +var asyscall syscallFunc + +func callasyscall(...) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_asyscall)), "nb_args", ... ) + return +} + +zsyscall_aix_ppc64_ggcgo.go + +// int asyscall(...) + +import "C" + +func callasyscall(...) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.asyscall(...)) + e1 = syscall.GetErrno() + return +} +*/ + +package main + +import ( + "bufio" + "flag" + "fmt" + "io/ioutil" + "os" + "regexp" + "strings" +) + +var ( + b32 = flag.Bool("b32", false, "32bit big-endian") + l32 = flag.Bool("l32", false, "32bit little-endian") + aix = flag.Bool("aix", false, "aix") + tags = flag.String("tags", "", "build tags") +) + +// cmdLine returns this programs's commandline arguments +func cmdLine() string { + return "go run mksyscall_aix_ppc64.go " + strings.Join(os.Args[1:], " ") +} + +// buildTags returns build tags +func buildTags() string { + return *tags +} + +// Param is function parameter +type Param struct { + Name string + Type string +} + +// usage prints the program usage +func usage() { + fmt.Fprintf(os.Stderr, "usage: go run mksyscall_aix_ppc64.go [-b32 | -l32] [-tags x,y] [file ...]\n") + os.Exit(1) +} + +// parseParamList parses parameter list and returns a slice of parameters +func parseParamList(list string) []string { + list = strings.TrimSpace(list) + if list == "" { + return []string{} + } + return regexp.MustCompile(`\s*,\s*`).Split(list, -1) +} + +// parseParam splits a parameter into name and type +func parseParam(p string) Param { + ps := regexp.MustCompile(`^(\S*) (\S*)$`).FindStringSubmatch(p) + if ps == nil { + fmt.Fprintf(os.Stderr, "malformed parameter: %s\n", p) + os.Exit(1) + } + return Param{ps[1], ps[2]} +} + +func main() { + flag.Usage = usage + flag.Parse() + if len(flag.Args()) <= 0 { + fmt.Fprintf(os.Stderr, "no files to parse provided\n") + usage() + } + + endianness := "" + if *b32 { + endianness = "big-endian" + } else if *l32 { + endianness = "little-endian" + } + + pack := "" + // GCCGO + textgccgo := "" + cExtern := "/*\n#include \n" + // GC + textgc := "" + dynimports := "" + linknames := "" + var vars []string + // COMMON + textcommon := "" + for _, path := range flag.Args() { + file, err := os.Open(path) + if err != nil { + fmt.Fprintf(os.Stderr, err.Error()) + os.Exit(1) + } + s := bufio.NewScanner(file) + for s.Scan() { + t := s.Text() + t = strings.TrimSpace(t) + t = regexp.MustCompile(`\s+`).ReplaceAllString(t, ` `) + if p := regexp.MustCompile(`^package (\S+)$`).FindStringSubmatch(t); p != nil && pack == "" { + pack = p[1] + } + nonblock := regexp.MustCompile(`^\/\/sysnb `).FindStringSubmatch(t) + if regexp.MustCompile(`^\/\/sys `).FindStringSubmatch(t) == nil && nonblock == nil { + continue + } + + // Line must be of the form + // func Open(path string, mode int, perm int) (fd int, err error) + // Split into name, in params, out params. + f := regexp.MustCompile(`^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$`).FindStringSubmatch(t) + if f == nil { + fmt.Fprintf(os.Stderr, "%s:%s\nmalformed //sys declaration\n", path, t) + os.Exit(1) + } + funct, inps, outps, modname, sysname := f[2], f[3], f[4], f[5], f[6] + + // Split argument lists on comma. + in := parseParamList(inps) + out := parseParamList(outps) + + inps = strings.Join(in, ", ") + outps = strings.Join(out, ", ") + + if sysname == "" { + sysname = funct + } + + onlyCommon := false + if funct == "readlen" || funct == "writelen" || funct == "FcntlInt" || funct == "FcntlFlock" { + // This function call another syscall which is already implemented. + // Therefore, the gc and gccgo part must not be generated. + onlyCommon = true + } + + // Try in vain to keep people from editing this file. + // The theory is that they jump into the middle of the file + // without reading the header. + + textcommon += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" + if !onlyCommon { + textgccgo += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" + textgc += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" + } + + // Check if value return, err return available + errvar := "" + rettype := "" + for _, param := range out { + p := parseParam(param) + if p.Type == "error" { + errvar = p.Name + } else { + rettype = p.Type + } + } + + sysname = regexp.MustCompile(`([a-z])([A-Z])`).ReplaceAllString(sysname, `${1}_$2`) + sysname = strings.ToLower(sysname) // All libc functions are lowercase. + + // GCCGO Prototype return type + cRettype := "" + if rettype == "unsafe.Pointer" { + cRettype = "uintptr_t" + } else if rettype == "uintptr" { + cRettype = "uintptr_t" + } else if regexp.MustCompile(`^_`).FindStringSubmatch(rettype) != nil { + cRettype = "uintptr_t" + } else if rettype == "int" { + cRettype = "int" + } else if rettype == "int32" { + cRettype = "int" + } else if rettype == "int64" { + cRettype = "long long" + } else if rettype == "uint32" { + cRettype = "unsigned int" + } else if rettype == "uint64" { + cRettype = "unsigned long long" + } else { + cRettype = "int" + } + if sysname == "exit" { + cRettype = "void" + } + + // GCCGO Prototype arguments type + var cIn []string + for i, param := range in { + p := parseParam(param) + if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { + cIn = append(cIn, "uintptr_t") + } else if p.Type == "string" { + cIn = append(cIn, "uintptr_t") + } else if regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type) != nil { + cIn = append(cIn, "uintptr_t", "size_t") + } else if p.Type == "unsafe.Pointer" { + cIn = append(cIn, "uintptr_t") + } else if p.Type == "uintptr" { + cIn = append(cIn, "uintptr_t") + } else if regexp.MustCompile(`^_`).FindStringSubmatch(p.Type) != nil { + cIn = append(cIn, "uintptr_t") + } else if p.Type == "int" { + if (i == 0 || i == 2) && funct == "fcntl" { + // These fcntl arguments needs to be uintptr to be able to call FcntlInt and FcntlFlock + cIn = append(cIn, "uintptr_t") + } else { + cIn = append(cIn, "int") + } + + } else if p.Type == "int32" { + cIn = append(cIn, "int") + } else if p.Type == "int64" { + cIn = append(cIn, "long long") + } else if p.Type == "uint32" { + cIn = append(cIn, "unsigned int") + } else if p.Type == "uint64" { + cIn = append(cIn, "unsigned long long") + } else { + cIn = append(cIn, "int") + } + } + + if !onlyCommon { + // GCCGO Prototype Generation + // Imports of system calls from libc + if sysname == "select" { + // select is a keyword of Go. Its name is + // changed to c_select. + cExtern += "#define c_select select\n" + } + cExtern += fmt.Sprintf("%s %s", cRettype, sysname) + cIn := strings.Join(cIn, ", ") + cExtern += fmt.Sprintf("(%s);\n", cIn) + } + // GC Library name + if modname == "" { + modname = "libc.a/shr_64.o" + } else { + fmt.Fprintf(os.Stderr, "%s: only syscall using libc are available\n", funct) + os.Exit(1) + } + sysvarname := fmt.Sprintf("libc_%s", sysname) + + if !onlyCommon { + // GC Runtime import of function to allow cross-platform builds. + dynimports += fmt.Sprintf("//go:cgo_import_dynamic %s %s \"%s\"\n", sysvarname, sysname, modname) + // GC Link symbol to proc address variable. + linknames += fmt.Sprintf("//go:linkname %s %s\n", sysvarname, sysvarname) + // GC Library proc address variable. + vars = append(vars, sysvarname) + } + + strconvfunc := "BytePtrFromString" + strconvtype := "*byte" + + // Go function header. + if outps != "" { + outps = fmt.Sprintf(" (%s)", outps) + } + if textcommon != "" { + textcommon += "\n" + } + + textcommon += fmt.Sprintf("func %s(%s)%s {\n", funct, strings.Join(in, ", "), outps) + + // Prepare arguments tocall. + var argscommon []string // Arguments in the common part + var argscall []string // Arguments for call prototype + var argsgc []string // Arguments for gc call (with syscall6) + var argsgccgo []string // Arguments for gccgo call (with C.name_of_syscall) + n := 0 + argN := 0 + for _, param := range in { + p := parseParam(param) + if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { + argscommon = append(argscommon, fmt.Sprintf("uintptr(unsafe.Pointer(%s))", p.Name)) + argscall = append(argscall, fmt.Sprintf("%s uintptr", p.Name)) + argsgc = append(argsgc, p.Name) + argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) + } else if p.Type == "string" && errvar != "" { + textcommon += fmt.Sprintf("\tvar _p%d %s\n", n, strconvtype) + textcommon += fmt.Sprintf("\t_p%d, %s = %s(%s)\n", n, errvar, strconvfunc, p.Name) + textcommon += fmt.Sprintf("\tif %s != nil {\n\t\treturn\n\t}\n", errvar) + + argscommon = append(argscommon, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) + argscall = append(argscall, fmt.Sprintf("_p%d uintptr ", n)) + argsgc = append(argsgc, fmt.Sprintf("_p%d", n)) + argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(_p%d)", n)) + n++ + } else if p.Type == "string" { + fmt.Fprintf(os.Stderr, path+":"+funct+" uses string arguments, but has no error return\n") + textcommon += fmt.Sprintf("\tvar _p%d %s\n", n, strconvtype) + textcommon += fmt.Sprintf("\t_p%d, %s = %s(%s)\n", n, errvar, strconvfunc, p.Name) + textcommon += fmt.Sprintf("\tif %s != nil {\n\t\treturn\n\t}\n", errvar) + + argscommon = append(argscommon, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) + argscall = append(argscall, fmt.Sprintf("_p%d uintptr", n)) + argsgc = append(argsgc, fmt.Sprintf("_p%d", n)) + argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(_p%d)", n)) + n++ + } else if m := regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type); m != nil { + // Convert slice into pointer, length. + // Have to be careful not to take address of &a[0] if len == 0: + // pass nil in that case. + textcommon += fmt.Sprintf("\tvar _p%d *%s\n", n, m[1]) + textcommon += fmt.Sprintf("\tif len(%s) > 0 {\n\t\t_p%d = &%s[0]\n\t}\n", p.Name, n, p.Name) + argscommon = append(argscommon, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n), fmt.Sprintf("len(%s)", p.Name)) + argscall = append(argscall, fmt.Sprintf("_p%d uintptr", n), fmt.Sprintf("_lenp%d int", n)) + argsgc = append(argsgc, fmt.Sprintf("_p%d", n), fmt.Sprintf("uintptr(_lenp%d)", n)) + argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(_p%d)", n), fmt.Sprintf("C.size_t(_lenp%d)", n)) + n++ + } else if p.Type == "int64" && endianness != "" { + fmt.Fprintf(os.Stderr, path+":"+funct+" uses int64 with 32 bits mode. Case not yet implemented\n") + } else if p.Type == "bool" { + fmt.Fprintf(os.Stderr, path+":"+funct+" uses bool. Case not yet implemented\n") + } else if regexp.MustCompile(`^_`).FindStringSubmatch(p.Type) != nil || p.Type == "unsafe.Pointer" { + argscommon = append(argscommon, fmt.Sprintf("uintptr(%s)", p.Name)) + argscall = append(argscall, fmt.Sprintf("%s uintptr", p.Name)) + argsgc = append(argsgc, p.Name) + argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) + } else if p.Type == "int" { + if (argN == 0 || argN == 2) && ((funct == "fcntl") || (funct == "FcntlInt") || (funct == "FcntlFlock")) { + // These fcntl arguments need to be uintptr to be able to call FcntlInt and FcntlFlock + argscommon = append(argscommon, fmt.Sprintf("uintptr(%s)", p.Name)) + argscall = append(argscall, fmt.Sprintf("%s uintptr", p.Name)) + argsgc = append(argsgc, p.Name) + argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) + + } else { + argscommon = append(argscommon, p.Name) + argscall = append(argscall, fmt.Sprintf("%s int", p.Name)) + argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) + argsgccgo = append(argsgccgo, fmt.Sprintf("C.int(%s)", p.Name)) + } + } else if p.Type == "int32" { + argscommon = append(argscommon, p.Name) + argscall = append(argscall, fmt.Sprintf("%s int32", p.Name)) + argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) + argsgccgo = append(argsgccgo, fmt.Sprintf("C.int(%s)", p.Name)) + } else if p.Type == "int64" { + argscommon = append(argscommon, p.Name) + argscall = append(argscall, fmt.Sprintf("%s int64", p.Name)) + argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) + argsgccgo = append(argsgccgo, fmt.Sprintf("C.longlong(%s)", p.Name)) + } else if p.Type == "uint32" { + argscommon = append(argscommon, p.Name) + argscall = append(argscall, fmt.Sprintf("%s uint32", p.Name)) + argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) + argsgccgo = append(argsgccgo, fmt.Sprintf("C.uint(%s)", p.Name)) + } else if p.Type == "uint64" { + argscommon = append(argscommon, p.Name) + argscall = append(argscall, fmt.Sprintf("%s uint64", p.Name)) + argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) + argsgccgo = append(argsgccgo, fmt.Sprintf("C.ulonglong(%s)", p.Name)) + } else if p.Type == "uintptr" { + argscommon = append(argscommon, p.Name) + argscall = append(argscall, fmt.Sprintf("%s uintptr", p.Name)) + argsgc = append(argsgc, p.Name) + argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) + } else { + argscommon = append(argscommon, fmt.Sprintf("int(%s)", p.Name)) + argscall = append(argscall, fmt.Sprintf("%s int", p.Name)) + argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) + argsgccgo = append(argsgccgo, fmt.Sprintf("C.int(%s)", p.Name)) + } + argN++ + } + nargs := len(argsgc) + + // COMMON function generation + argscommonlist := strings.Join(argscommon, ", ") + callcommon := fmt.Sprintf("call%s(%s)", sysname, argscommonlist) + ret := []string{"_", "_"} + body := "" + doErrno := false + for i := 0; i < len(out); i++ { + p := parseParam(out[i]) + reg := "" + if p.Name == "err" { + reg = "e1" + ret[1] = reg + doErrno = true + } else { + reg = "r0" + ret[0] = reg + } + if p.Type == "bool" { + reg = fmt.Sprintf("%s != 0", reg) + } + if reg != "e1" { + body += fmt.Sprintf("\t%s = %s(%s)\n", p.Name, p.Type, reg) + } + } + if ret[0] == "_" && ret[1] == "_" { + textcommon += fmt.Sprintf("\t%s\n", callcommon) + } else { + textcommon += fmt.Sprintf("\t%s, %s := %s\n", ret[0], ret[1], callcommon) + } + textcommon += body + + if doErrno { + textcommon += "\tif e1 != 0 {\n" + textcommon += "\t\terr = errnoErr(e1)\n" + textcommon += "\t}\n" + } + textcommon += "\treturn\n" + textcommon += "}\n" + + if onlyCommon { + continue + } + + // CALL Prototype + callProto := fmt.Sprintf("func call%s(%s) (r1 uintptr, e1 Errno) {\n", sysname, strings.Join(argscall, ", ")) + + // GC function generation + asm := "syscall6" + if nonblock != nil { + asm = "rawSyscall6" + } + + if len(argsgc) <= 6 { + for len(argsgc) < 6 { + argsgc = append(argsgc, "0") + } + } else { + fmt.Fprintf(os.Stderr, "%s: too many arguments to system call", funct) + os.Exit(1) + } + argsgclist := strings.Join(argsgc, ", ") + callgc := fmt.Sprintf("%s(uintptr(unsafe.Pointer(&%s)), %d, %s)", asm, sysvarname, nargs, argsgclist) + + textgc += callProto + textgc += fmt.Sprintf("\tr1, _, e1 = %s\n", callgc) + textgc += "\treturn\n}\n" + + // GCCGO function generation + argsgccgolist := strings.Join(argsgccgo, ", ") + var callgccgo string + if sysname == "select" { + // select is a keyword of Go. Its name is + // changed to c_select. + callgccgo = fmt.Sprintf("C.c_%s(%s)", sysname, argsgccgolist) + } else { + callgccgo = fmt.Sprintf("C.%s(%s)", sysname, argsgccgolist) + } + textgccgo += callProto + textgccgo += fmt.Sprintf("\tr1 = uintptr(%s)\n", callgccgo) + textgccgo += "\te1 = syscall.GetErrno()\n" + textgccgo += "\treturn\n}\n" + } + if err := s.Err(); err != nil { + fmt.Fprintf(os.Stderr, err.Error()) + os.Exit(1) + } + file.Close() + } + imp := "" + if pack != "unix" { + imp = "import \"golang.org/x/sys/unix\"\n" + + } + + // Print zsyscall_aix_ppc64.go + err := ioutil.WriteFile("zsyscall_aix_ppc64.go", + []byte(fmt.Sprintf(srcTemplate1, cmdLine(), buildTags(), pack, imp, textcommon)), + 0644) + if err != nil { + fmt.Fprintf(os.Stderr, err.Error()) + os.Exit(1) + } + + // Print zsyscall_aix_ppc64_gc.go + vardecls := "\t" + strings.Join(vars, ",\n\t") + vardecls += " syscallFunc" + err = ioutil.WriteFile("zsyscall_aix_ppc64_gc.go", + []byte(fmt.Sprintf(srcTemplate2, cmdLine(), buildTags(), pack, imp, dynimports, linknames, vardecls, textgc)), + 0644) + if err != nil { + fmt.Fprintf(os.Stderr, err.Error()) + os.Exit(1) + } + + // Print zsyscall_aix_ppc64_gccgo.go + err = ioutil.WriteFile("zsyscall_aix_ppc64_gccgo.go", + []byte(fmt.Sprintf(srcTemplate3, cmdLine(), buildTags(), pack, cExtern, imp, textgccgo)), + 0644) + if err != nil { + fmt.Fprintf(os.Stderr, err.Error()) + os.Exit(1) + } +} + +const srcTemplate1 = `// %s +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build %s + +package %s + +import ( + "unsafe" +) + + +%s + +%s +` +const srcTemplate2 = `// %s +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build %s +// +build !gccgo + +package %s + +import ( + "unsafe" +) +%s +%s +%s +type syscallFunc uintptr + +var ( +%s +) + +// Implemented in runtime/syscall_aix.go. +func rawSyscall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) +func syscall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) + +%s +` +const srcTemplate3 = `// %s +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build %s +// +build gccgo + +package %s + +%s +*/ +import "C" +import ( + "syscall" +) + + +%s + +%s +` diff --git a/vendor/golang.org/x/sys/unix/mksyscall_solaris.go b/vendor/golang.org/x/sys/unix/mksyscall_solaris.go new file mode 100644 index 000000000..3d864738b --- /dev/null +++ b/vendor/golang.org/x/sys/unix/mksyscall_solaris.go @@ -0,0 +1,335 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +/* + This program reads a file containing function prototypes + (like syscall_solaris.go) and generates system call bodies. + The prototypes are marked by lines beginning with "//sys" + and read like func declarations if //sys is replaced by func, but: + * The parameter lists must give a name for each argument. + This includes return parameters. + * The parameter lists must give a type for each argument: + the (x, y, z int) shorthand is not allowed. + * If the return parameter is an error number, it must be named err. + * If go func name needs to be different than its libc name, + * or the function is not in libc, name could be specified + * at the end, after "=" sign, like + //sys getsockopt(s int, level int, name int, val uintptr, vallen *_Socklen) (err error) = libsocket.getsockopt +*/ + +package main + +import ( + "bufio" + "flag" + "fmt" + "os" + "regexp" + "strings" +) + +var ( + b32 = flag.Bool("b32", false, "32bit big-endian") + l32 = flag.Bool("l32", false, "32bit little-endian") + tags = flag.String("tags", "", "build tags") +) + +// cmdLine returns this programs's commandline arguments +func cmdLine() string { + return "go run mksyscall_solaris.go " + strings.Join(os.Args[1:], " ") +} + +// buildTags returns build tags +func buildTags() string { + return *tags +} + +// Param is function parameter +type Param struct { + Name string + Type string +} + +// usage prints the program usage +func usage() { + fmt.Fprintf(os.Stderr, "usage: go run mksyscall_solaris.go [-b32 | -l32] [-tags x,y] [file ...]\n") + os.Exit(1) +} + +// parseParamList parses parameter list and returns a slice of parameters +func parseParamList(list string) []string { + list = strings.TrimSpace(list) + if list == "" { + return []string{} + } + return regexp.MustCompile(`\s*,\s*`).Split(list, -1) +} + +// parseParam splits a parameter into name and type +func parseParam(p string) Param { + ps := regexp.MustCompile(`^(\S*) (\S*)$`).FindStringSubmatch(p) + if ps == nil { + fmt.Fprintf(os.Stderr, "malformed parameter: %s\n", p) + os.Exit(1) + } + return Param{ps[1], ps[2]} +} + +func main() { + flag.Usage = usage + flag.Parse() + if len(flag.Args()) <= 0 { + fmt.Fprintf(os.Stderr, "no files to parse provided\n") + usage() + } + + endianness := "" + if *b32 { + endianness = "big-endian" + } else if *l32 { + endianness = "little-endian" + } + + pack := "" + text := "" + dynimports := "" + linknames := "" + var vars []string + for _, path := range flag.Args() { + file, err := os.Open(path) + if err != nil { + fmt.Fprintf(os.Stderr, err.Error()) + os.Exit(1) + } + s := bufio.NewScanner(file) + for s.Scan() { + t := s.Text() + t = strings.TrimSpace(t) + t = regexp.MustCompile(`\s+`).ReplaceAllString(t, ` `) + if p := regexp.MustCompile(`^package (\S+)$`).FindStringSubmatch(t); p != nil && pack == "" { + pack = p[1] + } + nonblock := regexp.MustCompile(`^\/\/sysnb `).FindStringSubmatch(t) + if regexp.MustCompile(`^\/\/sys `).FindStringSubmatch(t) == nil && nonblock == nil { + continue + } + + // Line must be of the form + // func Open(path string, mode int, perm int) (fd int, err error) + // Split into name, in params, out params. + f := regexp.MustCompile(`^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$`).FindStringSubmatch(t) + if f == nil { + fmt.Fprintf(os.Stderr, "%s:%s\nmalformed //sys declaration\n", path, t) + os.Exit(1) + } + funct, inps, outps, modname, sysname := f[2], f[3], f[4], f[5], f[6] + + // Split argument lists on comma. + in := parseParamList(inps) + out := parseParamList(outps) + + inps = strings.Join(in, ", ") + outps = strings.Join(out, ", ") + + // Try in vain to keep people from editing this file. + // The theory is that they jump into the middle of the file + // without reading the header. + text += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" + + // So file name. + if modname == "" { + modname = "libc" + } + + // System call name. + if sysname == "" { + sysname = funct + } + + // System call pointer variable name. + sysvarname := fmt.Sprintf("proc%s", sysname) + + strconvfunc := "BytePtrFromString" + strconvtype := "*byte" + + sysname = strings.ToLower(sysname) // All libc functions are lowercase. + + // Runtime import of function to allow cross-platform builds. + dynimports += fmt.Sprintf("//go:cgo_import_dynamic libc_%s %s \"%s.so\"\n", sysname, sysname, modname) + // Link symbol to proc address variable. + linknames += fmt.Sprintf("//go:linkname %s libc_%s\n", sysvarname, sysname) + // Library proc address variable. + vars = append(vars, sysvarname) + + // Go function header. + outlist := strings.Join(out, ", ") + if outlist != "" { + outlist = fmt.Sprintf(" (%s)", outlist) + } + if text != "" { + text += "\n" + } + text += fmt.Sprintf("func %s(%s)%s {\n", funct, strings.Join(in, ", "), outlist) + + // Check if err return available + errvar := "" + for _, param := range out { + p := parseParam(param) + if p.Type == "error" { + errvar = p.Name + continue + } + } + + // Prepare arguments to Syscall. + var args []string + n := 0 + for _, param := range in { + p := parseParam(param) + if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { + args = append(args, "uintptr(unsafe.Pointer("+p.Name+"))") + } else if p.Type == "string" && errvar != "" { + text += fmt.Sprintf("\tvar _p%d %s\n", n, strconvtype) + text += fmt.Sprintf("\t_p%d, %s = %s(%s)\n", n, errvar, strconvfunc, p.Name) + text += fmt.Sprintf("\tif %s != nil {\n\t\treturn\n\t}\n", errvar) + args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) + n++ + } else if p.Type == "string" { + fmt.Fprintf(os.Stderr, path+":"+funct+" uses string arguments, but has no error return\n") + text += fmt.Sprintf("\tvar _p%d %s\n", n, strconvtype) + text += fmt.Sprintf("\t_p%d, _ = %s(%s)\n", n, strconvfunc, p.Name) + args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) + n++ + } else if s := regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type); s != nil { + // Convert slice into pointer, length. + // Have to be careful not to take address of &a[0] if len == 0: + // pass nil in that case. + text += fmt.Sprintf("\tvar _p%d *%s\n", n, s[1]) + text += fmt.Sprintf("\tif len(%s) > 0 {\n\t\t_p%d = &%s[0]\n\t}\n", p.Name, n, p.Name) + args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n), fmt.Sprintf("uintptr(len(%s))", p.Name)) + n++ + } else if p.Type == "int64" && endianness != "" { + if endianness == "big-endian" { + args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name)) + } else { + args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name)) + } + } else if p.Type == "bool" { + text += fmt.Sprintf("\tvar _p%d uint32\n", n) + text += fmt.Sprintf("\tif %s {\n\t\t_p%d = 1\n\t} else {\n\t\t_p%d = 0\n\t}\n", p.Name, n, n) + args = append(args, fmt.Sprintf("uintptr(_p%d)", n)) + n++ + } else { + args = append(args, fmt.Sprintf("uintptr(%s)", p.Name)) + } + } + nargs := len(args) + + // Determine which form to use; pad args with zeros. + asm := "sysvicall6" + if nonblock != nil { + asm = "rawSysvicall6" + } + if len(args) <= 6 { + for len(args) < 6 { + args = append(args, "0") + } + } else { + fmt.Fprintf(os.Stderr, "%s: too many arguments to system call\n", path) + os.Exit(1) + } + + // Actual call. + arglist := strings.Join(args, ", ") + call := fmt.Sprintf("%s(uintptr(unsafe.Pointer(&%s)), %d, %s)", asm, sysvarname, nargs, arglist) + + // Assign return values. + body := "" + ret := []string{"_", "_", "_"} + doErrno := false + for i := 0; i < len(out); i++ { + p := parseParam(out[i]) + reg := "" + if p.Name == "err" { + reg = "e1" + ret[2] = reg + doErrno = true + } else { + reg = fmt.Sprintf("r%d", i) + ret[i] = reg + } + if p.Type == "bool" { + reg = fmt.Sprintf("%d != 0", reg) + } + if p.Type == "int64" && endianness != "" { + // 64-bit number in r1:r0 or r0:r1. + if i+2 > len(out) { + fmt.Fprintf(os.Stderr, "%s: not enough registers for int64 return\n", path) + os.Exit(1) + } + if endianness == "big-endian" { + reg = fmt.Sprintf("int64(r%d)<<32 | int64(r%d)", i, i+1) + } else { + reg = fmt.Sprintf("int64(r%d)<<32 | int64(r%d)", i+1, i) + } + ret[i] = fmt.Sprintf("r%d", i) + ret[i+1] = fmt.Sprintf("r%d", i+1) + } + if reg != "e1" { + body += fmt.Sprintf("\t%s = %s(%s)\n", p.Name, p.Type, reg) + } + } + if ret[0] == "_" && ret[1] == "_" && ret[2] == "_" { + text += fmt.Sprintf("\t%s\n", call) + } else { + text += fmt.Sprintf("\t%s, %s, %s := %s\n", ret[0], ret[1], ret[2], call) + } + text += body + + if doErrno { + text += "\tif e1 != 0 {\n" + text += "\t\terr = e1\n" + text += "\t}\n" + } + text += "\treturn\n" + text += "}\n" + } + if err := s.Err(); err != nil { + fmt.Fprintf(os.Stderr, err.Error()) + os.Exit(1) + } + file.Close() + } + imp := "" + if pack != "unix" { + imp = "import \"golang.org/x/sys/unix\"\n" + + } + vardecls := "\t" + strings.Join(vars, ",\n\t") + vardecls += " syscallFunc" + fmt.Printf(srcTemplate, cmdLine(), buildTags(), pack, imp, dynimports, linknames, vardecls, text) +} + +const srcTemplate = `// %s +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build %s + +package %s + +import ( + "syscall" + "unsafe" +) +%s +%s +%s +var ( +%s +) + +%s +` diff --git a/vendor/golang.org/x/sys/unix/mksysctl_openbsd.go b/vendor/golang.org/x/sys/unix/mksysctl_openbsd.go new file mode 100644 index 000000000..b6b409909 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/mksysctl_openbsd.go @@ -0,0 +1,355 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +// Parse the header files for OpenBSD and generate a Go usable sysctl MIB. +// +// Build a MIB with each entry being an array containing the level, type and +// a hash that will contain additional entries if the current entry is a node. +// We then walk this MIB and create a flattened sysctl name to OID hash. + +package main + +import ( + "bufio" + "fmt" + "os" + "path/filepath" + "regexp" + "sort" + "strings" +) + +var ( + goos, goarch string +) + +// cmdLine returns this programs's commandline arguments. +func cmdLine() string { + return "go run mksysctl_openbsd.go " + strings.Join(os.Args[1:], " ") +} + +// buildTags returns build tags. +func buildTags() string { + return fmt.Sprintf("%s,%s", goarch, goos) +} + +// reMatch performs regular expression match and stores the substring slice to value pointed by m. +func reMatch(re *regexp.Regexp, str string, m *[]string) bool { + *m = re.FindStringSubmatch(str) + if *m != nil { + return true + } + return false +} + +type nodeElement struct { + n int + t string + pE *map[string]nodeElement +} + +var ( + debugEnabled bool + mib map[string]nodeElement + node *map[string]nodeElement + nodeMap map[string]string + sysCtl []string +) + +var ( + ctlNames1RE = regexp.MustCompile(`^#define\s+(CTL_NAMES)\s+{`) + ctlNames2RE = regexp.MustCompile(`^#define\s+(CTL_(.*)_NAMES)\s+{`) + ctlNames3RE = regexp.MustCompile(`^#define\s+((.*)CTL_NAMES)\s+{`) + netInetRE = regexp.MustCompile(`^netinet/`) + netInet6RE = regexp.MustCompile(`^netinet6/`) + netRE = regexp.MustCompile(`^net/`) + bracesRE = regexp.MustCompile(`{.*}`) + ctlTypeRE = regexp.MustCompile(`{\s+"(\w+)",\s+(CTLTYPE_[A-Z]+)\s+}`) + fsNetKernRE = regexp.MustCompile(`^(fs|net|kern)_`) +) + +func debug(s string) { + if debugEnabled { + fmt.Fprintln(os.Stderr, s) + } +} + +// Walk the MIB and build a sysctl name to OID mapping. +func buildSysctl(pNode *map[string]nodeElement, name string, oid []int) { + lNode := pNode // local copy of pointer to node + var keys []string + for k := range *lNode { + keys = append(keys, k) + } + sort.Strings(keys) + + for _, key := range keys { + nodename := name + if name != "" { + nodename += "." + } + nodename += key + + nodeoid := append(oid, (*pNode)[key].n) + + if (*pNode)[key].t == `CTLTYPE_NODE` { + if _, ok := nodeMap[nodename]; ok { + lNode = &mib + ctlName := nodeMap[nodename] + for _, part := range strings.Split(ctlName, ".") { + lNode = ((*lNode)[part]).pE + } + } else { + lNode = (*pNode)[key].pE + } + buildSysctl(lNode, nodename, nodeoid) + } else if (*pNode)[key].t != "" { + oidStr := []string{} + for j := range nodeoid { + oidStr = append(oidStr, fmt.Sprintf("%d", nodeoid[j])) + } + text := "\t{ \"" + nodename + "\", []_C_int{ " + strings.Join(oidStr, ", ") + " } }, \n" + sysCtl = append(sysCtl, text) + } + } +} + +func main() { + // Get the OS (using GOOS_TARGET if it exist) + goos = os.Getenv("GOOS_TARGET") + if goos == "" { + goos = os.Getenv("GOOS") + } + // Get the architecture (using GOARCH_TARGET if it exists) + goarch = os.Getenv("GOARCH_TARGET") + if goarch == "" { + goarch = os.Getenv("GOARCH") + } + // Check if GOOS and GOARCH environment variables are defined + if goarch == "" || goos == "" { + fmt.Fprintf(os.Stderr, "GOARCH or GOOS not defined in environment\n") + os.Exit(1) + } + + mib = make(map[string]nodeElement) + headers := [...]string{ + `sys/sysctl.h`, + `sys/socket.h`, + `sys/tty.h`, + `sys/malloc.h`, + `sys/mount.h`, + `sys/namei.h`, + `sys/sem.h`, + `sys/shm.h`, + `sys/vmmeter.h`, + `uvm/uvmexp.h`, + `uvm/uvm_param.h`, + `uvm/uvm_swap_encrypt.h`, + `ddb/db_var.h`, + `net/if.h`, + `net/if_pfsync.h`, + `net/pipex.h`, + `netinet/in.h`, + `netinet/icmp_var.h`, + `netinet/igmp_var.h`, + `netinet/ip_ah.h`, + `netinet/ip_carp.h`, + `netinet/ip_divert.h`, + `netinet/ip_esp.h`, + `netinet/ip_ether.h`, + `netinet/ip_gre.h`, + `netinet/ip_ipcomp.h`, + `netinet/ip_ipip.h`, + `netinet/pim_var.h`, + `netinet/tcp_var.h`, + `netinet/udp_var.h`, + `netinet6/in6.h`, + `netinet6/ip6_divert.h`, + `netinet6/pim6_var.h`, + `netinet/icmp6.h`, + `netmpls/mpls.h`, + } + + ctls := [...]string{ + `kern`, + `vm`, + `fs`, + `net`, + //debug /* Special handling required */ + `hw`, + //machdep /* Arch specific */ + `user`, + `ddb`, + //vfs /* Special handling required */ + `fs.posix`, + `kern.forkstat`, + `kern.intrcnt`, + `kern.malloc`, + `kern.nchstats`, + `kern.seminfo`, + `kern.shminfo`, + `kern.timecounter`, + `kern.tty`, + `kern.watchdog`, + `net.bpf`, + `net.ifq`, + `net.inet`, + `net.inet.ah`, + `net.inet.carp`, + `net.inet.divert`, + `net.inet.esp`, + `net.inet.etherip`, + `net.inet.gre`, + `net.inet.icmp`, + `net.inet.igmp`, + `net.inet.ip`, + `net.inet.ip.ifq`, + `net.inet.ipcomp`, + `net.inet.ipip`, + `net.inet.mobileip`, + `net.inet.pfsync`, + `net.inet.pim`, + `net.inet.tcp`, + `net.inet.udp`, + `net.inet6`, + `net.inet6.divert`, + `net.inet6.ip6`, + `net.inet6.icmp6`, + `net.inet6.pim6`, + `net.inet6.tcp6`, + `net.inet6.udp6`, + `net.mpls`, + `net.mpls.ifq`, + `net.key`, + `net.pflow`, + `net.pfsync`, + `net.pipex`, + `net.rt`, + `vm.swapencrypt`, + //vfsgenctl /* Special handling required */ + } + + // Node name "fixups" + ctlMap := map[string]string{ + "ipproto": "net.inet", + "net.inet.ipproto": "net.inet", + "net.inet6.ipv6proto": "net.inet6", + "net.inet6.ipv6": "net.inet6.ip6", + "net.inet.icmpv6": "net.inet6.icmp6", + "net.inet6.divert6": "net.inet6.divert", + "net.inet6.tcp6": "net.inet.tcp", + "net.inet6.udp6": "net.inet.udp", + "mpls": "net.mpls", + "swpenc": "vm.swapencrypt", + } + + // Node mappings + nodeMap = map[string]string{ + "net.inet.ip.ifq": "net.ifq", + "net.inet.pfsync": "net.pfsync", + "net.mpls.ifq": "net.ifq", + } + + mCtls := make(map[string]bool) + for _, ctl := range ctls { + mCtls[ctl] = true + } + + for _, header := range headers { + debug("Processing " + header) + file, err := os.Open(filepath.Join("/usr/include", header)) + if err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) + os.Exit(1) + } + s := bufio.NewScanner(file) + for s.Scan() { + var sub []string + if reMatch(ctlNames1RE, s.Text(), &sub) || + reMatch(ctlNames2RE, s.Text(), &sub) || + reMatch(ctlNames3RE, s.Text(), &sub) { + if sub[1] == `CTL_NAMES` { + // Top level. + node = &mib + } else { + // Node. + nodename := strings.ToLower(sub[2]) + ctlName := "" + if reMatch(netInetRE, header, &sub) { + ctlName = "net.inet." + nodename + } else if reMatch(netInet6RE, header, &sub) { + ctlName = "net.inet6." + nodename + } else if reMatch(netRE, header, &sub) { + ctlName = "net." + nodename + } else { + ctlName = nodename + ctlName = fsNetKernRE.ReplaceAllString(ctlName, `$1.`) + } + + if val, ok := ctlMap[ctlName]; ok { + ctlName = val + } + if _, ok := mCtls[ctlName]; !ok { + debug("Ignoring " + ctlName + "...") + continue + } + + // Walk down from the top of the MIB. + node = &mib + for _, part := range strings.Split(ctlName, ".") { + if _, ok := (*node)[part]; !ok { + debug("Missing node " + part) + (*node)[part] = nodeElement{n: 0, t: "", pE: &map[string]nodeElement{}} + } + node = (*node)[part].pE + } + } + + // Populate current node with entries. + i := -1 + for !strings.HasPrefix(s.Text(), "}") { + s.Scan() + if reMatch(bracesRE, s.Text(), &sub) { + i++ + } + if !reMatch(ctlTypeRE, s.Text(), &sub) { + continue + } + (*node)[sub[1]] = nodeElement{n: i, t: sub[2], pE: &map[string]nodeElement{}} + } + } + } + err = s.Err() + if err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) + os.Exit(1) + } + file.Close() + } + buildSysctl(&mib, "", []int{}) + + sort.Strings(sysCtl) + text := strings.Join(sysCtl, "") + + fmt.Printf(srcTemplate, cmdLine(), buildTags(), text) +} + +const srcTemplate = `// %s +// Code generated by the command above; DO NOT EDIT. + +// +build %s + +package unix + +type mibentry struct { + ctlname string + ctloid []_C_int +} + +var sysctlMib = []mibentry { +%s +} +` diff --git a/vendor/golang.org/x/sys/unix/mksysnum.go b/vendor/golang.org/x/sys/unix/mksysnum.go new file mode 100644 index 000000000..baa6ecd85 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/mksysnum.go @@ -0,0 +1,190 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +// Generate system call table for DragonFly, NetBSD, +// FreeBSD, OpenBSD or Darwin from master list +// (for example, /usr/src/sys/kern/syscalls.master or +// sys/syscall.h). +package main + +import ( + "bufio" + "fmt" + "io" + "io/ioutil" + "net/http" + "os" + "regexp" + "strings" +) + +var ( + goos, goarch string +) + +// cmdLine returns this programs's commandline arguments +func cmdLine() string { + return "go run mksysnum.go " + strings.Join(os.Args[1:], " ") +} + +// buildTags returns build tags +func buildTags() string { + return fmt.Sprintf("%s,%s", goarch, goos) +} + +func checkErr(err error) { + if err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) + os.Exit(1) + } +} + +// source string and substring slice for regexp +type re struct { + str string // source string + sub []string // matched sub-string +} + +// Match performs regular expression match +func (r *re) Match(exp string) bool { + r.sub = regexp.MustCompile(exp).FindStringSubmatch(r.str) + if r.sub != nil { + return true + } + return false +} + +// fetchFile fetches a text file from URL +func fetchFile(URL string) io.Reader { + resp, err := http.Get(URL) + checkErr(err) + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + checkErr(err) + return strings.NewReader(string(body)) +} + +// readFile reads a text file from path +func readFile(path string) io.Reader { + file, err := os.Open(os.Args[1]) + checkErr(err) + return file +} + +func format(name, num, proto string) string { + name = strings.ToUpper(name) + // There are multiple entries for enosys and nosys, so comment them out. + nm := re{str: name} + if nm.Match(`^SYS_E?NOSYS$`) { + name = fmt.Sprintf("// %s", name) + } + if name == `SYS_SYS_EXIT` { + name = `SYS_EXIT` + } + return fmt.Sprintf(" %s = %s; // %s\n", name, num, proto) +} + +func main() { + // Get the OS (using GOOS_TARGET if it exist) + goos = os.Getenv("GOOS_TARGET") + if goos == "" { + goos = os.Getenv("GOOS") + } + // Get the architecture (using GOARCH_TARGET if it exists) + goarch = os.Getenv("GOARCH_TARGET") + if goarch == "" { + goarch = os.Getenv("GOARCH") + } + // Check if GOOS and GOARCH environment variables are defined + if goarch == "" || goos == "" { + fmt.Fprintf(os.Stderr, "GOARCH or GOOS not defined in environment\n") + os.Exit(1) + } + + file := strings.TrimSpace(os.Args[1]) + var syscalls io.Reader + if strings.HasPrefix(file, "https://") || strings.HasPrefix(file, "http://") { + // Download syscalls.master file + syscalls = fetchFile(file) + } else { + syscalls = readFile(file) + } + + var text, line string + s := bufio.NewScanner(syscalls) + for s.Scan() { + t := re{str: line} + if t.Match(`^(.*)\\$`) { + // Handle continuation + line = t.sub[1] + line += strings.TrimLeft(s.Text(), " \t") + } else { + // New line + line = s.Text() + } + t = re{str: line} + if t.Match(`\\$`) { + continue + } + t = re{str: line} + + switch goos { + case "dragonfly": + if t.Match(`^([0-9]+)\s+STD\s+({ \S+\s+(\w+).*)$`) { + num, proto := t.sub[1], t.sub[2] + name := fmt.Sprintf("SYS_%s", t.sub[3]) + text += format(name, num, proto) + } + case "freebsd": + if t.Match(`^([0-9]+)\s+\S+\s+(?:(?:NO)?STD|COMPAT10)\s+({ \S+\s+(\w+).*)$`) { + num, proto := t.sub[1], t.sub[2] + name := fmt.Sprintf("SYS_%s", t.sub[3]) + text += format(name, num, proto) + } + case "openbsd": + if t.Match(`^([0-9]+)\s+STD\s+(NOLOCK\s+)?({ \S+\s+\*?(\w+).*)$`) { + num, proto, name := t.sub[1], t.sub[3], t.sub[4] + text += format(name, num, proto) + } + case "netbsd": + if t.Match(`^([0-9]+)\s+((STD)|(NOERR))\s+(RUMP\s+)?({\s+\S+\s*\*?\s*\|(\S+)\|(\S*)\|(\w+).*\s+})(\s+(\S+))?$`) { + num, proto, compat := t.sub[1], t.sub[6], t.sub[8] + name := t.sub[7] + "_" + t.sub[9] + if t.sub[11] != "" { + name = t.sub[7] + "_" + t.sub[11] + } + name = strings.ToUpper(name) + if compat == "" || compat == "13" || compat == "30" || compat == "50" { + text += fmt.Sprintf(" %s = %s; // %s\n", name, num, proto) + } + } + case "darwin": + if t.Match(`^#define\s+SYS_(\w+)\s+([0-9]+)`) { + name, num := t.sub[1], t.sub[2] + name = strings.ToUpper(name) + text += fmt.Sprintf(" SYS_%s = %s;\n", name, num) + } + default: + fmt.Fprintf(os.Stderr, "unrecognized GOOS=%s\n", goos) + os.Exit(1) + + } + } + err := s.Err() + checkErr(err) + + fmt.Printf(template, cmdLine(), buildTags(), text) +} + +const template = `// %s +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build %s + +package unix + +const( +%s)` diff --git a/vendor/golang.org/x/sys/unix/types_aix.go b/vendor/golang.org/x/sys/unix/types_aix.go new file mode 100644 index 000000000..40d2beede --- /dev/null +++ b/vendor/golang.org/x/sys/unix/types_aix.go @@ -0,0 +1,237 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore +// +build aix + +/* +Input to cgo -godefs. See also mkerrors.sh and mkall.sh +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + + +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics + +const ( + SizeofPtr = C.sizeofPtr + SizeofShort = C.sizeof_short + SizeofInt = C.sizeof_int + SizeofLong = C.sizeof_long + SizeofLongLong = C.sizeof_longlong + PathMax = C.PATH_MAX +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +type off64 C.off64_t +type off C.off_t +type Mode_t C.mode_t + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +type Timeval32 C.struct_timeval32 + +type Timex C.struct_timex + +type Time_t C.time_t + +type Tms C.struct_tms + +type Utimbuf C.struct_utimbuf + +type Timezone C.struct_timezone + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit64 + +type Pid_t C.pid_t + +type _Gid_t C.gid_t + +type dev_t C.dev_t + +// Files + +type Stat_t C.struct_stat + +type StatxTimestamp C.struct_statx_timestamp + +type Statx_t C.struct_statx + +type Dirent C.struct_dirent + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Cmsghdr C.struct_cmsghdr + +type ICMPv6Filter C.struct_icmp6_filter + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type Linger C.struct_linger + +type Msghdr C.struct_msghdr + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr +) + +type IfMsgHdr C.struct_if_msghdr + +// Misc + +type FdSet C.fd_set + +type Utsname C.struct_utsname + +type Ustat_t C.struct_ustat + +type Sigset_t C.sigset_t + +const ( + AT_FDCWD = C.AT_FDCWD + AT_REMOVEDIR = C.AT_REMOVEDIR + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +// Terminal handling + +type Termios C.struct_termios + +type Termio C.struct_termio + +type Winsize C.struct_winsize + +//poll + +type PollFd struct { + Fd int32 + Events uint16 + Revents uint16 +} + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) + +//flock_t + +type Flock_t C.struct_flock64 + +// Statfs + +type Fsid_t C.struct_fsid_t +type Fsid64_t C.struct_fsid64_t + +type Statfs_t C.struct_statfs + +const RNDGETENTCNT = 0x80045200 diff --git a/vendor/golang.org/x/sys/unix/types_darwin.go b/vendor/golang.org/x/sys/unix/types_darwin.go new file mode 100644 index 000000000..155c2e692 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/types_darwin.go @@ -0,0 +1,283 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define __DARWIN_UNIX03 0 +#define KERNEL +#define _DARWIN_USE_64_BIT_INODE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics + +const ( + SizeofPtr = C.sizeofPtr + SizeofShort = C.sizeof_short + SizeofInt = C.sizeof_int + SizeofLong = C.sizeof_long + SizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +type Timeval32 C.struct_timeval32 + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +type Stat_t C.struct_stat64 + +type Statfs_t C.struct_statfs64 + +type Flock_t C.struct_flock + +type Fstore_t C.struct_fstore + +type Radvisory_t C.struct_radvisory + +type Fbootstraptransfer_t C.struct_fbootstraptransfer + +type Log2phys_t C.struct_log2phys + +type Fsid C.struct_fsid + +type Dirent C.struct_dirent + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet4Pktinfo C.struct_in_pktinfo + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet4Pktinfo = C.sizeof_struct_in_pktinfo + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr + SizeofIfmaMsghdr2 = C.sizeof_struct_ifma_msghdr2 + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type IfmaMsghdr C.struct_ifma_msghdr + +type IfmaMsghdr2 C.struct_ifma_msghdr2 + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +// Terminal handling + +type Termios C.struct_termios + +type Winsize C.struct_winsize + +// fchmodat-like syscalls. + +const ( + AT_FDCWD = C.AT_FDCWD + AT_REMOVEDIR = C.AT_REMOVEDIR + AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +// poll + +type PollFd C.struct_pollfd + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) + +// uname + +type Utsname C.struct_utsname + +// Clockinfo + +const SizeofClockinfo = C.sizeof_struct_clockinfo + +type Clockinfo C.struct_clockinfo diff --git a/vendor/golang.org/x/sys/unix/types_dragonfly.go b/vendor/golang.org/x/sys/unix/types_dragonfly.go new file mode 100644 index 000000000..3365dd79d --- /dev/null +++ b/vendor/golang.org/x/sys/unix/types_dragonfly.go @@ -0,0 +1,263 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics + +const ( + SizeofPtr = C.sizeofPtr + SizeofShort = C.sizeof_short + SizeofInt = C.sizeof_int + SizeofLong = C.sizeof_long + SizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +type Stat_t C.struct_stat + +type Statfs_t C.struct_statfs + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +type Fsid C.struct_fsid + +// File system limits + +const ( + PathMax = C.PATH_MAX +) + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr + SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type IfmaMsghdr C.struct_ifma_msghdr + +type IfAnnounceMsghdr C.struct_if_announcemsghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +// Terminal handling + +type Termios C.struct_termios + +type Winsize C.struct_winsize + +// fchmodat-like syscalls. + +const ( + AT_FDCWD = C.AT_FDCWD + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +// poll + +type PollFd C.struct_pollfd + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) + +// Uname + +type Utsname C.struct_utsname diff --git a/vendor/golang.org/x/sys/unix/types_freebsd.go b/vendor/golang.org/x/sys/unix/types_freebsd.go new file mode 100644 index 000000000..a121dc336 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/types_freebsd.go @@ -0,0 +1,400 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define _WANT_FREEBSD11_STAT 1 +#define _WANT_FREEBSD11_STATFS 1 +#define _WANT_FREEBSD11_DIRENT 1 +#define _WANT_FREEBSD11_KEVENT 1 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +// This structure is a duplicate of if_data on FreeBSD 8-STABLE. +// See /usr/include/net/if.h. +struct if_data8 { + u_char ifi_type; + u_char ifi_physical; + u_char ifi_addrlen; + u_char ifi_hdrlen; + u_char ifi_link_state; + u_char ifi_spare_char1; + u_char ifi_spare_char2; + u_char ifi_datalen; + u_long ifi_mtu; + u_long ifi_metric; + u_long ifi_baudrate; + u_long ifi_ipackets; + u_long ifi_ierrors; + u_long ifi_opackets; + u_long ifi_oerrors; + u_long ifi_collisions; + u_long ifi_ibytes; + u_long ifi_obytes; + u_long ifi_imcasts; + u_long ifi_omcasts; + u_long ifi_iqdrops; + u_long ifi_noproto; + u_long ifi_hwassist; +// FIXME: these are now unions, so maybe need to change definitions? +#undef ifi_epoch + time_t ifi_epoch; +#undef ifi_lastchange + struct timeval ifi_lastchange; +}; + +// This structure is a duplicate of if_msghdr on FreeBSD 8-STABLE. +// See /usr/include/net/if.h. +struct if_msghdr8 { + u_short ifm_msglen; + u_char ifm_version; + u_char ifm_type; + int ifm_addrs; + int ifm_flags; + u_short ifm_index; + struct if_data8 ifm_data; +}; +*/ +import "C" + +// Machine characteristics + +const ( + SizeofPtr = C.sizeofPtr + SizeofShort = C.sizeof_short + SizeofInt = C.sizeof_int + SizeofLong = C.sizeof_long + SizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +const ( + _statfsVersion = C.STATFS_VERSION + _dirblksiz = C.DIRBLKSIZ +) + +type Stat_t C.struct_stat + +type stat_freebsd11_t C.struct_freebsd11_stat + +type Statfs_t C.struct_statfs + +type statfs_freebsd11_t C.struct_freebsd11_statfs + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +type dirent_freebsd11 C.struct_freebsd11_dirent + +type Fsid C.struct_fsid + +// File system limits + +const ( + PathMax = C.PATH_MAX +) + +// Advice to Fadvise + +const ( + FADV_NORMAL = C.POSIX_FADV_NORMAL + FADV_RANDOM = C.POSIX_FADV_RANDOM + FADV_SEQUENTIAL = C.POSIX_FADV_SEQUENTIAL + FADV_WILLNEED = C.POSIX_FADV_WILLNEED + FADV_DONTNEED = C.POSIX_FADV_DONTNEED + FADV_NOREUSE = C.POSIX_FADV_NOREUSE +) + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPMreqn C.struct_ip_mreqn + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPMreqn = C.sizeof_struct_ip_mreqn + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_ATTACH = C.PT_ATTACH + PTRACE_CONT = C.PT_CONTINUE + PTRACE_DETACH = C.PT_DETACH + PTRACE_GETFPREGS = C.PT_GETFPREGS + PTRACE_GETFSBASE = C.PT_GETFSBASE + PTRACE_GETLWPLIST = C.PT_GETLWPLIST + PTRACE_GETNUMLWPS = C.PT_GETNUMLWPS + PTRACE_GETREGS = C.PT_GETREGS + PTRACE_GETXSTATE = C.PT_GETXSTATE + PTRACE_IO = C.PT_IO + PTRACE_KILL = C.PT_KILL + PTRACE_LWPEVENTS = C.PT_LWP_EVENTS + PTRACE_LWPINFO = C.PT_LWPINFO + PTRACE_SETFPREGS = C.PT_SETFPREGS + PTRACE_SETREGS = C.PT_SETREGS + PTRACE_SINGLESTEP = C.PT_STEP + PTRACE_TRACEME = C.PT_TRACE_ME +) + +const ( + PIOD_READ_D = C.PIOD_READ_D + PIOD_WRITE_D = C.PIOD_WRITE_D + PIOD_READ_I = C.PIOD_READ_I + PIOD_WRITE_I = C.PIOD_WRITE_I +) + +const ( + PL_FLAG_BORN = C.PL_FLAG_BORN + PL_FLAG_EXITED = C.PL_FLAG_EXITED + PL_FLAG_SI = C.PL_FLAG_SI +) + +const ( + TRAP_BRKPT = C.TRAP_BRKPT + TRAP_TRACE = C.TRAP_TRACE +) + +type PtraceLwpInfoStruct C.struct_ptrace_lwpinfo + +type __Siginfo C.struct___siginfo + +type Sigset_t C.sigset_t + +type Reg C.struct_reg + +type FpReg C.struct_fpreg + +type PtraceIoDesc C.struct_ptrace_io_desc + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent_freebsd11 + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + sizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfMsghdr = C.sizeof_struct_if_msghdr8 + sizeofIfData = C.sizeof_struct_if_data + SizeofIfData = C.sizeof_struct_if_data8 + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr + SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type ifMsghdr C.struct_if_msghdr + +type IfMsghdr C.struct_if_msghdr8 + +type ifData C.struct_if_data + +type IfData C.struct_if_data8 + +type IfaMsghdr C.struct_ifa_msghdr + +type IfmaMsghdr C.struct_ifma_msghdr + +type IfAnnounceMsghdr C.struct_if_announcemsghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfZbuf = C.sizeof_struct_bpf_zbuf + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr + SizeofBpfZbufHeader = C.sizeof_struct_bpf_zbuf_header +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfZbuf C.struct_bpf_zbuf + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +type BpfZbufHeader C.struct_bpf_zbuf_header + +// Terminal handling + +type Termios C.struct_termios + +type Winsize C.struct_winsize + +// fchmodat-like syscalls. + +const ( + AT_FDCWD = C.AT_FDCWD + AT_REMOVEDIR = C.AT_REMOVEDIR + AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +// poll + +type PollFd C.struct_pollfd + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLINIGNEOF = C.POLLINIGNEOF + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) + +// Capabilities + +type CapRights C.struct_cap_rights + +// Uname + +type Utsname C.struct_utsname diff --git a/vendor/golang.org/x/sys/unix/types_netbsd.go b/vendor/golang.org/x/sys/unix/types_netbsd.go new file mode 100644 index 000000000..4a96d72c3 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/types_netbsd.go @@ -0,0 +1,290 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics + +const ( + SizeofPtr = C.sizeofPtr + SizeofShort = C.sizeof_short + SizeofInt = C.sizeof_int + SizeofLong = C.sizeof_long + SizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +type Stat_t C.struct_stat + +type Statfs_t C.struct_statfs + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +type Fsid C.fsid_t + +// File system limits + +const ( + PathMax = C.PATH_MAX +) + +// Advice to Fadvise + +const ( + FADV_NORMAL = C.POSIX_FADV_NORMAL + FADV_RANDOM = C.POSIX_FADV_RANDOM + FADV_SEQUENTIAL = C.POSIX_FADV_SEQUENTIAL + FADV_WILLNEED = C.POSIX_FADV_WILLNEED + FADV_DONTNEED = C.POSIX_FADV_DONTNEED + FADV_NOREUSE = C.POSIX_FADV_NOREUSE +) + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type IfAnnounceMsghdr C.struct_if_announcemsghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +type Mclpool C.struct_mclpool + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +type BpfTimeval C.struct_bpf_timeval + +// Terminal handling + +type Termios C.struct_termios + +type Winsize C.struct_winsize + +type Ptmget C.struct_ptmget + +// fchmodat-like syscalls. + +const ( + AT_FDCWD = C.AT_FDCWD + AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +// poll + +type PollFd C.struct_pollfd + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) + +// Sysctl + +type Sysctlnode C.struct_sysctlnode + +// Uname + +type Utsname C.struct_utsname + +// Clockinfo + +const SizeofClockinfo = C.sizeof_struct_clockinfo + +type Clockinfo C.struct_clockinfo diff --git a/vendor/golang.org/x/sys/unix/types_openbsd.go b/vendor/golang.org/x/sys/unix/types_openbsd.go new file mode 100644 index 000000000..775cb57dc --- /dev/null +++ b/vendor/golang.org/x/sys/unix/types_openbsd.go @@ -0,0 +1,283 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics + +const ( + SizeofPtr = C.sizeofPtr + SizeofShort = C.sizeof_short + SizeofInt = C.sizeof_int + SizeofLong = C.sizeof_long + SizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +type Stat_t C.struct_stat + +type Statfs_t C.struct_statfs + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +type Fsid C.fsid_t + +// File system limits + +const ( + PathMax = C.PATH_MAX +) + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type IfAnnounceMsghdr C.struct_if_announcemsghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +type Mclpool C.struct_mclpool + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +type BpfTimeval C.struct_bpf_timeval + +// Terminal handling + +type Termios C.struct_termios + +type Winsize C.struct_winsize + +// fchmodat-like syscalls. + +const ( + AT_FDCWD = C.AT_FDCWD + AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +// poll + +type PollFd C.struct_pollfd + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) + +// Signal Sets + +type Sigset_t C.sigset_t + +// Uname + +type Utsname C.struct_utsname + +// Uvmexp + +const SizeofUvmexp = C.sizeof_struct_uvmexp + +type Uvmexp C.struct_uvmexp + +// Clockinfo + +const SizeofClockinfo = C.sizeof_struct_clockinfo + +type Clockinfo C.struct_clockinfo diff --git a/vendor/golang.org/x/sys/unix/types_solaris.go b/vendor/golang.org/x/sys/unix/types_solaris.go new file mode 100644 index 000000000..2b716f934 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/types_solaris.go @@ -0,0 +1,266 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +// These defines ensure that builds done on newer versions of Solaris are +// backwards-compatible with older versions of Solaris and +// OpenSolaris-based derivatives. +#define __USE_SUNOS_SOCKETS__ // msghdr +#define __USE_LEGACY_PROTOTYPES__ // iovec +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics + +const ( + SizeofPtr = C.sizeofPtr + SizeofShort = C.sizeof_short + SizeofInt = C.sizeof_int + SizeofLong = C.sizeof_long + SizeofLongLong = C.sizeof_longlong + PathMax = C.PATH_MAX + MaxHostNameLen = C.MAXHOSTNAMELEN +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +type Timeval32 C.struct_timeval32 + +type Tms C.struct_tms + +type Utimbuf C.struct_utimbuf + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +type Stat_t C.struct_stat + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +// Filesystems + +type _Fsblkcnt_t C.fsblkcnt_t + +type Statvfs_t C.struct_statvfs + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Select + +type FdSet C.fd_set + +// Misc + +type Utsname C.struct_utsname + +type Ustat_t C.struct_ustat + +const ( + AT_FDCWD = C.AT_FDCWD + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW + AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW + AT_REMOVEDIR = C.AT_REMOVEDIR + AT_EACCESS = C.AT_EACCESS +) + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfTimeval C.struct_bpf_timeval + +type BpfHdr C.struct_bpf_hdr + +// Terminal handling + +type Termios C.struct_termios + +type Termio C.struct_termio + +type Winsize C.struct_winsize + +// poll + +type PollFd C.struct_pollfd + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) diff --git a/vendor/golang.org/x/text/encoding/charmap/maketables.go b/vendor/golang.org/x/text/encoding/charmap/maketables.go new file mode 100644 index 000000000..f7941701e --- /dev/null +++ b/vendor/golang.org/x/text/encoding/charmap/maketables.go @@ -0,0 +1,556 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +package main + +import ( + "bufio" + "fmt" + "log" + "net/http" + "sort" + "strings" + "unicode/utf8" + + "golang.org/x/text/encoding" + "golang.org/x/text/internal/gen" +) + +const ascii = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" + + "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" + + ` !"#$%&'()*+,-./0123456789:;<=>?` + + `@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_` + + "`abcdefghijklmnopqrstuvwxyz{|}~\u007f" + +var encodings = []struct { + name string + mib string + comment string + varName string + replacement byte + mapping string +}{ + { + "IBM Code Page 037", + "IBM037", + "", + "CodePage037", + 0x3f, + "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM037-2.1.2.ucm", + }, + { + "IBM Code Page 437", + "PC8CodePage437", + "", + "CodePage437", + encoding.ASCIISub, + "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM437-2.1.2.ucm", + }, + { + "IBM Code Page 850", + "PC850Multilingual", + "", + "CodePage850", + encoding.ASCIISub, + "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM850-2.1.2.ucm", + }, + { + "IBM Code Page 852", + "PCp852", + "", + "CodePage852", + encoding.ASCIISub, + "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM852-2.1.2.ucm", + }, + { + "IBM Code Page 855", + "IBM855", + "", + "CodePage855", + encoding.ASCIISub, + "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM855-2.1.2.ucm", + }, + { + "Windows Code Page 858", // PC latin1 with Euro + "IBM00858", + "", + "CodePage858", + encoding.ASCIISub, + "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/windows-858-2000.ucm", + }, + { + "IBM Code Page 860", + "IBM860", + "", + "CodePage860", + encoding.ASCIISub, + "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM860-2.1.2.ucm", + }, + { + "IBM Code Page 862", + "PC862LatinHebrew", + "", + "CodePage862", + encoding.ASCIISub, + "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM862-2.1.2.ucm", + }, + { + "IBM Code Page 863", + "IBM863", + "", + "CodePage863", + encoding.ASCIISub, + "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM863-2.1.2.ucm", + }, + { + "IBM Code Page 865", + "IBM865", + "", + "CodePage865", + encoding.ASCIISub, + "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM865-2.1.2.ucm", + }, + { + "IBM Code Page 866", + "IBM866", + "", + "CodePage866", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-ibm866.txt", + }, + { + "IBM Code Page 1047", + "IBM1047", + "", + "CodePage1047", + 0x3f, + "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM1047-2.1.2.ucm", + }, + { + "IBM Code Page 1140", + "IBM01140", + "", + "CodePage1140", + 0x3f, + "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/ibm-1140_P100-1997.ucm", + }, + { + "ISO 8859-1", + "ISOLatin1", + "", + "ISO8859_1", + encoding.ASCIISub, + "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/iso-8859_1-1998.ucm", + }, + { + "ISO 8859-2", + "ISOLatin2", + "", + "ISO8859_2", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-iso-8859-2.txt", + }, + { + "ISO 8859-3", + "ISOLatin3", + "", + "ISO8859_3", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-iso-8859-3.txt", + }, + { + "ISO 8859-4", + "ISOLatin4", + "", + "ISO8859_4", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-iso-8859-4.txt", + }, + { + "ISO 8859-5", + "ISOLatinCyrillic", + "", + "ISO8859_5", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-iso-8859-5.txt", + }, + { + "ISO 8859-6", + "ISOLatinArabic", + "", + "ISO8859_6,ISO8859_6E,ISO8859_6I", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-iso-8859-6.txt", + }, + { + "ISO 8859-7", + "ISOLatinGreek", + "", + "ISO8859_7", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-iso-8859-7.txt", + }, + { + "ISO 8859-8", + "ISOLatinHebrew", + "", + "ISO8859_8,ISO8859_8E,ISO8859_8I", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-iso-8859-8.txt", + }, + { + "ISO 8859-9", + "ISOLatin5", + "", + "ISO8859_9", + encoding.ASCIISub, + "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/iso-8859_9-1999.ucm", + }, + { + "ISO 8859-10", + "ISOLatin6", + "", + "ISO8859_10", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-iso-8859-10.txt", + }, + { + "ISO 8859-13", + "ISO885913", + "", + "ISO8859_13", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-iso-8859-13.txt", + }, + { + "ISO 8859-14", + "ISO885914", + "", + "ISO8859_14", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-iso-8859-14.txt", + }, + { + "ISO 8859-15", + "ISO885915", + "", + "ISO8859_15", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-iso-8859-15.txt", + }, + { + "ISO 8859-16", + "ISO885916", + "", + "ISO8859_16", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-iso-8859-16.txt", + }, + { + "KOI8-R", + "KOI8R", + "", + "KOI8R", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-koi8-r.txt", + }, + { + "KOI8-U", + "KOI8U", + "", + "KOI8U", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-koi8-u.txt", + }, + { + "Macintosh", + "Macintosh", + "", + "Macintosh", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-macintosh.txt", + }, + { + "Macintosh Cyrillic", + "MacintoshCyrillic", + "", + "MacintoshCyrillic", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-x-mac-cyrillic.txt", + }, + { + "Windows 874", + "Windows874", + "", + "Windows874", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-windows-874.txt", + }, + { + "Windows 1250", + "Windows1250", + "", + "Windows1250", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-windows-1250.txt", + }, + { + "Windows 1251", + "Windows1251", + "", + "Windows1251", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-windows-1251.txt", + }, + { + "Windows 1252", + "Windows1252", + "", + "Windows1252", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-windows-1252.txt", + }, + { + "Windows 1253", + "Windows1253", + "", + "Windows1253", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-windows-1253.txt", + }, + { + "Windows 1254", + "Windows1254", + "", + "Windows1254", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-windows-1254.txt", + }, + { + "Windows 1255", + "Windows1255", + "", + "Windows1255", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-windows-1255.txt", + }, + { + "Windows 1256", + "Windows1256", + "", + "Windows1256", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-windows-1256.txt", + }, + { + "Windows 1257", + "Windows1257", + "", + "Windows1257", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-windows-1257.txt", + }, + { + "Windows 1258", + "Windows1258", + "", + "Windows1258", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-windows-1258.txt", + }, + { + "X-User-Defined", + "XUserDefined", + "It is defined at http://encoding.spec.whatwg.org/#x-user-defined", + "XUserDefined", + encoding.ASCIISub, + ascii + + "\uf780\uf781\uf782\uf783\uf784\uf785\uf786\uf787" + + "\uf788\uf789\uf78a\uf78b\uf78c\uf78d\uf78e\uf78f" + + "\uf790\uf791\uf792\uf793\uf794\uf795\uf796\uf797" + + "\uf798\uf799\uf79a\uf79b\uf79c\uf79d\uf79e\uf79f" + + "\uf7a0\uf7a1\uf7a2\uf7a3\uf7a4\uf7a5\uf7a6\uf7a7" + + "\uf7a8\uf7a9\uf7aa\uf7ab\uf7ac\uf7ad\uf7ae\uf7af" + + "\uf7b0\uf7b1\uf7b2\uf7b3\uf7b4\uf7b5\uf7b6\uf7b7" + + "\uf7b8\uf7b9\uf7ba\uf7bb\uf7bc\uf7bd\uf7be\uf7bf" + + "\uf7c0\uf7c1\uf7c2\uf7c3\uf7c4\uf7c5\uf7c6\uf7c7" + + "\uf7c8\uf7c9\uf7ca\uf7cb\uf7cc\uf7cd\uf7ce\uf7cf" + + "\uf7d0\uf7d1\uf7d2\uf7d3\uf7d4\uf7d5\uf7d6\uf7d7" + + "\uf7d8\uf7d9\uf7da\uf7db\uf7dc\uf7dd\uf7de\uf7df" + + "\uf7e0\uf7e1\uf7e2\uf7e3\uf7e4\uf7e5\uf7e6\uf7e7" + + "\uf7e8\uf7e9\uf7ea\uf7eb\uf7ec\uf7ed\uf7ee\uf7ef" + + "\uf7f0\uf7f1\uf7f2\uf7f3\uf7f4\uf7f5\uf7f6\uf7f7" + + "\uf7f8\uf7f9\uf7fa\uf7fb\uf7fc\uf7fd\uf7fe\uf7ff", + }, +} + +func getWHATWG(url string) string { + res, err := http.Get(url) + if err != nil { + log.Fatalf("%q: Get: %v", url, err) + } + defer res.Body.Close() + + mapping := make([]rune, 128) + for i := range mapping { + mapping[i] = '\ufffd' + } + + scanner := bufio.NewScanner(res.Body) + for scanner.Scan() { + s := strings.TrimSpace(scanner.Text()) + if s == "" || s[0] == '#' { + continue + } + x, y := 0, 0 + if _, err := fmt.Sscanf(s, "%d\t0x%x", &x, &y); err != nil { + log.Fatalf("could not parse %q", s) + } + if x < 0 || 128 <= x { + log.Fatalf("code %d is out of range", x) + } + if 0x80 <= y && y < 0xa0 { + // We diverge from the WHATWG spec by mapping control characters + // in the range [0x80, 0xa0) to U+FFFD. + continue + } + mapping[x] = rune(y) + } + return ascii + string(mapping) +} + +func getUCM(url string) string { + res, err := http.Get(url) + if err != nil { + log.Fatalf("%q: Get: %v", url, err) + } + defer res.Body.Close() + + mapping := make([]rune, 256) + for i := range mapping { + mapping[i] = '\ufffd' + } + + charsFound := 0 + scanner := bufio.NewScanner(res.Body) + for scanner.Scan() { + s := strings.TrimSpace(scanner.Text()) + if s == "" || s[0] == '#' { + continue + } + var c byte + var r rune + if _, err := fmt.Sscanf(s, ` \x%x |0`, &r, &c); err != nil { + continue + } + mapping[c] = r + charsFound++ + } + + if charsFound < 200 { + log.Fatalf("%q: only %d characters found (wrong page format?)", url, charsFound) + } + + return string(mapping) +} + +func main() { + mibs := map[string]bool{} + all := []string{} + + w := gen.NewCodeWriter() + defer w.WriteGoFile("tables.go", "charmap") + + printf := func(s string, a ...interface{}) { fmt.Fprintf(w, s, a...) } + + printf("import (\n") + printf("\t\"golang.org/x/text/encoding\"\n") + printf("\t\"golang.org/x/text/encoding/internal/identifier\"\n") + printf(")\n\n") + for _, e := range encodings { + varNames := strings.Split(e.varName, ",") + all = append(all, varNames...) + varName := varNames[0] + switch { + case strings.HasPrefix(e.mapping, "http://encoding.spec.whatwg.org/"): + e.mapping = getWHATWG(e.mapping) + case strings.HasPrefix(e.mapping, "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/"): + e.mapping = getUCM(e.mapping) + } + + asciiSuperset, low := strings.HasPrefix(e.mapping, ascii), 0x00 + if asciiSuperset { + low = 0x80 + } + lvn := 1 + if strings.HasPrefix(varName, "ISO") || strings.HasPrefix(varName, "KOI") { + lvn = 3 + } + lowerVarName := strings.ToLower(varName[:lvn]) + varName[lvn:] + printf("// %s is the %s encoding.\n", varName, e.name) + if e.comment != "" { + printf("//\n// %s\n", e.comment) + } + printf("var %s *Charmap = &%s\n\nvar %s = Charmap{\nname: %q,\n", + varName, lowerVarName, lowerVarName, e.name) + if mibs[e.mib] { + log.Fatalf("MIB type %q declared multiple times.", e.mib) + } + printf("mib: identifier.%s,\n", e.mib) + printf("asciiSuperset: %t,\n", asciiSuperset) + printf("low: 0x%02x,\n", low) + printf("replacement: 0x%02x,\n", e.replacement) + + printf("decode: [256]utf8Enc{\n") + i, backMapping := 0, map[rune]byte{} + for _, c := range e.mapping { + if _, ok := backMapping[c]; !ok && c != utf8.RuneError { + backMapping[c] = byte(i) + } + var buf [8]byte + n := utf8.EncodeRune(buf[:], c) + if n > 3 { + panic(fmt.Sprintf("rune %q (%U) is too long", c, c)) + } + printf("{%d,[3]byte{0x%02x,0x%02x,0x%02x}},", n, buf[0], buf[1], buf[2]) + if i%2 == 1 { + printf("\n") + } + i++ + } + printf("},\n") + + printf("encode: [256]uint32{\n") + encode := make([]uint32, 0, 256) + for c, i := range backMapping { + encode = append(encode, uint32(i)<<24|uint32(c)) + } + sort.Sort(byRune(encode)) + for len(encode) < cap(encode) { + encode = append(encode, encode[len(encode)-1]) + } + for i, enc := range encode { + printf("0x%08x,", enc) + if i%8 == 7 { + printf("\n") + } + } + printf("},\n}\n") + + // Add an estimate of the size of a single Charmap{} struct value, which + // includes two 256 elem arrays of 4 bytes and some extra fields, which + // align to 3 uint64s on 64-bit architectures. + w.Size += 2*4*256 + 3*8 + } + // TODO: add proper line breaking. + printf("var listAll = []encoding.Encoding{\n%s,\n}\n\n", strings.Join(all, ",\n")) +} + +type byRune []uint32 + +func (b byRune) Len() int { return len(b) } +func (b byRune) Less(i, j int) bool { return b[i]&0xffffff < b[j]&0xffffff } +func (b byRune) Swap(i, j int) { b[i], b[j] = b[j], b[i] } diff --git a/vendor/golang.org/x/text/encoding/htmlindex/gen.go b/vendor/golang.org/x/text/encoding/htmlindex/gen.go new file mode 100644 index 000000000..ac6b4a77f --- /dev/null +++ b/vendor/golang.org/x/text/encoding/htmlindex/gen.go @@ -0,0 +1,173 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +package main + +import ( + "bytes" + "encoding/json" + "fmt" + "log" + "strings" + + "golang.org/x/text/internal/gen" +) + +type group struct { + Encodings []struct { + Labels []string + Name string + } +} + +func main() { + gen.Init() + + r := gen.Open("https://encoding.spec.whatwg.org", "whatwg", "encodings.json") + var groups []group + if err := json.NewDecoder(r).Decode(&groups); err != nil { + log.Fatalf("Error reading encodings.json: %v", err) + } + + w := &bytes.Buffer{} + fmt.Fprintln(w, "type htmlEncoding byte") + fmt.Fprintln(w, "const (") + for i, g := range groups { + for _, e := range g.Encodings { + key := strings.ToLower(e.Name) + name := consts[key] + if name == "" { + log.Fatalf("No const defined for %s.", key) + } + if i == 0 { + fmt.Fprintf(w, "%s htmlEncoding = iota\n", name) + } else { + fmt.Fprintf(w, "%s\n", name) + } + } + } + fmt.Fprintln(w, "numEncodings") + fmt.Fprint(w, ")\n\n") + + fmt.Fprintln(w, "var canonical = [numEncodings]string{") + for _, g := range groups { + for _, e := range g.Encodings { + fmt.Fprintf(w, "%q,\n", strings.ToLower(e.Name)) + } + } + fmt.Fprint(w, "}\n\n") + + fmt.Fprintln(w, "var nameMap = map[string]htmlEncoding{") + for _, g := range groups { + for _, e := range g.Encodings { + for _, l := range e.Labels { + key := strings.ToLower(e.Name) + name := consts[key] + fmt.Fprintf(w, "%q: %s,\n", l, name) + } + } + } + fmt.Fprint(w, "}\n\n") + + var tags []string + fmt.Fprintln(w, "var localeMap = []htmlEncoding{") + for _, loc := range locales { + tags = append(tags, loc.tag) + fmt.Fprintf(w, "%s, // %s \n", consts[loc.name], loc.tag) + } + fmt.Fprint(w, "}\n\n") + + fmt.Fprintf(w, "const locales = %q\n", strings.Join(tags, " ")) + + gen.WriteGoFile("tables.go", "htmlindex", w.Bytes()) +} + +// consts maps canonical encoding name to internal constant. +var consts = map[string]string{ + "utf-8": "utf8", + "ibm866": "ibm866", + "iso-8859-2": "iso8859_2", + "iso-8859-3": "iso8859_3", + "iso-8859-4": "iso8859_4", + "iso-8859-5": "iso8859_5", + "iso-8859-6": "iso8859_6", + "iso-8859-7": "iso8859_7", + "iso-8859-8": "iso8859_8", + "iso-8859-8-i": "iso8859_8I", + "iso-8859-10": "iso8859_10", + "iso-8859-13": "iso8859_13", + "iso-8859-14": "iso8859_14", + "iso-8859-15": "iso8859_15", + "iso-8859-16": "iso8859_16", + "koi8-r": "koi8r", + "koi8-u": "koi8u", + "macintosh": "macintosh", + "windows-874": "windows874", + "windows-1250": "windows1250", + "windows-1251": "windows1251", + "windows-1252": "windows1252", + "windows-1253": "windows1253", + "windows-1254": "windows1254", + "windows-1255": "windows1255", + "windows-1256": "windows1256", + "windows-1257": "windows1257", + "windows-1258": "windows1258", + "x-mac-cyrillic": "macintoshCyrillic", + "gbk": "gbk", + "gb18030": "gb18030", + // "hz-gb-2312": "hzgb2312", // Was removed from WhatWG + "big5": "big5", + "euc-jp": "eucjp", + "iso-2022-jp": "iso2022jp", + "shift_jis": "shiftJIS", + "euc-kr": "euckr", + "replacement": "replacement", + "utf-16be": "utf16be", + "utf-16le": "utf16le", + "x-user-defined": "xUserDefined", +} + +// locales is taken from +// https://html.spec.whatwg.org/multipage/syntax.html#encoding-sniffing-algorithm. +var locales = []struct{ tag, name string }{ + // The default value. Explicitly state latin to benefit from the exact + // script option, while still making 1252 the default encoding for languages + // written in Latin script. + {"und_Latn", "windows-1252"}, + {"ar", "windows-1256"}, + {"ba", "windows-1251"}, + {"be", "windows-1251"}, + {"bg", "windows-1251"}, + {"cs", "windows-1250"}, + {"el", "iso-8859-7"}, + {"et", "windows-1257"}, + {"fa", "windows-1256"}, + {"he", "windows-1255"}, + {"hr", "windows-1250"}, + {"hu", "iso-8859-2"}, + {"ja", "shift_jis"}, + {"kk", "windows-1251"}, + {"ko", "euc-kr"}, + {"ku", "windows-1254"}, + {"ky", "windows-1251"}, + {"lt", "windows-1257"}, + {"lv", "windows-1257"}, + {"mk", "windows-1251"}, + {"pl", "iso-8859-2"}, + {"ru", "windows-1251"}, + {"sah", "windows-1251"}, + {"sk", "windows-1250"}, + {"sl", "iso-8859-2"}, + {"sr", "windows-1251"}, + {"tg", "windows-1251"}, + {"th", "windows-874"}, + {"tr", "windows-1254"}, + {"tt", "windows-1251"}, + {"uk", "windows-1251"}, + {"vi", "windows-1258"}, + {"zh-hans", "gb18030"}, + {"zh-hant", "big5"}, +} diff --git a/vendor/golang.org/x/text/encoding/internal/identifier/gen.go b/vendor/golang.org/x/text/encoding/internal/identifier/gen.go new file mode 100644 index 000000000..26cfef9c6 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/internal/identifier/gen.go @@ -0,0 +1,142 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +package main + +import ( + "bytes" + "encoding/xml" + "fmt" + "io" + "log" + "strings" + + "golang.org/x/text/internal/gen" +) + +type registry struct { + XMLName xml.Name `xml:"registry"` + Updated string `xml:"updated"` + Registry []struct { + ID string `xml:"id,attr"` + Record []struct { + Name string `xml:"name"` + Xref []struct { + Type string `xml:"type,attr"` + Data string `xml:"data,attr"` + } `xml:"xref"` + Desc struct { + Data string `xml:",innerxml"` + // Any []struct { + // Data string `xml:",chardata"` + // } `xml:",any"` + // Data string `xml:",chardata"` + } `xml:"description,"` + MIB string `xml:"value"` + Alias []string `xml:"alias"` + MIME string `xml:"preferred_alias"` + } `xml:"record"` + } `xml:"registry"` +} + +func main() { + r := gen.OpenIANAFile("assignments/character-sets/character-sets.xml") + reg := ®istry{} + if err := xml.NewDecoder(r).Decode(®); err != nil && err != io.EOF { + log.Fatalf("Error decoding charset registry: %v", err) + } + if len(reg.Registry) == 0 || reg.Registry[0].ID != "character-sets-1" { + log.Fatalf("Unexpected ID %s", reg.Registry[0].ID) + } + + w := &bytes.Buffer{} + fmt.Fprintf(w, "const (\n") + for _, rec := range reg.Registry[0].Record { + constName := "" + for _, a := range rec.Alias { + if strings.HasPrefix(a, "cs") && strings.IndexByte(a, '-') == -1 { + // Some of the constant definitions have comments in them. Strip those. + constName = strings.Title(strings.SplitN(a[2:], "\n", 2)[0]) + } + } + if constName == "" { + switch rec.MIB { + case "2085": + constName = "HZGB2312" // Not listed as alias for some reason. + default: + log.Fatalf("No cs alias defined for %s.", rec.MIB) + } + } + if rec.MIME != "" { + rec.MIME = fmt.Sprintf(" (MIME: %s)", rec.MIME) + } + fmt.Fprintf(w, "// %s is the MIB identifier with IANA name %s%s.\n//\n", constName, rec.Name, rec.MIME) + if len(rec.Desc.Data) > 0 { + fmt.Fprint(w, "// ") + d := xml.NewDecoder(strings.NewReader(rec.Desc.Data)) + inElem := true + attr := "" + for { + t, err := d.Token() + if err != nil { + if err != io.EOF { + log.Fatal(err) + } + break + } + switch x := t.(type) { + case xml.CharData: + attr = "" // Don't need attribute info. + a := bytes.Split([]byte(x), []byte("\n")) + for i, b := range a { + if b = bytes.TrimSpace(b); len(b) != 0 { + if !inElem && i > 0 { + fmt.Fprint(w, "\n// ") + } + inElem = false + fmt.Fprintf(w, "%s ", string(b)) + } + } + case xml.StartElement: + if x.Name.Local == "xref" { + inElem = true + use := false + for _, a := range x.Attr { + if a.Name.Local == "type" { + use = use || a.Value != "person" + } + if a.Name.Local == "data" && use { + // Patch up URLs to use https. From some links, the + // https version is different from the http one. + s := a.Value + s = strings.Replace(s, "http://", "https://", -1) + s = strings.Replace(s, "/unicode/", "/", -1) + attr = s + " " + } + } + } + case xml.EndElement: + inElem = false + fmt.Fprint(w, attr) + } + } + fmt.Fprint(w, "\n") + } + for _, x := range rec.Xref { + switch x.Type { + case "rfc": + fmt.Fprintf(w, "// Reference: %s\n", strings.ToUpper(x.Data)) + case "uri": + fmt.Fprintf(w, "// Reference: %s\n", x.Data) + } + } + fmt.Fprintf(w, "%s MIB = %s\n", constName, rec.MIB) + fmt.Fprintln(w) + } + fmt.Fprintln(w, ")") + + gen.WriteGoFile("mib.go", "identifier", w.Bytes()) +} diff --git a/vendor/golang.org/x/text/encoding/japanese/maketables.go b/vendor/golang.org/x/text/encoding/japanese/maketables.go new file mode 100644 index 000000000..023957a67 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/japanese/maketables.go @@ -0,0 +1,161 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +package main + +// This program generates tables.go: +// go run maketables.go | gofmt > tables.go + +// TODO: Emoji extensions? +// https://www.unicode.org/faq/emoji_dingbats.html +// https://www.unicode.org/Public/UNIDATA/EmojiSources.txt + +import ( + "bufio" + "fmt" + "log" + "net/http" + "sort" + "strings" +) + +type entry struct { + jisCode, table int +} + +func main() { + fmt.Printf("// generated by go run maketables.go; DO NOT EDIT\n\n") + fmt.Printf("// Package japanese provides Japanese encodings such as EUC-JP and Shift JIS.\n") + fmt.Printf(`package japanese // import "golang.org/x/text/encoding/japanese"` + "\n\n") + + reverse := [65536]entry{} + for i := range reverse { + reverse[i].table = -1 + } + + tables := []struct { + url string + name string + }{ + {"http://encoding.spec.whatwg.org/index-jis0208.txt", "0208"}, + {"http://encoding.spec.whatwg.org/index-jis0212.txt", "0212"}, + } + for i, table := range tables { + res, err := http.Get(table.url) + if err != nil { + log.Fatalf("%q: Get: %v", table.url, err) + } + defer res.Body.Close() + + mapping := [65536]uint16{} + + scanner := bufio.NewScanner(res.Body) + for scanner.Scan() { + s := strings.TrimSpace(scanner.Text()) + if s == "" || s[0] == '#' { + continue + } + x, y := 0, uint16(0) + if _, err := fmt.Sscanf(s, "%d 0x%x", &x, &y); err != nil { + log.Fatalf("%q: could not parse %q", table.url, s) + } + if x < 0 || 120*94 <= x { + log.Fatalf("%q: JIS code %d is out of range", table.url, x) + } + mapping[x] = y + if reverse[y].table == -1 { + reverse[y] = entry{jisCode: x, table: i} + } + } + if err := scanner.Err(); err != nil { + log.Fatalf("%q: scanner error: %v", table.url, err) + } + + fmt.Printf("// jis%sDecode is the decoding table from JIS %s code to Unicode.\n// It is defined at %s\n", + table.name, table.name, table.url) + fmt.Printf("var jis%sDecode = [...]uint16{\n", table.name) + for i, m := range mapping { + if m != 0 { + fmt.Printf("\t%d: 0x%04X,\n", i, m) + } + } + fmt.Printf("}\n\n") + } + + // Any run of at least separation continuous zero entries in the reverse map will + // be a separate encode table. + const separation = 1024 + + intervals := []interval(nil) + low, high := -1, -1 + for i, v := range reverse { + if v.table == -1 { + continue + } + if low < 0 { + low = i + } else if i-high >= separation { + if high >= 0 { + intervals = append(intervals, interval{low, high}) + } + low = i + } + high = i + 1 + } + if high >= 0 { + intervals = append(intervals, interval{low, high}) + } + sort.Sort(byDecreasingLength(intervals)) + + fmt.Printf("const (\n") + fmt.Printf("\tjis0208 = 1\n") + fmt.Printf("\tjis0212 = 2\n") + fmt.Printf("\tcodeMask = 0x7f\n") + fmt.Printf("\tcodeShift = 7\n") + fmt.Printf("\ttableShift = 14\n") + fmt.Printf(")\n\n") + + fmt.Printf("const numEncodeTables = %d\n\n", len(intervals)) + fmt.Printf("// encodeX are the encoding tables from Unicode to JIS code,\n") + fmt.Printf("// sorted by decreasing length.\n") + for i, v := range intervals { + fmt.Printf("// encode%d: %5d entries for runes in [%5d, %5d).\n", i, v.len(), v.low, v.high) + } + fmt.Printf("//\n") + fmt.Printf("// The high two bits of the value record whether the JIS code comes from the\n") + fmt.Printf("// JIS0208 table (high bits == 1) or the JIS0212 table (high bits == 2).\n") + fmt.Printf("// The low 14 bits are two 7-bit unsigned integers j1 and j2 that form the\n") + fmt.Printf("// JIS code (94*j1 + j2) within that table.\n") + fmt.Printf("\n") + + for i, v := range intervals { + fmt.Printf("const encode%dLow, encode%dHigh = %d, %d\n\n", i, i, v.low, v.high) + fmt.Printf("var encode%d = [...]uint16{\n", i) + for j := v.low; j < v.high; j++ { + x := reverse[j] + if x.table == -1 { + continue + } + fmt.Printf("\t%d - %d: jis%s<<14 | 0x%02X<<7 | 0x%02X,\n", + j, v.low, tables[x.table].name, x.jisCode/94, x.jisCode%94) + } + fmt.Printf("}\n\n") + } +} + +// interval is a half-open interval [low, high). +type interval struct { + low, high int +} + +func (i interval) len() int { return i.high - i.low } + +// byDecreasingLength sorts intervals by decreasing length. +type byDecreasingLength []interval + +func (b byDecreasingLength) Len() int { return len(b) } +func (b byDecreasingLength) Less(i, j int) bool { return b[i].len() > b[j].len() } +func (b byDecreasingLength) Swap(i, j int) { b[i], b[j] = b[j], b[i] } diff --git a/vendor/golang.org/x/text/encoding/korean/maketables.go b/vendor/golang.org/x/text/encoding/korean/maketables.go new file mode 100644 index 000000000..c84034fb6 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/korean/maketables.go @@ -0,0 +1,143 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +package main + +// This program generates tables.go: +// go run maketables.go | gofmt > tables.go + +import ( + "bufio" + "fmt" + "log" + "net/http" + "sort" + "strings" +) + +func main() { + fmt.Printf("// generated by go run maketables.go; DO NOT EDIT\n\n") + fmt.Printf("// Package korean provides Korean encodings such as EUC-KR.\n") + fmt.Printf(`package korean // import "golang.org/x/text/encoding/korean"` + "\n\n") + + res, err := http.Get("http://encoding.spec.whatwg.org/index-euc-kr.txt") + if err != nil { + log.Fatalf("Get: %v", err) + } + defer res.Body.Close() + + mapping := [65536]uint16{} + reverse := [65536]uint16{} + + scanner := bufio.NewScanner(res.Body) + for scanner.Scan() { + s := strings.TrimSpace(scanner.Text()) + if s == "" || s[0] == '#' { + continue + } + x, y := uint16(0), uint16(0) + if _, err := fmt.Sscanf(s, "%d 0x%x", &x, &y); err != nil { + log.Fatalf("could not parse %q", s) + } + if x < 0 || 178*(0xc7-0x81)+(0xfe-0xc7)*94+(0xff-0xa1) <= x { + log.Fatalf("EUC-KR code %d is out of range", x) + } + mapping[x] = y + if reverse[y] == 0 { + c0, c1 := uint16(0), uint16(0) + if x < 178*(0xc7-0x81) { + c0 = uint16(x/178) + 0x81 + c1 = uint16(x % 178) + switch { + case c1 < 1*26: + c1 += 0x41 + case c1 < 2*26: + c1 += 0x47 + default: + c1 += 0x4d + } + } else { + x -= 178 * (0xc7 - 0x81) + c0 = uint16(x/94) + 0xc7 + c1 = uint16(x%94) + 0xa1 + } + reverse[y] = c0<<8 | c1 + } + } + if err := scanner.Err(); err != nil { + log.Fatalf("scanner error: %v", err) + } + + fmt.Printf("// decode is the decoding table from EUC-KR code to Unicode.\n") + fmt.Printf("// It is defined at http://encoding.spec.whatwg.org/index-euc-kr.txt\n") + fmt.Printf("var decode = [...]uint16{\n") + for i, v := range mapping { + if v != 0 { + fmt.Printf("\t%d: 0x%04X,\n", i, v) + } + } + fmt.Printf("}\n\n") + + // Any run of at least separation continuous zero entries in the reverse map will + // be a separate encode table. + const separation = 1024 + + intervals := []interval(nil) + low, high := -1, -1 + for i, v := range reverse { + if v == 0 { + continue + } + if low < 0 { + low = i + } else if i-high >= separation { + if high >= 0 { + intervals = append(intervals, interval{low, high}) + } + low = i + } + high = i + 1 + } + if high >= 0 { + intervals = append(intervals, interval{low, high}) + } + sort.Sort(byDecreasingLength(intervals)) + + fmt.Printf("const numEncodeTables = %d\n\n", len(intervals)) + fmt.Printf("// encodeX are the encoding tables from Unicode to EUC-KR code,\n") + fmt.Printf("// sorted by decreasing length.\n") + for i, v := range intervals { + fmt.Printf("// encode%d: %5d entries for runes in [%5d, %5d).\n", i, v.len(), v.low, v.high) + } + fmt.Printf("\n") + + for i, v := range intervals { + fmt.Printf("const encode%dLow, encode%dHigh = %d, %d\n\n", i, i, v.low, v.high) + fmt.Printf("var encode%d = [...]uint16{\n", i) + for j := v.low; j < v.high; j++ { + x := reverse[j] + if x == 0 { + continue + } + fmt.Printf("\t%d-%d: 0x%04X,\n", j, v.low, x) + } + fmt.Printf("}\n\n") + } +} + +// interval is a half-open interval [low, high). +type interval struct { + low, high int +} + +func (i interval) len() int { return i.high - i.low } + +// byDecreasingLength sorts intervals by decreasing length. +type byDecreasingLength []interval + +func (b byDecreasingLength) Len() int { return len(b) } +func (b byDecreasingLength) Less(i, j int) bool { return b[i].len() > b[j].len() } +func (b byDecreasingLength) Swap(i, j int) { b[i], b[j] = b[j], b[i] } diff --git a/vendor/golang.org/x/text/encoding/simplifiedchinese/maketables.go b/vendor/golang.org/x/text/encoding/simplifiedchinese/maketables.go new file mode 100644 index 000000000..55016c786 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/simplifiedchinese/maketables.go @@ -0,0 +1,161 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +package main + +// This program generates tables.go: +// go run maketables.go | gofmt > tables.go + +import ( + "bufio" + "fmt" + "log" + "net/http" + "sort" + "strings" +) + +func main() { + fmt.Printf("// generated by go run maketables.go; DO NOT EDIT\n\n") + fmt.Printf("// Package simplifiedchinese provides Simplified Chinese encodings such as GBK.\n") + fmt.Printf(`package simplifiedchinese // import "golang.org/x/text/encoding/simplifiedchinese"` + "\n\n") + + printGB18030() + printGBK() +} + +func printGB18030() { + res, err := http.Get("http://encoding.spec.whatwg.org/index-gb18030.txt") + if err != nil { + log.Fatalf("Get: %v", err) + } + defer res.Body.Close() + + fmt.Printf("// gb18030 is the table from http://encoding.spec.whatwg.org/index-gb18030.txt\n") + fmt.Printf("var gb18030 = [...][2]uint16{\n") + scanner := bufio.NewScanner(res.Body) + for scanner.Scan() { + s := strings.TrimSpace(scanner.Text()) + if s == "" || s[0] == '#' { + continue + } + x, y := uint32(0), uint32(0) + if _, err := fmt.Sscanf(s, "%d 0x%x", &x, &y); err != nil { + log.Fatalf("could not parse %q", s) + } + if x < 0x10000 && y < 0x10000 { + fmt.Printf("\t{0x%04x, 0x%04x},\n", x, y) + } + } + fmt.Printf("}\n\n") +} + +func printGBK() { + res, err := http.Get("http://encoding.spec.whatwg.org/index-gbk.txt") + if err != nil { + log.Fatalf("Get: %v", err) + } + defer res.Body.Close() + + mapping := [65536]uint16{} + reverse := [65536]uint16{} + + scanner := bufio.NewScanner(res.Body) + for scanner.Scan() { + s := strings.TrimSpace(scanner.Text()) + if s == "" || s[0] == '#' { + continue + } + x, y := uint16(0), uint16(0) + if _, err := fmt.Sscanf(s, "%d 0x%x", &x, &y); err != nil { + log.Fatalf("could not parse %q", s) + } + if x < 0 || 126*190 <= x { + log.Fatalf("GBK code %d is out of range", x) + } + mapping[x] = y + if reverse[y] == 0 { + c0, c1 := x/190, x%190 + if c1 >= 0x3f { + c1++ + } + reverse[y] = (0x81+c0)<<8 | (0x40 + c1) + } + } + if err := scanner.Err(); err != nil { + log.Fatalf("scanner error: %v", err) + } + + fmt.Printf("// decode is the decoding table from GBK code to Unicode.\n") + fmt.Printf("// It is defined at http://encoding.spec.whatwg.org/index-gbk.txt\n") + fmt.Printf("var decode = [...]uint16{\n") + for i, v := range mapping { + if v != 0 { + fmt.Printf("\t%d: 0x%04X,\n", i, v) + } + } + fmt.Printf("}\n\n") + + // Any run of at least separation continuous zero entries in the reverse map will + // be a separate encode table. + const separation = 1024 + + intervals := []interval(nil) + low, high := -1, -1 + for i, v := range reverse { + if v == 0 { + continue + } + if low < 0 { + low = i + } else if i-high >= separation { + if high >= 0 { + intervals = append(intervals, interval{low, high}) + } + low = i + } + high = i + 1 + } + if high >= 0 { + intervals = append(intervals, interval{low, high}) + } + sort.Sort(byDecreasingLength(intervals)) + + fmt.Printf("const numEncodeTables = %d\n\n", len(intervals)) + fmt.Printf("// encodeX are the encoding tables from Unicode to GBK code,\n") + fmt.Printf("// sorted by decreasing length.\n") + for i, v := range intervals { + fmt.Printf("// encode%d: %5d entries for runes in [%5d, %5d).\n", i, v.len(), v.low, v.high) + } + fmt.Printf("\n") + + for i, v := range intervals { + fmt.Printf("const encode%dLow, encode%dHigh = %d, %d\n\n", i, i, v.low, v.high) + fmt.Printf("var encode%d = [...]uint16{\n", i) + for j := v.low; j < v.high; j++ { + x := reverse[j] + if x == 0 { + continue + } + fmt.Printf("\t%d-%d: 0x%04X,\n", j, v.low, x) + } + fmt.Printf("}\n\n") + } +} + +// interval is a half-open interval [low, high). +type interval struct { + low, high int +} + +func (i interval) len() int { return i.high - i.low } + +// byDecreasingLength sorts intervals by decreasing length. +type byDecreasingLength []interval + +func (b byDecreasingLength) Len() int { return len(b) } +func (b byDecreasingLength) Less(i, j int) bool { return b[i].len() > b[j].len() } +func (b byDecreasingLength) Swap(i, j int) { b[i], b[j] = b[j], b[i] } diff --git a/vendor/golang.org/x/text/encoding/traditionalchinese/maketables.go b/vendor/golang.org/x/text/encoding/traditionalchinese/maketables.go new file mode 100644 index 000000000..cf7fdb31a --- /dev/null +++ b/vendor/golang.org/x/text/encoding/traditionalchinese/maketables.go @@ -0,0 +1,140 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +package main + +// This program generates tables.go: +// go run maketables.go | gofmt > tables.go + +import ( + "bufio" + "fmt" + "log" + "net/http" + "sort" + "strings" +) + +func main() { + fmt.Printf("// generated by go run maketables.go; DO NOT EDIT\n\n") + fmt.Printf("// Package traditionalchinese provides Traditional Chinese encodings such as Big5.\n") + fmt.Printf(`package traditionalchinese // import "golang.org/x/text/encoding/traditionalchinese"` + "\n\n") + + res, err := http.Get("http://encoding.spec.whatwg.org/index-big5.txt") + if err != nil { + log.Fatalf("Get: %v", err) + } + defer res.Body.Close() + + mapping := [65536]uint32{} + reverse := [65536 * 4]uint16{} + + scanner := bufio.NewScanner(res.Body) + for scanner.Scan() { + s := strings.TrimSpace(scanner.Text()) + if s == "" || s[0] == '#' { + continue + } + x, y := uint16(0), uint32(0) + if _, err := fmt.Sscanf(s, "%d 0x%x", &x, &y); err != nil { + log.Fatalf("could not parse %q", s) + } + if x < 0 || 126*157 <= x { + log.Fatalf("Big5 code %d is out of range", x) + } + mapping[x] = y + + // The WHATWG spec http://encoding.spec.whatwg.org/#indexes says that + // "The index pointer for code point in index is the first pointer + // corresponding to code point in index", which would normally mean + // that the code below should be guarded by "if reverse[y] == 0", but + // last instead of first seems to match the behavior of + // "iconv -f UTF-8 -t BIG5". For example, U+8005 者 occurs twice in + // http://encoding.spec.whatwg.org/index-big5.txt, as index 2148 + // (encoded as "\x8e\xcd") and index 6543 (encoded as "\xaa\xcc") + // and "echo 者 | iconv -f UTF-8 -t BIG5 | xxd" gives "\xaa\xcc". + c0, c1 := x/157, x%157 + if c1 < 0x3f { + c1 += 0x40 + } else { + c1 += 0x62 + } + reverse[y] = (0x81+c0)<<8 | c1 + } + if err := scanner.Err(); err != nil { + log.Fatalf("scanner error: %v", err) + } + + fmt.Printf("// decode is the decoding table from Big5 code to Unicode.\n") + fmt.Printf("// It is defined at http://encoding.spec.whatwg.org/index-big5.txt\n") + fmt.Printf("var decode = [...]uint32{\n") + for i, v := range mapping { + if v != 0 { + fmt.Printf("\t%d: 0x%08X,\n", i, v) + } + } + fmt.Printf("}\n\n") + + // Any run of at least separation continuous zero entries in the reverse map will + // be a separate encode table. + const separation = 1024 + + intervals := []interval(nil) + low, high := -1, -1 + for i, v := range reverse { + if v == 0 { + continue + } + if low < 0 { + low = i + } else if i-high >= separation { + if high >= 0 { + intervals = append(intervals, interval{low, high}) + } + low = i + } + high = i + 1 + } + if high >= 0 { + intervals = append(intervals, interval{low, high}) + } + sort.Sort(byDecreasingLength(intervals)) + + fmt.Printf("const numEncodeTables = %d\n\n", len(intervals)) + fmt.Printf("// encodeX are the encoding tables from Unicode to Big5 code,\n") + fmt.Printf("// sorted by decreasing length.\n") + for i, v := range intervals { + fmt.Printf("// encode%d: %5d entries for runes in [%6d, %6d).\n", i, v.len(), v.low, v.high) + } + fmt.Printf("\n") + + for i, v := range intervals { + fmt.Printf("const encode%dLow, encode%dHigh = %d, %d\n\n", i, i, v.low, v.high) + fmt.Printf("var encode%d = [...]uint16{\n", i) + for j := v.low; j < v.high; j++ { + x := reverse[j] + if x == 0 { + continue + } + fmt.Printf("\t%d-%d: 0x%04X,\n", j, v.low, x) + } + fmt.Printf("}\n\n") + } +} + +// interval is a half-open interval [low, high). +type interval struct { + low, high int +} + +func (i interval) len() int { return i.high - i.low } + +// byDecreasingLength sorts intervals by decreasing length. +type byDecreasingLength []interval + +func (b byDecreasingLength) Len() int { return len(b) } +func (b byDecreasingLength) Less(i, j int) bool { return b[i].len() > b[j].len() } +func (b byDecreasingLength) Swap(i, j int) { b[i], b[j] = b[j], b[i] } diff --git a/vendor/golang.org/x/text/internal/language/compact/gen.go b/vendor/golang.org/x/text/internal/language/compact/gen.go new file mode 100644 index 000000000..0c36a052f --- /dev/null +++ b/vendor/golang.org/x/text/internal/language/compact/gen.go @@ -0,0 +1,64 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +// Language tag table generator. +// Data read from the web. + +package main + +import ( + "flag" + "fmt" + "log" + + "golang.org/x/text/internal/gen" + "golang.org/x/text/unicode/cldr" +) + +var ( + test = flag.Bool("test", + false, + "test existing tables; can be used to compare web data with package data.") + outputFile = flag.String("output", + "tables.go", + "output file for generated tables") +) + +func main() { + gen.Init() + + w := gen.NewCodeWriter() + defer w.WriteGoFile("tables.go", "compact") + + fmt.Fprintln(w, `import "golang.org/x/text/internal/language"`) + + b := newBuilder(w) + gen.WriteCLDRVersion(w) + + b.writeCompactIndex() +} + +type builder struct { + w *gen.CodeWriter + data *cldr.CLDR + supp *cldr.SupplementalData +} + +func newBuilder(w *gen.CodeWriter) *builder { + r := gen.OpenCLDRCoreZip() + defer r.Close() + d := &cldr.Decoder{} + data, err := d.DecodeZip(r) + if err != nil { + log.Fatal(err) + } + b := builder{ + w: w, + data: data, + supp: data.Supplemental(), + } + return &b +} diff --git a/vendor/golang.org/x/text/internal/language/compact/gen_index.go b/vendor/golang.org/x/text/internal/language/compact/gen_index.go new file mode 100644 index 000000000..136cefaf0 --- /dev/null +++ b/vendor/golang.org/x/text/internal/language/compact/gen_index.go @@ -0,0 +1,113 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +package main + +// This file generates derivative tables based on the language package itself. + +import ( + "fmt" + "log" + "sort" + "strings" + + "golang.org/x/text/internal/language" +) + +// Compact indices: +// Note -va-X variants only apply to localization variants. +// BCP variants only ever apply to language. +// The only ambiguity between tags is with regions. + +func (b *builder) writeCompactIndex() { + // Collect all language tags for which we have any data in CLDR. + m := map[language.Tag]bool{} + for _, lang := range b.data.Locales() { + // We include all locales unconditionally to be consistent with en_US. + // We want en_US, even though it has no data associated with it. + + // TODO: put any of the languages for which no data exists at the end + // of the index. This allows all components based on ICU to use that + // as the cutoff point. + // if x := data.RawLDML(lang); false || + // x.LocaleDisplayNames != nil || + // x.Characters != nil || + // x.Delimiters != nil || + // x.Measurement != nil || + // x.Dates != nil || + // x.Numbers != nil || + // x.Units != nil || + // x.ListPatterns != nil || + // x.Collations != nil || + // x.Segmentations != nil || + // x.Rbnf != nil || + // x.Annotations != nil || + // x.Metadata != nil { + + // TODO: support POSIX natively, albeit non-standard. + tag := language.Make(strings.Replace(lang, "_POSIX", "-u-va-posix", 1)) + m[tag] = true + // } + } + + // TODO: plural rules are also defined for the deprecated tags: + // iw mo sh tl + // Consider removing these as compact tags. + + // Include locales for plural rules, which uses a different structure. + for _, plurals := range b.supp.Plurals { + for _, rules := range plurals.PluralRules { + for _, lang := range strings.Split(rules.Locales, " ") { + m[language.Make(lang)] = true + } + } + } + + var coreTags []language.CompactCoreInfo + var special []string + + for t := range m { + if x := t.Extensions(); len(x) != 0 && fmt.Sprint(x) != "[u-va-posix]" { + log.Fatalf("Unexpected extension %v in %v", x, t) + } + if len(t.Variants()) == 0 && len(t.Extensions()) == 0 { + cci, ok := language.GetCompactCore(t) + if !ok { + log.Fatalf("Locale for non-basic language %q", t) + } + coreTags = append(coreTags, cci) + } else { + special = append(special, t.String()) + } + } + + w := b.w + + sort.Slice(coreTags, func(i, j int) bool { return coreTags[i] < coreTags[j] }) + sort.Strings(special) + + w.WriteComment(` + NumCompactTags is the number of common tags. The maximum tag is + NumCompactTags-1.`) + w.WriteConst("NumCompactTags", len(m)) + + fmt.Fprintln(w, "const (") + for i, t := range coreTags { + fmt.Fprintf(w, "%s ID = %d\n", ident(t.Tag().String()), i) + } + for i, t := range special { + fmt.Fprintf(w, "%s ID = %d\n", ident(t), i+len(coreTags)) + } + fmt.Fprintln(w, ")") + + w.WriteVar("coreTags", coreTags) + + w.WriteConst("specialTagsStr", strings.Join(special, " ")) +} + +func ident(s string) string { + return strings.Replace(s, "-", "", -1) + "Index" +} diff --git a/vendor/golang.org/x/text/internal/language/compact/gen_parents.go b/vendor/golang.org/x/text/internal/language/compact/gen_parents.go new file mode 100644 index 000000000..9543d5832 --- /dev/null +++ b/vendor/golang.org/x/text/internal/language/compact/gen_parents.go @@ -0,0 +1,54 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +package main + +import ( + "log" + + "golang.org/x/text/internal/gen" + "golang.org/x/text/internal/language" + "golang.org/x/text/internal/language/compact" + "golang.org/x/text/unicode/cldr" +) + +func main() { + r := gen.OpenCLDRCoreZip() + defer r.Close() + + d := &cldr.Decoder{} + data, err := d.DecodeZip(r) + if err != nil { + log.Fatalf("DecodeZip: %v", err) + } + + w := gen.NewCodeWriter() + defer w.WriteGoFile("parents.go", "compact") + + // Create parents table. + type ID uint16 + parents := make([]ID, compact.NumCompactTags) + for _, loc := range data.Locales() { + tag := language.MustParse(loc) + index, ok := compact.FromTag(tag) + if !ok { + continue + } + parentIndex := compact.ID(0) // und + for p := tag.Parent(); p != language.Und; p = p.Parent() { + if x, ok := compact.FromTag(p); ok { + parentIndex = x + break + } + } + parents[index] = ID(parentIndex) + } + + w.WriteComment(` + parents maps a compact index of a tag to the compact index of the parent of + this tag.`) + w.WriteVar("parents", parents) +} diff --git a/vendor/golang.org/x/text/internal/language/gen.go b/vendor/golang.org/x/text/internal/language/gen.go new file mode 100644 index 000000000..cdcc7febc --- /dev/null +++ b/vendor/golang.org/x/text/internal/language/gen.go @@ -0,0 +1,1520 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +// Language tag table generator. +// Data read from the web. + +package main + +import ( + "bufio" + "flag" + "fmt" + "io" + "io/ioutil" + "log" + "math" + "reflect" + "regexp" + "sort" + "strconv" + "strings" + + "golang.org/x/text/internal/gen" + "golang.org/x/text/internal/tag" + "golang.org/x/text/unicode/cldr" +) + +var ( + test = flag.Bool("test", + false, + "test existing tables; can be used to compare web data with package data.") + outputFile = flag.String("output", + "tables.go", + "output file for generated tables") +) + +var comment = []string{ + ` +lang holds an alphabetically sorted list of ISO-639 language identifiers. +All entries are 4 bytes. The index of the identifier (divided by 4) is the language tag. +For 2-byte language identifiers, the two successive bytes have the following meaning: + - if the first letter of the 2- and 3-letter ISO codes are the same: + the second and third letter of the 3-letter ISO code. + - otherwise: a 0 and a by 2 bits right-shifted index into altLangISO3. +For 3-byte language identifiers the 4th byte is 0.`, + ` +langNoIndex is a bit vector of all 3-letter language codes that are not used as an index +in lookup tables. The language ids for these language codes are derived directly +from the letters and are not consecutive.`, + ` +altLangISO3 holds an alphabetically sorted list of 3-letter language code alternatives +to 2-letter language codes that cannot be derived using the method described above. +Each 3-letter code is followed by its 1-byte langID.`, + ` +altLangIndex is used to convert indexes in altLangISO3 to langIDs.`, + ` +AliasMap maps langIDs to their suggested replacements.`, + ` +script is an alphabetically sorted list of ISO 15924 codes. The index +of the script in the string, divided by 4, is the internal scriptID.`, + ` +isoRegionOffset needs to be added to the index of regionISO to obtain the regionID +for 2-letter ISO codes. (The first isoRegionOffset regionIDs are reserved for +the UN.M49 codes used for groups.)`, + ` +regionISO holds a list of alphabetically sorted 2-letter ISO region codes. +Each 2-letter codes is followed by two bytes with the following meaning: + - [A-Z}{2}: the first letter of the 2-letter code plus these two + letters form the 3-letter ISO code. + - 0, n: index into altRegionISO3.`, + ` +regionTypes defines the status of a region for various standards.`, + ` +m49 maps regionIDs to UN.M49 codes. The first isoRegionOffset entries are +codes indicating collections of regions.`, + ` +m49Index gives indexes into fromM49 based on the three most significant bits +of a 10-bit UN.M49 code. To search an UN.M49 code in fromM49, search in + fromM49[m49Index[msb39(code)]:m49Index[msb3(code)+1]] +for an entry where the first 7 bits match the 7 lsb of the UN.M49 code. +The region code is stored in the 9 lsb of the indexed value.`, + ` +fromM49 contains entries to map UN.M49 codes to regions. See m49Index for details.`, + ` +altRegionISO3 holds a list of 3-letter region codes that cannot be +mapped to 2-letter codes using the default algorithm. This is a short list.`, + ` +altRegionIDs holds a list of regionIDs the positions of which match those +of the 3-letter ISO codes in altRegionISO3.`, + ` +variantNumSpecialized is the number of specialized variants in variants.`, + ` +suppressScript is an index from langID to the dominant script for that language, +if it exists. If a script is given, it should be suppressed from the language tag.`, + ` +likelyLang is a lookup table, indexed by langID, for the most likely +scripts and regions given incomplete information. If more entries exist for a +given language, region and script are the index and size respectively +of the list in likelyLangList.`, + ` +likelyLangList holds lists info associated with likelyLang.`, + ` +likelyRegion is a lookup table, indexed by regionID, for the most likely +languages and scripts given incomplete information. If more entries exist +for a given regionID, lang and script are the index and size respectively +of the list in likelyRegionList. +TODO: exclude containers and user-definable regions from the list.`, + ` +likelyRegionList holds lists info associated with likelyRegion.`, + ` +likelyScript is a lookup table, indexed by scriptID, for the most likely +languages and regions given a script.`, + ` +nRegionGroups is the number of region groups.`, + ` +regionInclusion maps region identifiers to sets of regions in regionInclusionBits, +where each set holds all groupings that are directly connected in a region +containment graph.`, + ` +regionInclusionBits is an array of bit vectors where every vector represents +a set of region groupings. These sets are used to compute the distance +between two regions for the purpose of language matching.`, + ` +regionInclusionNext marks, for each entry in regionInclusionBits, the set of +all groups that are reachable from the groups set in the respective entry.`, +} + +// TODO: consider changing some of these structures to tries. This can reduce +// memory, but may increase the need for memory allocations. This could be +// mitigated if we can piggyback on language tags for common cases. + +func failOnError(e error) { + if e != nil { + log.Panic(e) + } +} + +type setType int + +const ( + Indexed setType = 1 + iota // all elements must be of same size + Linear +) + +type stringSet struct { + s []string + sorted, frozen bool + + // We often need to update values after the creation of an index is completed. + // We include a convenience map for keeping track of this. + update map[string]string + typ setType // used for checking. +} + +func (ss *stringSet) clone() stringSet { + c := *ss + c.s = append([]string(nil), c.s...) + return c +} + +func (ss *stringSet) setType(t setType) { + if ss.typ != t && ss.typ != 0 { + log.Panicf("type %d cannot be assigned as it was already %d", t, ss.typ) + } +} + +// parse parses a whitespace-separated string and initializes ss with its +// components. +func (ss *stringSet) parse(s string) { + scan := bufio.NewScanner(strings.NewReader(s)) + scan.Split(bufio.ScanWords) + for scan.Scan() { + ss.add(scan.Text()) + } +} + +func (ss *stringSet) assertChangeable() { + if ss.frozen { + log.Panic("attempt to modify a frozen stringSet") + } +} + +func (ss *stringSet) add(s string) { + ss.assertChangeable() + ss.s = append(ss.s, s) + ss.sorted = ss.frozen +} + +func (ss *stringSet) freeze() { + ss.compact() + ss.frozen = true +} + +func (ss *stringSet) compact() { + if ss.sorted { + return + } + a := ss.s + sort.Strings(a) + k := 0 + for i := 1; i < len(a); i++ { + if a[k] != a[i] { + a[k+1] = a[i] + k++ + } + } + ss.s = a[:k+1] + ss.sorted = ss.frozen +} + +type funcSorter struct { + fn func(a, b string) bool + sort.StringSlice +} + +func (s funcSorter) Less(i, j int) bool { + return s.fn(s.StringSlice[i], s.StringSlice[j]) +} + +func (ss *stringSet) sortFunc(f func(a, b string) bool) { + ss.compact() + sort.Sort(funcSorter{f, sort.StringSlice(ss.s)}) +} + +func (ss *stringSet) remove(s string) { + ss.assertChangeable() + if i, ok := ss.find(s); ok { + copy(ss.s[i:], ss.s[i+1:]) + ss.s = ss.s[:len(ss.s)-1] + } +} + +func (ss *stringSet) replace(ol, nu string) { + ss.s[ss.index(ol)] = nu + ss.sorted = ss.frozen +} + +func (ss *stringSet) index(s string) int { + ss.setType(Indexed) + i, ok := ss.find(s) + if !ok { + if i < len(ss.s) { + log.Panicf("find: item %q is not in list. Closest match is %q.", s, ss.s[i]) + } + log.Panicf("find: item %q is not in list", s) + + } + return i +} + +func (ss *stringSet) find(s string) (int, bool) { + ss.compact() + i := sort.SearchStrings(ss.s, s) + return i, i != len(ss.s) && ss.s[i] == s +} + +func (ss *stringSet) slice() []string { + ss.compact() + return ss.s +} + +func (ss *stringSet) updateLater(v, key string) { + if ss.update == nil { + ss.update = map[string]string{} + } + ss.update[v] = key +} + +// join joins the string and ensures that all entries are of the same length. +func (ss *stringSet) join() string { + ss.setType(Indexed) + n := len(ss.s[0]) + for _, s := range ss.s { + if len(s) != n { + log.Panicf("join: not all entries are of the same length: %q", s) + } + } + ss.s = append(ss.s, strings.Repeat("\xff", n)) + return strings.Join(ss.s, "") +} + +// ianaEntry holds information for an entry in the IANA Language Subtag Repository. +// All types use the same entry. +// See http://tools.ietf.org/html/bcp47#section-5.1 for a description of the various +// fields. +type ianaEntry struct { + typ string + description []string + scope string + added string + preferred string + deprecated string + suppressScript string + macro string + prefix []string +} + +type builder struct { + w *gen.CodeWriter + hw io.Writer // MultiWriter for w and w.Hash + data *cldr.CLDR + supp *cldr.SupplementalData + + // indices + locale stringSet // common locales + lang stringSet // canonical language ids (2 or 3 letter ISO codes) with data + langNoIndex stringSet // 3-letter ISO codes with no associated data + script stringSet // 4-letter ISO codes + region stringSet // 2-letter ISO or 3-digit UN M49 codes + variant stringSet // 4-8-alphanumeric variant code. + + // Region codes that are groups with their corresponding group IDs. + groups map[int]index + + // langInfo + registry map[string]*ianaEntry +} + +type index uint + +func newBuilder(w *gen.CodeWriter) *builder { + r := gen.OpenCLDRCoreZip() + defer r.Close() + d := &cldr.Decoder{} + data, err := d.DecodeZip(r) + failOnError(err) + b := builder{ + w: w, + hw: io.MultiWriter(w, w.Hash), + data: data, + supp: data.Supplemental(), + } + b.parseRegistry() + return &b +} + +func (b *builder) parseRegistry() { + r := gen.OpenIANAFile("assignments/language-subtag-registry") + defer r.Close() + b.registry = make(map[string]*ianaEntry) + + scan := bufio.NewScanner(r) + scan.Split(bufio.ScanWords) + var record *ianaEntry + for more := scan.Scan(); more; { + key := scan.Text() + more = scan.Scan() + value := scan.Text() + switch key { + case "Type:": + record = &ianaEntry{typ: value} + case "Subtag:", "Tag:": + if s := strings.SplitN(value, "..", 2); len(s) > 1 { + for a := s[0]; a <= s[1]; a = inc(a) { + b.addToRegistry(a, record) + } + } else { + b.addToRegistry(value, record) + } + case "Suppress-Script:": + record.suppressScript = value + case "Added:": + record.added = value + case "Deprecated:": + record.deprecated = value + case "Macrolanguage:": + record.macro = value + case "Preferred-Value:": + record.preferred = value + case "Prefix:": + record.prefix = append(record.prefix, value) + case "Scope:": + record.scope = value + case "Description:": + buf := []byte(value) + for more = scan.Scan(); more; more = scan.Scan() { + b := scan.Bytes() + if b[0] == '%' || b[len(b)-1] == ':' { + break + } + buf = append(buf, ' ') + buf = append(buf, b...) + } + record.description = append(record.description, string(buf)) + continue + default: + continue + } + more = scan.Scan() + } + if scan.Err() != nil { + log.Panic(scan.Err()) + } +} + +func (b *builder) addToRegistry(key string, entry *ianaEntry) { + if info, ok := b.registry[key]; ok { + if info.typ != "language" || entry.typ != "extlang" { + log.Fatalf("parseRegistry: tag %q already exists", key) + } + } else { + b.registry[key] = entry + } +} + +var commentIndex = make(map[string]string) + +func init() { + for _, s := range comment { + key := strings.TrimSpace(strings.SplitN(s, " ", 2)[0]) + commentIndex[key] = s + } +} + +func (b *builder) comment(name string) { + if s := commentIndex[name]; len(s) > 0 { + b.w.WriteComment(s) + } else { + fmt.Fprintln(b.w) + } +} + +func (b *builder) pf(f string, x ...interface{}) { + fmt.Fprintf(b.hw, f, x...) + fmt.Fprint(b.hw, "\n") +} + +func (b *builder) p(x ...interface{}) { + fmt.Fprintln(b.hw, x...) +} + +func (b *builder) addSize(s int) { + b.w.Size += s + b.pf("// Size: %d bytes", s) +} + +func (b *builder) writeConst(name string, x interface{}) { + b.comment(name) + b.w.WriteConst(name, x) +} + +// writeConsts computes f(v) for all v in values and writes the results +// as constants named _v to a single constant block. +func (b *builder) writeConsts(f func(string) int, values ...string) { + b.pf("const (") + for _, v := range values { + b.pf("\t_%s = %v", v, f(v)) + } + b.pf(")") +} + +// writeType writes the type of the given value, which must be a struct. +func (b *builder) writeType(value interface{}) { + b.comment(reflect.TypeOf(value).Name()) + b.w.WriteType(value) +} + +func (b *builder) writeSlice(name string, ss interface{}) { + b.writeSliceAddSize(name, 0, ss) +} + +func (b *builder) writeSliceAddSize(name string, extraSize int, ss interface{}) { + b.comment(name) + b.w.Size += extraSize + v := reflect.ValueOf(ss) + t := v.Type().Elem() + b.pf("// Size: %d bytes, %d elements", v.Len()*int(t.Size())+extraSize, v.Len()) + + fmt.Fprintf(b.w, "var %s = ", name) + b.w.WriteArray(ss) + b.p() +} + +type FromTo struct { + From, To uint16 +} + +func (b *builder) writeSortedMap(name string, ss *stringSet, index func(s string) uint16) { + ss.sortFunc(func(a, b string) bool { + return index(a) < index(b) + }) + m := []FromTo{} + for _, s := range ss.s { + m = append(m, FromTo{index(s), index(ss.update[s])}) + } + b.writeSlice(name, m) +} + +const base = 'z' - 'a' + 1 + +func strToInt(s string) uint { + v := uint(0) + for i := 0; i < len(s); i++ { + v *= base + v += uint(s[i] - 'a') + } + return v +} + +// converts the given integer to the original ASCII string passed to strToInt. +// len(s) must match the number of characters obtained. +func intToStr(v uint, s []byte) { + for i := len(s) - 1; i >= 0; i-- { + s[i] = byte(v%base) + 'a' + v /= base + } +} + +func (b *builder) writeBitVector(name string, ss []string) { + vec := make([]uint8, int(math.Ceil(math.Pow(base, float64(len(ss[0])))/8))) + for _, s := range ss { + v := strToInt(s) + vec[v/8] |= 1 << (v % 8) + } + b.writeSlice(name, vec) +} + +// TODO: convert this type into a list or two-stage trie. +func (b *builder) writeMapFunc(name string, m map[string]string, f func(string) uint16) { + b.comment(name) + v := reflect.ValueOf(m) + sz := v.Len() * (2 + int(v.Type().Key().Size())) + for _, k := range m { + sz += len(k) + } + b.addSize(sz) + keys := []string{} + b.pf(`var %s = map[string]uint16{`, name) + for k := range m { + keys = append(keys, k) + } + sort.Strings(keys) + for _, k := range keys { + b.pf("\t%q: %v,", k, f(m[k])) + } + b.p("}") +} + +func (b *builder) writeMap(name string, m interface{}) { + b.comment(name) + v := reflect.ValueOf(m) + sz := v.Len() * (2 + int(v.Type().Key().Size()) + int(v.Type().Elem().Size())) + b.addSize(sz) + f := strings.FieldsFunc(fmt.Sprintf("%#v", m), func(r rune) bool { + return strings.IndexRune("{}, ", r) != -1 + }) + sort.Strings(f[1:]) + b.pf(`var %s = %s{`, name, f[0]) + for _, kv := range f[1:] { + b.pf("\t%s,", kv) + } + b.p("}") +} + +func (b *builder) langIndex(s string) uint16 { + if s == "und" { + return 0 + } + if i, ok := b.lang.find(s); ok { + return uint16(i) + } + return uint16(strToInt(s)) + uint16(len(b.lang.s)) +} + +// inc advances the string to its lexicographical successor. +func inc(s string) string { + const maxTagLength = 4 + var buf [maxTagLength]byte + intToStr(strToInt(strings.ToLower(s))+1, buf[:len(s)]) + for i := 0; i < len(s); i++ { + if s[i] <= 'Z' { + buf[i] -= 'a' - 'A' + } + } + return string(buf[:len(s)]) +} + +func (b *builder) parseIndices() { + meta := b.supp.Metadata + + for k, v := range b.registry { + var ss *stringSet + switch v.typ { + case "language": + if len(k) == 2 || v.suppressScript != "" || v.scope == "special" { + b.lang.add(k) + continue + } else { + ss = &b.langNoIndex + } + case "region": + ss = &b.region + case "script": + ss = &b.script + case "variant": + ss = &b.variant + default: + continue + } + ss.add(k) + } + // Include any language for which there is data. + for _, lang := range b.data.Locales() { + if x := b.data.RawLDML(lang); false || + x.LocaleDisplayNames != nil || + x.Characters != nil || + x.Delimiters != nil || + x.Measurement != nil || + x.Dates != nil || + x.Numbers != nil || + x.Units != nil || + x.ListPatterns != nil || + x.Collations != nil || + x.Segmentations != nil || + x.Rbnf != nil || + x.Annotations != nil || + x.Metadata != nil { + + from := strings.Split(lang, "_") + if lang := from[0]; lang != "root" { + b.lang.add(lang) + } + } + } + // Include locales for plural rules, which uses a different structure. + for _, plurals := range b.data.Supplemental().Plurals { + for _, rules := range plurals.PluralRules { + for _, lang := range strings.Split(rules.Locales, " ") { + if lang = strings.Split(lang, "_")[0]; lang != "root" { + b.lang.add(lang) + } + } + } + } + // Include languages in likely subtags. + for _, m := range b.supp.LikelySubtags.LikelySubtag { + from := strings.Split(m.From, "_") + b.lang.add(from[0]) + } + // Include ISO-639 alpha-3 bibliographic entries. + for _, a := range meta.Alias.LanguageAlias { + if a.Reason == "bibliographic" { + b.langNoIndex.add(a.Type) + } + } + // Include regions in territoryAlias (not all are in the IANA registry!) + for _, reg := range b.supp.Metadata.Alias.TerritoryAlias { + if len(reg.Type) == 2 { + b.region.add(reg.Type) + } + } + + for _, s := range b.lang.s { + if len(s) == 3 { + b.langNoIndex.remove(s) + } + } + b.writeConst("NumLanguages", len(b.lang.slice())+len(b.langNoIndex.slice())) + b.writeConst("NumScripts", len(b.script.slice())) + b.writeConst("NumRegions", len(b.region.slice())) + + // Add dummy codes at the start of each list to represent "unspecified". + b.lang.add("---") + b.script.add("----") + b.region.add("---") + + // common locales + b.locale.parse(meta.DefaultContent.Locales) +} + +// TODO: region inclusion data will probably not be use used in future matchers. + +func (b *builder) computeRegionGroups() { + b.groups = make(map[int]index) + + // Create group indices. + for i := 1; b.region.s[i][0] < 'A'; i++ { // Base M49 indices on regionID. + b.groups[i] = index(len(b.groups)) + } + for _, g := range b.supp.TerritoryContainment.Group { + // Skip UN and EURO zone as they are flattening the containment + // relationship. + if g.Type == "EZ" || g.Type == "UN" { + continue + } + group := b.region.index(g.Type) + if _, ok := b.groups[group]; !ok { + b.groups[group] = index(len(b.groups)) + } + } + if len(b.groups) > 64 { + log.Fatalf("only 64 groups supported, found %d", len(b.groups)) + } + b.writeConst("nRegionGroups", len(b.groups)) +} + +var langConsts = []string{ + "af", "am", "ar", "az", "bg", "bn", "ca", "cs", "da", "de", "el", "en", "es", + "et", "fa", "fi", "fil", "fr", "gu", "he", "hi", "hr", "hu", "hy", "id", "is", + "it", "ja", "ka", "kk", "km", "kn", "ko", "ky", "lo", "lt", "lv", "mk", "ml", + "mn", "mo", "mr", "ms", "mul", "my", "nb", "ne", "nl", "no", "pa", "pl", "pt", + "ro", "ru", "sh", "si", "sk", "sl", "sq", "sr", "sv", "sw", "ta", "te", "th", + "tl", "tn", "tr", "uk", "ur", "uz", "vi", "zh", "zu", + + // constants for grandfathered tags (if not already defined) + "jbo", "ami", "bnn", "hak", "tlh", "lb", "nv", "pwn", "tao", "tay", "tsu", + "nn", "sfb", "vgt", "sgg", "cmn", "nan", "hsn", +} + +// writeLanguage generates all tables needed for language canonicalization. +func (b *builder) writeLanguage() { + meta := b.supp.Metadata + + b.writeConst("nonCanonicalUnd", b.lang.index("und")) + b.writeConsts(func(s string) int { return int(b.langIndex(s)) }, langConsts...) + b.writeConst("langPrivateStart", b.langIndex("qaa")) + b.writeConst("langPrivateEnd", b.langIndex("qtz")) + + // Get language codes that need to be mapped (overlong 3-letter codes, + // deprecated 2-letter codes, legacy and grandfathered tags.) + langAliasMap := stringSet{} + aliasTypeMap := map[string]AliasType{} + + // altLangISO3 get the alternative ISO3 names that need to be mapped. + altLangISO3 := stringSet{} + // Add dummy start to avoid the use of index 0. + altLangISO3.add("---") + altLangISO3.updateLater("---", "aa") + + lang := b.lang.clone() + for _, a := range meta.Alias.LanguageAlias { + if a.Replacement == "" { + a.Replacement = "und" + } + // TODO: support mapping to tags + repl := strings.SplitN(a.Replacement, "_", 2)[0] + if a.Reason == "overlong" { + if len(a.Replacement) == 2 && len(a.Type) == 3 { + lang.updateLater(a.Replacement, a.Type) + } + } else if len(a.Type) <= 3 { + switch a.Reason { + case "macrolanguage": + aliasTypeMap[a.Type] = Macro + case "deprecated": + // handled elsewhere + continue + case "bibliographic", "legacy": + if a.Type == "no" { + continue + } + aliasTypeMap[a.Type] = Legacy + default: + log.Fatalf("new %s alias: %s", a.Reason, a.Type) + } + langAliasMap.add(a.Type) + langAliasMap.updateLater(a.Type, repl) + } + } + // Manually add the mapping of "nb" (Norwegian) to its macro language. + // This can be removed if CLDR adopts this change. + langAliasMap.add("nb") + langAliasMap.updateLater("nb", "no") + aliasTypeMap["nb"] = Macro + + for k, v := range b.registry { + // Also add deprecated values for 3-letter ISO codes, which CLDR omits. + if v.typ == "language" && v.deprecated != "" && v.preferred != "" { + langAliasMap.add(k) + langAliasMap.updateLater(k, v.preferred) + aliasTypeMap[k] = Deprecated + } + } + // Fix CLDR mappings. + lang.updateLater("tl", "tgl") + lang.updateLater("sh", "hbs") + lang.updateLater("mo", "mol") + lang.updateLater("no", "nor") + lang.updateLater("tw", "twi") + lang.updateLater("nb", "nob") + lang.updateLater("ak", "aka") + lang.updateLater("bh", "bih") + + // Ensure that each 2-letter code is matched with a 3-letter code. + for _, v := range lang.s[1:] { + s, ok := lang.update[v] + if !ok { + if s, ok = lang.update[langAliasMap.update[v]]; !ok { + continue + } + lang.update[v] = s + } + if v[0] != s[0] { + altLangISO3.add(s) + altLangISO3.updateLater(s, v) + } + } + + // Complete canonicalized language tags. + lang.freeze() + for i, v := range lang.s { + // We can avoid these manual entries by using the IANA registry directly. + // Seems easier to update the list manually, as changes are rare. + // The panic in this loop will trigger if we miss an entry. + add := "" + if s, ok := lang.update[v]; ok { + if s[0] == v[0] { + add = s[1:] + } else { + add = string([]byte{0, byte(altLangISO3.index(s))}) + } + } else if len(v) == 3 { + add = "\x00" + } else { + log.Panicf("no data for long form of %q", v) + } + lang.s[i] += add + } + b.writeConst("lang", tag.Index(lang.join())) + + b.writeConst("langNoIndexOffset", len(b.lang.s)) + + // space of all valid 3-letter language identifiers. + b.writeBitVector("langNoIndex", b.langNoIndex.slice()) + + altLangIndex := []uint16{} + for i, s := range altLangISO3.slice() { + altLangISO3.s[i] += string([]byte{byte(len(altLangIndex))}) + if i > 0 { + idx := b.lang.index(altLangISO3.update[s]) + altLangIndex = append(altLangIndex, uint16(idx)) + } + } + b.writeConst("altLangISO3", tag.Index(altLangISO3.join())) + b.writeSlice("altLangIndex", altLangIndex) + + b.writeSortedMap("AliasMap", &langAliasMap, b.langIndex) + types := make([]AliasType, len(langAliasMap.s)) + for i, s := range langAliasMap.s { + types[i] = aliasTypeMap[s] + } + b.writeSlice("AliasTypes", types) +} + +var scriptConsts = []string{ + "Latn", "Hani", "Hans", "Hant", "Qaaa", "Qaai", "Qabx", "Zinh", "Zyyy", + "Zzzz", +} + +func (b *builder) writeScript() { + b.writeConsts(b.script.index, scriptConsts...) + b.writeConst("script", tag.Index(b.script.join())) + + supp := make([]uint8, len(b.lang.slice())) + for i, v := range b.lang.slice()[1:] { + if sc := b.registry[v].suppressScript; sc != "" { + supp[i+1] = uint8(b.script.index(sc)) + } + } + b.writeSlice("suppressScript", supp) + + // There is only one deprecated script in CLDR. This value is hard-coded. + // We check here if the code must be updated. + for _, a := range b.supp.Metadata.Alias.ScriptAlias { + if a.Type != "Qaai" { + log.Panicf("unexpected deprecated stript %q", a.Type) + } + } +} + +func parseM49(s string) int16 { + if len(s) == 0 { + return 0 + } + v, err := strconv.ParseUint(s, 10, 10) + failOnError(err) + return int16(v) +} + +var regionConsts = []string{ + "001", "419", "BR", "CA", "ES", "GB", "MD", "PT", "UK", "US", + "ZZ", "XA", "XC", "XK", // Unofficial tag for Kosovo. +} + +func (b *builder) writeRegion() { + b.writeConsts(b.region.index, regionConsts...) + + isoOffset := b.region.index("AA") + m49map := make([]int16, len(b.region.slice())) + fromM49map := make(map[int16]int) + altRegionISO3 := "" + altRegionIDs := []uint16{} + + b.writeConst("isoRegionOffset", isoOffset) + + // 2-letter region lookup and mapping to numeric codes. + regionISO := b.region.clone() + regionISO.s = regionISO.s[isoOffset:] + regionISO.sorted = false + + regionTypes := make([]byte, len(b.region.s)) + + // Is the region valid BCP 47? + for s, e := range b.registry { + if len(s) == 2 && s == strings.ToUpper(s) { + i := b.region.index(s) + for _, d := range e.description { + if strings.Contains(d, "Private use") { + regionTypes[i] = iso3166UserAssigned + } + } + regionTypes[i] |= bcp47Region + } + } + + // Is the region a valid ccTLD? + r := gen.OpenIANAFile("domains/root/db") + defer r.Close() + + buf, err := ioutil.ReadAll(r) + failOnError(err) + re := regexp.MustCompile(`"/domains/root/db/([a-z]{2}).html"`) + for _, m := range re.FindAllSubmatch(buf, -1) { + i := b.region.index(strings.ToUpper(string(m[1]))) + regionTypes[i] |= ccTLD + } + + b.writeSlice("regionTypes", regionTypes) + + iso3Set := make(map[string]int) + update := func(iso2, iso3 string) { + i := regionISO.index(iso2) + if j, ok := iso3Set[iso3]; !ok && iso3[0] == iso2[0] { + regionISO.s[i] += iso3[1:] + iso3Set[iso3] = -1 + } else { + if ok && j >= 0 { + regionISO.s[i] += string([]byte{0, byte(j)}) + } else { + iso3Set[iso3] = len(altRegionISO3) + regionISO.s[i] += string([]byte{0, byte(len(altRegionISO3))}) + altRegionISO3 += iso3 + altRegionIDs = append(altRegionIDs, uint16(isoOffset+i)) + } + } + } + for _, tc := range b.supp.CodeMappings.TerritoryCodes { + i := regionISO.index(tc.Type) + isoOffset + if d := m49map[i]; d != 0 { + log.Panicf("%s found as a duplicate UN.M49 code of %03d", tc.Numeric, d) + } + m49 := parseM49(tc.Numeric) + m49map[i] = m49 + if r := fromM49map[m49]; r == 0 { + fromM49map[m49] = i + } else if r != i { + dep := b.registry[regionISO.s[r-isoOffset]].deprecated + if t := b.registry[tc.Type]; t != nil && dep != "" && (t.deprecated == "" || t.deprecated > dep) { + fromM49map[m49] = i + } + } + } + for _, ta := range b.supp.Metadata.Alias.TerritoryAlias { + if len(ta.Type) == 3 && ta.Type[0] <= '9' && len(ta.Replacement) == 2 { + from := parseM49(ta.Type) + if r := fromM49map[from]; r == 0 { + fromM49map[from] = regionISO.index(ta.Replacement) + isoOffset + } + } + } + for _, tc := range b.supp.CodeMappings.TerritoryCodes { + if len(tc.Alpha3) == 3 { + update(tc.Type, tc.Alpha3) + } + } + // This entries are not included in territoryCodes. Mostly 3-letter variants + // of deleted codes and an entry for QU. + for _, m := range []struct{ iso2, iso3 string }{ + {"CT", "CTE"}, + {"DY", "DHY"}, + {"HV", "HVO"}, + {"JT", "JTN"}, + {"MI", "MID"}, + {"NH", "NHB"}, + {"NQ", "ATN"}, + {"PC", "PCI"}, + {"PU", "PUS"}, + {"PZ", "PCZ"}, + {"RH", "RHO"}, + {"VD", "VDR"}, + {"WK", "WAK"}, + // These three-letter codes are used for others as well. + {"FQ", "ATF"}, + } { + update(m.iso2, m.iso3) + } + for i, s := range regionISO.s { + if len(s) != 4 { + regionISO.s[i] = s + " " + } + } + b.writeConst("regionISO", tag.Index(regionISO.join())) + b.writeConst("altRegionISO3", altRegionISO3) + b.writeSlice("altRegionIDs", altRegionIDs) + + // Create list of deprecated regions. + // TODO: consider inserting SF -> FI. Not included by CLDR, but is the only + // Transitionally-reserved mapping not included. + regionOldMap := stringSet{} + // Include regions in territoryAlias (not all are in the IANA registry!) + for _, reg := range b.supp.Metadata.Alias.TerritoryAlias { + if len(reg.Type) == 2 && reg.Reason == "deprecated" && len(reg.Replacement) == 2 { + regionOldMap.add(reg.Type) + regionOldMap.updateLater(reg.Type, reg.Replacement) + i, _ := regionISO.find(reg.Type) + j, _ := regionISO.find(reg.Replacement) + if k := m49map[i+isoOffset]; k == 0 { + m49map[i+isoOffset] = m49map[j+isoOffset] + } + } + } + b.writeSortedMap("regionOldMap", ®ionOldMap, func(s string) uint16 { + return uint16(b.region.index(s)) + }) + // 3-digit region lookup, groupings. + for i := 1; i < isoOffset; i++ { + m := parseM49(b.region.s[i]) + m49map[i] = m + fromM49map[m] = i + } + b.writeSlice("m49", m49map) + + const ( + searchBits = 7 + regionBits = 9 + ) + if len(m49map) >= 1< %d", len(m49map), 1<>searchBits] = int16(len(fromM49)) + } + b.writeSlice("m49Index", m49Index) + b.writeSlice("fromM49", fromM49) +} + +const ( + // TODO: put these lists in regionTypes as user data? Could be used for + // various optimizations and refinements and could be exposed in the API. + iso3166Except = "AC CP DG EA EU FX IC SU TA UK" + iso3166Trans = "AN BU CS NT TP YU ZR" // SF is not in our set of Regions. + // DY and RH are actually not deleted, but indeterminately reserved. + iso3166DelCLDR = "CT DD DY FQ HV JT MI NH NQ PC PU PZ RH VD WK YD" +) + +const ( + iso3166UserAssigned = 1 << iota + ccTLD + bcp47Region +) + +func find(list []string, s string) int { + for i, t := range list { + if t == s { + return i + } + } + return -1 +} + +// writeVariants generates per-variant information and creates a map from variant +// name to index value. We assign index values such that sorting multiple +// variants by index value will result in the correct order. +// There are two types of variants: specialized and general. Specialized variants +// are only applicable to certain language or language-script pairs. Generalized +// variants apply to any language. Generalized variants always sort after +// specialized variants. We will therefore always assign a higher index value +// to a generalized variant than any other variant. Generalized variants are +// sorted alphabetically among themselves. +// Specialized variants may also sort after other specialized variants. Such +// variants will be ordered after any of the variants they may follow. +// We assume that if a variant x is followed by a variant y, then for any prefix +// p of x, p-x is a prefix of y. This allows us to order tags based on the +// maximum of the length of any of its prefixes. +// TODO: it is possible to define a set of Prefix values on variants such that +// a total order cannot be defined to the point that this algorithm breaks. +// In other words, we cannot guarantee the same order of variants for the +// future using the same algorithm or for non-compliant combinations of +// variants. For this reason, consider using simple alphabetic sorting +// of variants and ignore Prefix restrictions altogether. +func (b *builder) writeVariant() { + generalized := stringSet{} + specialized := stringSet{} + specializedExtend := stringSet{} + // Collate the variants by type and check assumptions. + for _, v := range b.variant.slice() { + e := b.registry[v] + if len(e.prefix) == 0 { + generalized.add(v) + continue + } + c := strings.Split(e.prefix[0], "-") + hasScriptOrRegion := false + if len(c) > 1 { + _, hasScriptOrRegion = b.script.find(c[1]) + if !hasScriptOrRegion { + _, hasScriptOrRegion = b.region.find(c[1]) + + } + } + if len(c) == 1 || len(c) == 2 && hasScriptOrRegion { + // Variant is preceded by a language. + specialized.add(v) + continue + } + // Variant is preceded by another variant. + specializedExtend.add(v) + prefix := c[0] + "-" + if hasScriptOrRegion { + prefix += c[1] + } + for _, p := range e.prefix { + // Verify that the prefix minus the last element is a prefix of the + // predecessor element. + i := strings.LastIndex(p, "-") + pred := b.registry[p[i+1:]] + if find(pred.prefix, p[:i]) < 0 { + log.Fatalf("prefix %q for variant %q not consistent with predecessor spec", p, v) + } + // The sorting used below does not work in the general case. It works + // if we assume that variants that may be followed by others only have + // prefixes of the same length. Verify this. + count := strings.Count(p[:i], "-") + for _, q := range pred.prefix { + if c := strings.Count(q, "-"); c != count { + log.Fatalf("variant %q preceding %q has a prefix %q of size %d; want %d", p[i+1:], v, q, c, count) + } + } + if !strings.HasPrefix(p, prefix) { + log.Fatalf("prefix %q of variant %q should start with %q", p, v, prefix) + } + } + } + + // Sort extended variants. + a := specializedExtend.s + less := func(v, w string) bool { + // Sort by the maximum number of elements. + maxCount := func(s string) (max int) { + for _, p := range b.registry[s].prefix { + if c := strings.Count(p, "-"); c > max { + max = c + } + } + return + } + if cv, cw := maxCount(v), maxCount(w); cv != cw { + return cv < cw + } + // Sort by name as tie breaker. + return v < w + } + sort.Sort(funcSorter{less, sort.StringSlice(a)}) + specializedExtend.frozen = true + + // Create index from variant name to index. + variantIndex := make(map[string]uint8) + add := func(s []string) { + for _, v := range s { + variantIndex[v] = uint8(len(variantIndex)) + } + } + add(specialized.slice()) + add(specializedExtend.s) + numSpecialized := len(variantIndex) + add(generalized.slice()) + if n := len(variantIndex); n > 255 { + log.Fatalf("maximum number of variants exceeded: was %d; want <= 255", n) + } + b.writeMap("variantIndex", variantIndex) + b.writeConst("variantNumSpecialized", numSpecialized) +} + +func (b *builder) writeLanguageInfo() { +} + +// writeLikelyData writes tables that are used both for finding parent relations and for +// language matching. Each entry contains additional bits to indicate the status of the +// data to know when it cannot be used for parent relations. +func (b *builder) writeLikelyData() { + const ( + isList = 1 << iota + scriptInFrom + regionInFrom + ) + type ( // generated types + likelyScriptRegion struct { + region uint16 + script uint8 + flags uint8 + } + likelyLangScript struct { + lang uint16 + script uint8 + flags uint8 + } + likelyLangRegion struct { + lang uint16 + region uint16 + } + // likelyTag is used for getting likely tags for group regions, where + // the likely region might be a region contained in the group. + likelyTag struct { + lang uint16 + region uint16 + script uint8 + } + ) + var ( // generated variables + likelyRegionGroup = make([]likelyTag, len(b.groups)) + likelyLang = make([]likelyScriptRegion, len(b.lang.s)) + likelyRegion = make([]likelyLangScript, len(b.region.s)) + likelyScript = make([]likelyLangRegion, len(b.script.s)) + likelyLangList = []likelyScriptRegion{} + likelyRegionList = []likelyLangScript{} + ) + type fromTo struct { + from, to []string + } + langToOther := map[int][]fromTo{} + regionToOther := map[int][]fromTo{} + for _, m := range b.supp.LikelySubtags.LikelySubtag { + from := strings.Split(m.From, "_") + to := strings.Split(m.To, "_") + if len(to) != 3 { + log.Fatalf("invalid number of subtags in %q: found %d, want 3", m.To, len(to)) + } + if len(from) > 3 { + log.Fatalf("invalid number of subtags: found %d, want 1-3", len(from)) + } + if from[0] != to[0] && from[0] != "und" { + log.Fatalf("unexpected language change in expansion: %s -> %s", from, to) + } + if len(from) == 3 { + if from[2] != to[2] { + log.Fatalf("unexpected region change in expansion: %s -> %s", from, to) + } + if from[0] != "und" { + log.Fatalf("unexpected fully specified from tag: %s -> %s", from, to) + } + } + if len(from) == 1 || from[0] != "und" { + id := 0 + if from[0] != "und" { + id = b.lang.index(from[0]) + } + langToOther[id] = append(langToOther[id], fromTo{from, to}) + } else if len(from) == 2 && len(from[1]) == 4 { + sid := b.script.index(from[1]) + likelyScript[sid].lang = uint16(b.langIndex(to[0])) + likelyScript[sid].region = uint16(b.region.index(to[2])) + } else { + r := b.region.index(from[len(from)-1]) + if id, ok := b.groups[r]; ok { + if from[0] != "und" { + log.Fatalf("region changed unexpectedly: %s -> %s", from, to) + } + likelyRegionGroup[id].lang = uint16(b.langIndex(to[0])) + likelyRegionGroup[id].script = uint8(b.script.index(to[1])) + likelyRegionGroup[id].region = uint16(b.region.index(to[2])) + } else { + regionToOther[r] = append(regionToOther[r], fromTo{from, to}) + } + } + } + b.writeType(likelyLangRegion{}) + b.writeSlice("likelyScript", likelyScript) + + for id := range b.lang.s { + list := langToOther[id] + if len(list) == 1 { + likelyLang[id].region = uint16(b.region.index(list[0].to[2])) + likelyLang[id].script = uint8(b.script.index(list[0].to[1])) + } else if len(list) > 1 { + likelyLang[id].flags = isList + likelyLang[id].region = uint16(len(likelyLangList)) + likelyLang[id].script = uint8(len(list)) + for _, x := range list { + flags := uint8(0) + if len(x.from) > 1 { + if x.from[1] == x.to[2] { + flags = regionInFrom + } else { + flags = scriptInFrom + } + } + likelyLangList = append(likelyLangList, likelyScriptRegion{ + region: uint16(b.region.index(x.to[2])), + script: uint8(b.script.index(x.to[1])), + flags: flags, + }) + } + } + } + // TODO: merge suppressScript data with this table. + b.writeType(likelyScriptRegion{}) + b.writeSlice("likelyLang", likelyLang) + b.writeSlice("likelyLangList", likelyLangList) + + for id := range b.region.s { + list := regionToOther[id] + if len(list) == 1 { + likelyRegion[id].lang = uint16(b.langIndex(list[0].to[0])) + likelyRegion[id].script = uint8(b.script.index(list[0].to[1])) + if len(list[0].from) > 2 { + likelyRegion[id].flags = scriptInFrom + } + } else if len(list) > 1 { + likelyRegion[id].flags = isList + likelyRegion[id].lang = uint16(len(likelyRegionList)) + likelyRegion[id].script = uint8(len(list)) + for i, x := range list { + if len(x.from) == 2 && i != 0 || i > 0 && len(x.from) != 3 { + log.Fatalf("unspecified script must be first in list: %v at %d", x.from, i) + } + x := likelyLangScript{ + lang: uint16(b.langIndex(x.to[0])), + script: uint8(b.script.index(x.to[1])), + } + if len(list[0].from) > 2 { + x.flags = scriptInFrom + } + likelyRegionList = append(likelyRegionList, x) + } + } + } + b.writeType(likelyLangScript{}) + b.writeSlice("likelyRegion", likelyRegion) + b.writeSlice("likelyRegionList", likelyRegionList) + + b.writeType(likelyTag{}) + b.writeSlice("likelyRegionGroup", likelyRegionGroup) +} + +func (b *builder) writeRegionInclusionData() { + var ( + // mm holds for each group the set of groups with a distance of 1. + mm = make(map[int][]index) + + // containment holds for each group the transitive closure of + // containment of other groups. + containment = make(map[index][]index) + ) + for _, g := range b.supp.TerritoryContainment.Group { + // Skip UN and EURO zone as they are flattening the containment + // relationship. + if g.Type == "EZ" || g.Type == "UN" { + continue + } + group := b.region.index(g.Type) + groupIdx := b.groups[group] + for _, mem := range strings.Split(g.Contains, " ") { + r := b.region.index(mem) + mm[r] = append(mm[r], groupIdx) + if g, ok := b.groups[r]; ok { + mm[group] = append(mm[group], g) + containment[groupIdx] = append(containment[groupIdx], g) + } + } + } + + regionContainment := make([]uint64, len(b.groups)) + for _, g := range b.groups { + l := containment[g] + + // Compute the transitive closure of containment. + for i := 0; i < len(l); i++ { + l = append(l, containment[l[i]]...) + } + + // Compute the bitmask. + regionContainment[g] = 1 << g + for _, v := range l { + regionContainment[g] |= 1 << v + } + } + b.writeSlice("regionContainment", regionContainment) + + regionInclusion := make([]uint8, len(b.region.s)) + bvs := make(map[uint64]index) + // Make the first bitvector positions correspond with the groups. + for r, i := range b.groups { + bv := uint64(1 << i) + for _, g := range mm[r] { + bv |= 1 << g + } + bvs[bv] = i + regionInclusion[r] = uint8(bvs[bv]) + } + for r := 1; r < len(b.region.s); r++ { + if _, ok := b.groups[r]; !ok { + bv := uint64(0) + for _, g := range mm[r] { + bv |= 1 << g + } + if bv == 0 { + // Pick the world for unspecified regions. + bv = 1 << b.groups[b.region.index("001")] + } + if _, ok := bvs[bv]; !ok { + bvs[bv] = index(len(bvs)) + } + regionInclusion[r] = uint8(bvs[bv]) + } + } + b.writeSlice("regionInclusion", regionInclusion) + regionInclusionBits := make([]uint64, len(bvs)) + for k, v := range bvs { + regionInclusionBits[v] = uint64(k) + } + // Add bit vectors for increasingly large distances until a fixed point is reached. + regionInclusionNext := []uint8{} + for i := 0; i < len(regionInclusionBits); i++ { + bits := regionInclusionBits[i] + next := bits + for i := uint(0); i < uint(len(b.groups)); i++ { + if bits&(1< 6 { + log.Fatalf("Too many groups: %d", i) + } + idToIndex[mv.Id] = uint8(i + 1) + // TODO: also handle '-' + for _, r := range strings.Split(mv.Value, "+") { + todo := []string{r} + for k := 0; k < len(todo); k++ { + r := todo[k] + regionToGroups[b.regionIndex(r)] |= 1 << uint8(i) + todo = append(todo, regionHierarchy[r]...) + } + } + } + b.w.WriteVar("regionToGroups", regionToGroups) + + // maps language id to in- and out-of-group region. + paradigmLocales := [][3]uint16{} + locales := strings.Split(lm[0].ParadigmLocales[0].Locales, " ") + for i := 0; i < len(locales); i += 2 { + x := [3]uint16{} + for j := 0; j < 2; j++ { + pc := strings.SplitN(locales[i+j], "-", 2) + x[0] = b.langIndex(pc[0]) + if len(pc) == 2 { + x[1+j] = uint16(b.regionIndex(pc[1])) + } + } + paradigmLocales = append(paradigmLocales, x) + } + b.w.WriteVar("paradigmLocales", paradigmLocales) + + b.w.WriteType(mutualIntelligibility{}) + b.w.WriteType(scriptIntelligibility{}) + b.w.WriteType(regionIntelligibility{}) + + matchLang := []mutualIntelligibility{} + matchScript := []scriptIntelligibility{} + matchRegion := []regionIntelligibility{} + // Convert the languageMatch entries in lists keyed by desired language. + for _, m := range lm[0].LanguageMatch { + // Different versions of CLDR use different separators. + desired := strings.Replace(m.Desired, "-", "_", -1) + supported := strings.Replace(m.Supported, "-", "_", -1) + d := strings.Split(desired, "_") + s := strings.Split(supported, "_") + if len(d) != len(s) { + log.Fatalf("not supported: desired=%q; supported=%q", desired, supported) + continue + } + distance, _ := strconv.ParseInt(m.Distance, 10, 8) + switch len(d) { + case 2: + if desired == supported && desired == "*_*" { + continue + } + // language-script pair. + matchScript = append(matchScript, scriptIntelligibility{ + wantLang: uint16(b.langIndex(d[0])), + haveLang: uint16(b.langIndex(s[0])), + wantScript: uint8(b.scriptIndex(d[1])), + haveScript: uint8(b.scriptIndex(s[1])), + distance: uint8(distance), + }) + if m.Oneway != "true" { + matchScript = append(matchScript, scriptIntelligibility{ + wantLang: uint16(b.langIndex(s[0])), + haveLang: uint16(b.langIndex(d[0])), + wantScript: uint8(b.scriptIndex(s[1])), + haveScript: uint8(b.scriptIndex(d[1])), + distance: uint8(distance), + }) + } + case 1: + if desired == supported && desired == "*" { + continue + } + if distance == 1 { + // nb == no is already handled by macro mapping. Check there + // really is only this case. + if d[0] != "no" || s[0] != "nb" { + log.Fatalf("unhandled equivalence %s == %s", s[0], d[0]) + } + continue + } + // TODO: consider dropping oneway field and just doubling the entry. + matchLang = append(matchLang, mutualIntelligibility{ + want: uint16(b.langIndex(d[0])), + have: uint16(b.langIndex(s[0])), + distance: uint8(distance), + oneway: m.Oneway == "true", + }) + case 3: + if desired == supported && desired == "*_*_*" { + continue + } + if desired != supported { + // This is now supported by CLDR, but only one case, which + // should already be covered by paradigm locales. For instance, + // test case "und, en, en-GU, en-IN, en-GB ; en-ZA ; en-GB" in + // testdata/CLDRLocaleMatcherTest.txt tests this. + if supported != "en_*_GB" { + log.Fatalf("not supported: desired=%q; supported=%q", desired, supported) + } + continue + } + ri := regionIntelligibility{ + lang: b.langIndex(d[0]), + distance: uint8(distance), + } + if d[1] != "*" { + ri.script = uint8(b.scriptIndex(d[1])) + } + switch { + case d[2] == "*": + ri.group = 0x80 // not contained in anything + case strings.HasPrefix(d[2], "$!"): + ri.group = 0x80 + d[2] = "$" + d[2][len("$!"):] + fallthrough + case strings.HasPrefix(d[2], "$"): + ri.group |= idToIndex[d[2]] + } + matchRegion = append(matchRegion, ri) + default: + log.Fatalf("not supported: desired=%q; supported=%q", desired, supported) + } + } + sort.SliceStable(matchLang, func(i, j int) bool { + return matchLang[i].distance < matchLang[j].distance + }) + b.w.WriteComment(` + matchLang holds pairs of langIDs of base languages that are typically + mutually intelligible. Each pair is associated with a confidence and + whether the intelligibility goes one or both ways.`) + b.w.WriteVar("matchLang", matchLang) + + b.w.WriteComment(` + matchScript holds pairs of scriptIDs where readers of one script + can typically also read the other. Each is associated with a confidence.`) + sort.SliceStable(matchScript, func(i, j int) bool { + return matchScript[i].distance < matchScript[j].distance + }) + b.w.WriteVar("matchScript", matchScript) + + sort.SliceStable(matchRegion, func(i, j int) bool { + return matchRegion[i].distance < matchRegion[j].distance + }) + b.w.WriteVar("matchRegion", matchRegion) +} diff --git a/vendor/golang.org/x/text/unicode/bidi/gen.go b/vendor/golang.org/x/text/unicode/bidi/gen.go new file mode 100644 index 000000000..987fc169c --- /dev/null +++ b/vendor/golang.org/x/text/unicode/bidi/gen.go @@ -0,0 +1,133 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +package main + +import ( + "flag" + "log" + + "golang.org/x/text/internal/gen" + "golang.org/x/text/internal/triegen" + "golang.org/x/text/internal/ucd" +) + +var outputFile = flag.String("out", "tables.go", "output file") + +func main() { + gen.Init() + gen.Repackage("gen_trieval.go", "trieval.go", "bidi") + gen.Repackage("gen_ranges.go", "ranges_test.go", "bidi") + + genTables() +} + +// bidiClass names and codes taken from class "bc" in +// https://www.unicode.org/Public/8.0.0/ucd/PropertyValueAliases.txt +var bidiClass = map[string]Class{ + "AL": AL, // ArabicLetter + "AN": AN, // ArabicNumber + "B": B, // ParagraphSeparator + "BN": BN, // BoundaryNeutral + "CS": CS, // CommonSeparator + "EN": EN, // EuropeanNumber + "ES": ES, // EuropeanSeparator + "ET": ET, // EuropeanTerminator + "L": L, // LeftToRight + "NSM": NSM, // NonspacingMark + "ON": ON, // OtherNeutral + "R": R, // RightToLeft + "S": S, // SegmentSeparator + "WS": WS, // WhiteSpace + + "FSI": Control, + "PDF": Control, + "PDI": Control, + "LRE": Control, + "LRI": Control, + "LRO": Control, + "RLE": Control, + "RLI": Control, + "RLO": Control, +} + +func genTables() { + if numClass > 0x0F { + log.Fatalf("Too many Class constants (%#x > 0x0F).", numClass) + } + w := gen.NewCodeWriter() + defer w.WriteVersionedGoFile(*outputFile, "bidi") + + gen.WriteUnicodeVersion(w) + + t := triegen.NewTrie("bidi") + + // Build data about bracket mapping. These bits need to be or-ed with + // any other bits. + orMask := map[rune]uint64{} + + xorMap := map[rune]int{} + xorMasks := []rune{0} // First value is no-op. + + ucd.Parse(gen.OpenUCDFile("BidiBrackets.txt"), func(p *ucd.Parser) { + r1 := p.Rune(0) + r2 := p.Rune(1) + xor := r1 ^ r2 + if _, ok := xorMap[xor]; !ok { + xorMap[xor] = len(xorMasks) + xorMasks = append(xorMasks, xor) + } + entry := uint64(xorMap[xor]) << xorMaskShift + switch p.String(2) { + case "o": + entry |= openMask + case "c", "n": + default: + log.Fatalf("Unknown bracket class %q.", p.String(2)) + } + orMask[r1] = entry + }) + + w.WriteComment(` + xorMasks contains masks to be xor-ed with brackets to get the reverse + version.`) + w.WriteVar("xorMasks", xorMasks) + + done := map[rune]bool{} + + insert := func(r rune, c Class) { + if !done[r] { + t.Insert(r, orMask[r]|uint64(c)) + done[r] = true + } + } + + // Insert the derived BiDi properties. + ucd.Parse(gen.OpenUCDFile("extracted/DerivedBidiClass.txt"), func(p *ucd.Parser) { + r := p.Rune(0) + class, ok := bidiClass[p.String(1)] + if !ok { + log.Fatalf("%U: Unknown BiDi class %q", r, p.String(1)) + } + insert(r, class) + }) + visitDefaults(insert) + + // TODO: use sparse blocks. This would reduce table size considerably + // from the looks of it. + + sz, err := t.Gen(w) + if err != nil { + log.Fatal(err) + } + w.Size += sz +} + +// dummy values to make methods in gen_common compile. The real versions +// will be generated by this file to tables.go. +var ( + xorMasks []rune +) diff --git a/vendor/golang.org/x/text/unicode/bidi/gen_ranges.go b/vendor/golang.org/x/text/unicode/bidi/gen_ranges.go new file mode 100644 index 000000000..02c3b505d --- /dev/null +++ b/vendor/golang.org/x/text/unicode/bidi/gen_ranges.go @@ -0,0 +1,57 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +package main + +import ( + "unicode" + + "golang.org/x/text/internal/gen" + "golang.org/x/text/internal/ucd" + "golang.org/x/text/unicode/rangetable" +) + +// These tables are hand-extracted from: +// https://www.unicode.org/Public/8.0.0/ucd/extracted/DerivedBidiClass.txt +func visitDefaults(fn func(r rune, c Class)) { + // first write default values for ranges listed above. + visitRunes(fn, AL, []rune{ + 0x0600, 0x07BF, // Arabic + 0x08A0, 0x08FF, // Arabic Extended-A + 0xFB50, 0xFDCF, // Arabic Presentation Forms + 0xFDF0, 0xFDFF, + 0xFE70, 0xFEFF, + 0x0001EE00, 0x0001EEFF, // Arabic Mathematical Alpha Symbols + }) + visitRunes(fn, R, []rune{ + 0x0590, 0x05FF, // Hebrew + 0x07C0, 0x089F, // Nko et al. + 0xFB1D, 0xFB4F, + 0x00010800, 0x00010FFF, // Cypriot Syllabary et. al. + 0x0001E800, 0x0001EDFF, + 0x0001EF00, 0x0001EFFF, + }) + visitRunes(fn, ET, []rune{ // European Terminator + 0x20A0, 0x20Cf, // Currency symbols + }) + rangetable.Visit(unicode.Noncharacter_Code_Point, func(r rune) { + fn(r, BN) // Boundary Neutral + }) + ucd.Parse(gen.OpenUCDFile("DerivedCoreProperties.txt"), func(p *ucd.Parser) { + if p.String(1) == "Default_Ignorable_Code_Point" { + fn(p.Rune(0), BN) // Boundary Neutral + } + }) +} + +func visitRunes(fn func(r rune, c Class), c Class, runes []rune) { + for i := 0; i < len(runes); i += 2 { + lo, hi := runes[i], runes[i+1] + for j := lo; j <= hi; j++ { + fn(j, c) + } + } +} diff --git a/vendor/golang.org/x/text/unicode/bidi/gen_trieval.go b/vendor/golang.org/x/text/unicode/bidi/gen_trieval.go new file mode 100644 index 000000000..9cb994289 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/bidi/gen_trieval.go @@ -0,0 +1,64 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +package main + +// Class is the Unicode BiDi class. Each rune has a single class. +type Class uint + +const ( + L Class = iota // LeftToRight + R // RightToLeft + EN // EuropeanNumber + ES // EuropeanSeparator + ET // EuropeanTerminator + AN // ArabicNumber + CS // CommonSeparator + B // ParagraphSeparator + S // SegmentSeparator + WS // WhiteSpace + ON // OtherNeutral + BN // BoundaryNeutral + NSM // NonspacingMark + AL // ArabicLetter + Control // Control LRO - PDI + + numClass + + LRO // LeftToRightOverride + RLO // RightToLeftOverride + LRE // LeftToRightEmbedding + RLE // RightToLeftEmbedding + PDF // PopDirectionalFormat + LRI // LeftToRightIsolate + RLI // RightToLeftIsolate + FSI // FirstStrongIsolate + PDI // PopDirectionalIsolate + + unknownClass = ^Class(0) +) + +var controlToClass = map[rune]Class{ + 0x202D: LRO, // LeftToRightOverride, + 0x202E: RLO, // RightToLeftOverride, + 0x202A: LRE, // LeftToRightEmbedding, + 0x202B: RLE, // RightToLeftEmbedding, + 0x202C: PDF, // PopDirectionalFormat, + 0x2066: LRI, // LeftToRightIsolate, + 0x2067: RLI, // RightToLeftIsolate, + 0x2068: FSI, // FirstStrongIsolate, + 0x2069: PDI, // PopDirectionalIsolate, +} + +// A trie entry has the following bits: +// 7..5 XOR mask for brackets +// 4 1: Bracket open, 0: Bracket close +// 3..0 Class type + +const ( + openMask = 0x10 + xorMaskShift = 5 +) diff --git a/vendor/golang.org/x/text/unicode/norm/maketables.go b/vendor/golang.org/x/text/unicode/norm/maketables.go new file mode 100644 index 000000000..30a3aa933 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/norm/maketables.go @@ -0,0 +1,986 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +// Normalization table generator. +// Data read from the web. +// See forminfo.go for a description of the trie values associated with each rune. + +package main + +import ( + "bytes" + "encoding/binary" + "flag" + "fmt" + "io" + "log" + "sort" + "strconv" + "strings" + + "golang.org/x/text/internal/gen" + "golang.org/x/text/internal/triegen" + "golang.org/x/text/internal/ucd" +) + +func main() { + gen.Init() + loadUnicodeData() + compactCCC() + loadCompositionExclusions() + completeCharFields(FCanonical) + completeCharFields(FCompatibility) + computeNonStarterCounts() + verifyComputed() + printChars() + testDerived() + printTestdata() + makeTables() +} + +var ( + tablelist = flag.String("tables", + "all", + "comma-separated list of which tables to generate; "+ + "can be 'decomp', 'recomp', 'info' and 'all'") + test = flag.Bool("test", + false, + "test existing tables against DerivedNormalizationProps and generate test data for regression testing") + verbose = flag.Bool("verbose", + false, + "write data to stdout as it is parsed") +) + +const MaxChar = 0x10FFFF // anything above this shouldn't exist + +// Quick Check properties of runes allow us to quickly +// determine whether a rune may occur in a normal form. +// For a given normal form, a rune may be guaranteed to occur +// verbatim (QC=Yes), may or may not combine with another +// rune (QC=Maybe), or may not occur (QC=No). +type QCResult int + +const ( + QCUnknown QCResult = iota + QCYes + QCNo + QCMaybe +) + +func (r QCResult) String() string { + switch r { + case QCYes: + return "Yes" + case QCNo: + return "No" + case QCMaybe: + return "Maybe" + } + return "***UNKNOWN***" +} + +const ( + FCanonical = iota // NFC or NFD + FCompatibility // NFKC or NFKD + FNumberOfFormTypes +) + +const ( + MComposed = iota // NFC or NFKC + MDecomposed // NFD or NFKD + MNumberOfModes +) + +// This contains only the properties we're interested in. +type Char struct { + name string + codePoint rune // if zero, this index is not a valid code point. + ccc uint8 // canonical combining class + origCCC uint8 + excludeInComp bool // from CompositionExclusions.txt + compatDecomp bool // it has a compatibility expansion + + nTrailingNonStarters uint8 + nLeadingNonStarters uint8 // must be equal to trailing if non-zero + + forms [FNumberOfFormTypes]FormInfo // For FCanonical and FCompatibility + + state State +} + +var chars = make([]Char, MaxChar+1) +var cccMap = make(map[uint8]uint8) + +func (c Char) String() string { + buf := new(bytes.Buffer) + + fmt.Fprintf(buf, "%U [%s]:\n", c.codePoint, c.name) + fmt.Fprintf(buf, " ccc: %v\n", c.ccc) + fmt.Fprintf(buf, " excludeInComp: %v\n", c.excludeInComp) + fmt.Fprintf(buf, " compatDecomp: %v\n", c.compatDecomp) + fmt.Fprintf(buf, " state: %v\n", c.state) + fmt.Fprintf(buf, " NFC:\n") + fmt.Fprint(buf, c.forms[FCanonical]) + fmt.Fprintf(buf, " NFKC:\n") + fmt.Fprint(buf, c.forms[FCompatibility]) + + return buf.String() +} + +// In UnicodeData.txt, some ranges are marked like this: +// 3400;;Lo;0;L;;;;;N;;;;; +// 4DB5;;Lo;0;L;;;;;N;;;;; +// parseCharacter keeps a state variable indicating the weirdness. +type State int + +const ( + SNormal State = iota // known to be zero for the type + SFirst + SLast + SMissing +) + +var lastChar = rune('\u0000') + +func (c Char) isValid() bool { + return c.codePoint != 0 && c.state != SMissing +} + +type FormInfo struct { + quickCheck [MNumberOfModes]QCResult // index: MComposed or MDecomposed + verified [MNumberOfModes]bool // index: MComposed or MDecomposed + + combinesForward bool // May combine with rune on the right + combinesBackward bool // May combine with rune on the left + isOneWay bool // Never appears in result + inDecomp bool // Some decompositions result in this char. + decomp Decomposition + expandedDecomp Decomposition +} + +func (f FormInfo) String() string { + buf := bytes.NewBuffer(make([]byte, 0)) + + fmt.Fprintf(buf, " quickCheck[C]: %v\n", f.quickCheck[MComposed]) + fmt.Fprintf(buf, " quickCheck[D]: %v\n", f.quickCheck[MDecomposed]) + fmt.Fprintf(buf, " cmbForward: %v\n", f.combinesForward) + fmt.Fprintf(buf, " cmbBackward: %v\n", f.combinesBackward) + fmt.Fprintf(buf, " isOneWay: %v\n", f.isOneWay) + fmt.Fprintf(buf, " inDecomp: %v\n", f.inDecomp) + fmt.Fprintf(buf, " decomposition: %X\n", f.decomp) + fmt.Fprintf(buf, " expandedDecomp: %X\n", f.expandedDecomp) + + return buf.String() +} + +type Decomposition []rune + +func parseDecomposition(s string, skipfirst bool) (a []rune, err error) { + decomp := strings.Split(s, " ") + if len(decomp) > 0 && skipfirst { + decomp = decomp[1:] + } + for _, d := range decomp { + point, err := strconv.ParseUint(d, 16, 64) + if err != nil { + return a, err + } + a = append(a, rune(point)) + } + return a, nil +} + +func loadUnicodeData() { + f := gen.OpenUCDFile("UnicodeData.txt") + defer f.Close() + p := ucd.New(f) + for p.Next() { + r := p.Rune(ucd.CodePoint) + char := &chars[r] + + char.ccc = uint8(p.Uint(ucd.CanonicalCombiningClass)) + decmap := p.String(ucd.DecompMapping) + + exp, err := parseDecomposition(decmap, false) + isCompat := false + if err != nil { + if len(decmap) > 0 { + exp, err = parseDecomposition(decmap, true) + if err != nil { + log.Fatalf(`%U: bad decomp |%v|: "%s"`, r, decmap, err) + } + isCompat = true + } + } + + char.name = p.String(ucd.Name) + char.codePoint = r + char.forms[FCompatibility].decomp = exp + if !isCompat { + char.forms[FCanonical].decomp = exp + } else { + char.compatDecomp = true + } + if len(decmap) > 0 { + char.forms[FCompatibility].decomp = exp + } + } + if err := p.Err(); err != nil { + log.Fatal(err) + } +} + +// compactCCC converts the sparse set of CCC values to a continguous one, +// reducing the number of bits needed from 8 to 6. +func compactCCC() { + m := make(map[uint8]uint8) + for i := range chars { + c := &chars[i] + m[c.ccc] = 0 + } + cccs := []int{} + for v, _ := range m { + cccs = append(cccs, int(v)) + } + sort.Ints(cccs) + for i, c := range cccs { + cccMap[uint8(i)] = uint8(c) + m[uint8(c)] = uint8(i) + } + for i := range chars { + c := &chars[i] + c.origCCC = c.ccc + c.ccc = m[c.ccc] + } + if len(m) >= 1<<6 { + log.Fatalf("too many difference CCC values: %d >= 64", len(m)) + } +} + +// CompositionExclusions.txt has form: +// 0958 # ... +// See https://unicode.org/reports/tr44/ for full explanation +func loadCompositionExclusions() { + f := gen.OpenUCDFile("CompositionExclusions.txt") + defer f.Close() + p := ucd.New(f) + for p.Next() { + c := &chars[p.Rune(0)] + if c.excludeInComp { + log.Fatalf("%U: Duplicate entry in exclusions.", c.codePoint) + } + c.excludeInComp = true + } + if e := p.Err(); e != nil { + log.Fatal(e) + } +} + +// hasCompatDecomp returns true if any of the recursive +// decompositions contains a compatibility expansion. +// In this case, the character may not occur in NFK*. +func hasCompatDecomp(r rune) bool { + c := &chars[r] + if c.compatDecomp { + return true + } + for _, d := range c.forms[FCompatibility].decomp { + if hasCompatDecomp(d) { + return true + } + } + return false +} + +// Hangul related constants. +const ( + HangulBase = 0xAC00 + HangulEnd = 0xD7A4 // hangulBase + Jamo combinations (19 * 21 * 28) + + JamoLBase = 0x1100 + JamoLEnd = 0x1113 + JamoVBase = 0x1161 + JamoVEnd = 0x1176 + JamoTBase = 0x11A8 + JamoTEnd = 0x11C3 + + JamoLVTCount = 19 * 21 * 28 + JamoTCount = 28 +) + +func isHangul(r rune) bool { + return HangulBase <= r && r < HangulEnd +} + +func isHangulWithoutJamoT(r rune) bool { + if !isHangul(r) { + return false + } + r -= HangulBase + return r < JamoLVTCount && r%JamoTCount == 0 +} + +func ccc(r rune) uint8 { + return chars[r].ccc +} + +// Insert a rune in a buffer, ordered by Canonical Combining Class. +func insertOrdered(b Decomposition, r rune) Decomposition { + n := len(b) + b = append(b, 0) + cc := ccc(r) + if cc > 0 { + // Use bubble sort. + for ; n > 0; n-- { + if ccc(b[n-1]) <= cc { + break + } + b[n] = b[n-1] + } + } + b[n] = r + return b +} + +// Recursively decompose. +func decomposeRecursive(form int, r rune, d Decomposition) Decomposition { + dcomp := chars[r].forms[form].decomp + if len(dcomp) == 0 { + return insertOrdered(d, r) + } + for _, c := range dcomp { + d = decomposeRecursive(form, c, d) + } + return d +} + +func completeCharFields(form int) { + // Phase 0: pre-expand decomposition. + for i := range chars { + f := &chars[i].forms[form] + if len(f.decomp) == 0 { + continue + } + exp := make(Decomposition, 0) + for _, c := range f.decomp { + exp = decomposeRecursive(form, c, exp) + } + f.expandedDecomp = exp + } + + // Phase 1: composition exclusion, mark decomposition. + for i := range chars { + c := &chars[i] + f := &c.forms[form] + + // Marks script-specific exclusions and version restricted. + f.isOneWay = c.excludeInComp + + // Singletons + f.isOneWay = f.isOneWay || len(f.decomp) == 1 + + // Non-starter decompositions + if len(f.decomp) > 1 { + chk := c.ccc != 0 || chars[f.decomp[0]].ccc != 0 + f.isOneWay = f.isOneWay || chk + } + + // Runes that decompose into more than two runes. + f.isOneWay = f.isOneWay || len(f.decomp) > 2 + + if form == FCompatibility { + f.isOneWay = f.isOneWay || hasCompatDecomp(c.codePoint) + } + + for _, r := range f.decomp { + chars[r].forms[form].inDecomp = true + } + } + + // Phase 2: forward and backward combining. + for i := range chars { + c := &chars[i] + f := &c.forms[form] + + if !f.isOneWay && len(f.decomp) == 2 { + f0 := &chars[f.decomp[0]].forms[form] + f1 := &chars[f.decomp[1]].forms[form] + if !f0.isOneWay { + f0.combinesForward = true + } + if !f1.isOneWay { + f1.combinesBackward = true + } + } + if isHangulWithoutJamoT(rune(i)) { + f.combinesForward = true + } + } + + // Phase 3: quick check values. + for i := range chars { + c := &chars[i] + f := &c.forms[form] + + switch { + case len(f.decomp) > 0: + f.quickCheck[MDecomposed] = QCNo + case isHangul(rune(i)): + f.quickCheck[MDecomposed] = QCNo + default: + f.quickCheck[MDecomposed] = QCYes + } + switch { + case f.isOneWay: + f.quickCheck[MComposed] = QCNo + case (i & 0xffff00) == JamoLBase: + f.quickCheck[MComposed] = QCYes + if JamoLBase <= i && i < JamoLEnd { + f.combinesForward = true + } + if JamoVBase <= i && i < JamoVEnd { + f.quickCheck[MComposed] = QCMaybe + f.combinesBackward = true + f.combinesForward = true + } + if JamoTBase <= i && i < JamoTEnd { + f.quickCheck[MComposed] = QCMaybe + f.combinesBackward = true + } + case !f.combinesBackward: + f.quickCheck[MComposed] = QCYes + default: + f.quickCheck[MComposed] = QCMaybe + } + } +} + +func computeNonStarterCounts() { + // Phase 4: leading and trailing non-starter count + for i := range chars { + c := &chars[i] + + runes := []rune{rune(i)} + // We always use FCompatibility so that the CGJ insertion points do not + // change for repeated normalizations with different forms. + if exp := c.forms[FCompatibility].expandedDecomp; len(exp) > 0 { + runes = exp + } + // We consider runes that combine backwards to be non-starters for the + // purpose of Stream-Safe Text Processing. + for _, r := range runes { + if cr := &chars[r]; cr.ccc == 0 && !cr.forms[FCompatibility].combinesBackward { + break + } + c.nLeadingNonStarters++ + } + for i := len(runes) - 1; i >= 0; i-- { + if cr := &chars[runes[i]]; cr.ccc == 0 && !cr.forms[FCompatibility].combinesBackward { + break + } + c.nTrailingNonStarters++ + } + if c.nTrailingNonStarters > 3 { + log.Fatalf("%U: Decomposition with more than 3 (%d) trailing modifiers (%U)", i, c.nTrailingNonStarters, runes) + } + + if isHangul(rune(i)) { + c.nTrailingNonStarters = 2 + if isHangulWithoutJamoT(rune(i)) { + c.nTrailingNonStarters = 1 + } + } + + if l, t := c.nLeadingNonStarters, c.nTrailingNonStarters; l > 0 && l != t { + log.Fatalf("%U: number of leading and trailing non-starters should be equal (%d vs %d)", i, l, t) + } + if t := c.nTrailingNonStarters; t > 3 { + log.Fatalf("%U: number of trailing non-starters is %d > 3", t) + } + } +} + +func printBytes(w io.Writer, b []byte, name string) { + fmt.Fprintf(w, "// %s: %d bytes\n", name, len(b)) + fmt.Fprintf(w, "var %s = [...]byte {", name) + for i, c := range b { + switch { + case i%64 == 0: + fmt.Fprintf(w, "\n// Bytes %x - %x\n", i, i+63) + case i%8 == 0: + fmt.Fprintf(w, "\n") + } + fmt.Fprintf(w, "0x%.2X, ", c) + } + fmt.Fprint(w, "\n}\n\n") +} + +// See forminfo.go for format. +func makeEntry(f *FormInfo, c *Char) uint16 { + e := uint16(0) + if r := c.codePoint; HangulBase <= r && r < HangulEnd { + e |= 0x40 + } + if f.combinesForward { + e |= 0x20 + } + if f.quickCheck[MDecomposed] == QCNo { + e |= 0x4 + } + switch f.quickCheck[MComposed] { + case QCYes: + case QCNo: + e |= 0x10 + case QCMaybe: + e |= 0x18 + default: + log.Fatalf("Illegal quickcheck value %v.", f.quickCheck[MComposed]) + } + e |= uint16(c.nTrailingNonStarters) + return e +} + +// decompSet keeps track of unique decompositions, grouped by whether +// the decomposition is followed by a trailing and/or leading CCC. +type decompSet [7]map[string]bool + +const ( + normalDecomp = iota + firstMulti + firstCCC + endMulti + firstLeadingCCC + firstCCCZeroExcept + firstStarterWithNLead + lastDecomp +) + +var cname = []string{"firstMulti", "firstCCC", "endMulti", "firstLeadingCCC", "firstCCCZeroExcept", "firstStarterWithNLead", "lastDecomp"} + +func makeDecompSet() decompSet { + m := decompSet{} + for i := range m { + m[i] = make(map[string]bool) + } + return m +} +func (m *decompSet) insert(key int, s string) { + m[key][s] = true +} + +func printCharInfoTables(w io.Writer) int { + mkstr := func(r rune, f *FormInfo) (int, string) { + d := f.expandedDecomp + s := string([]rune(d)) + if max := 1 << 6; len(s) >= max { + const msg = "%U: too many bytes in decomposition: %d >= %d" + log.Fatalf(msg, r, len(s), max) + } + head := uint8(len(s)) + if f.quickCheck[MComposed] != QCYes { + head |= 0x40 + } + if f.combinesForward { + head |= 0x80 + } + s = string([]byte{head}) + s + + lccc := ccc(d[0]) + tccc := ccc(d[len(d)-1]) + cc := ccc(r) + if cc != 0 && lccc == 0 && tccc == 0 { + log.Fatalf("%U: trailing and leading ccc are 0 for non-zero ccc %d", r, cc) + } + if tccc < lccc && lccc != 0 { + const msg = "%U: lccc (%d) must be <= tcc (%d)" + log.Fatalf(msg, r, lccc, tccc) + } + index := normalDecomp + nTrail := chars[r].nTrailingNonStarters + nLead := chars[r].nLeadingNonStarters + if tccc > 0 || lccc > 0 || nTrail > 0 { + tccc <<= 2 + tccc |= nTrail + s += string([]byte{tccc}) + index = endMulti + for _, r := range d[1:] { + if ccc(r) == 0 { + index = firstCCC + } + } + if lccc > 0 || nLead > 0 { + s += string([]byte{lccc}) + if index == firstCCC { + log.Fatalf("%U: multi-segment decomposition not supported for decompositions with leading CCC != 0", r) + } + index = firstLeadingCCC + } + if cc != lccc { + if cc != 0 { + log.Fatalf("%U: for lccc != ccc, expected ccc to be 0; was %d", r, cc) + } + index = firstCCCZeroExcept + } + } else if len(d) > 1 { + index = firstMulti + } + return index, s + } + + decompSet := makeDecompSet() + const nLeadStr = "\x00\x01" // 0-byte length and tccc with nTrail. + decompSet.insert(firstStarterWithNLead, nLeadStr) + + // Store the uniqued decompositions in a byte buffer, + // preceded by their byte length. + for _, c := range chars { + for _, f := range c.forms { + if len(f.expandedDecomp) == 0 { + continue + } + if f.combinesBackward { + log.Fatalf("%U: combinesBackward and decompose", c.codePoint) + } + index, s := mkstr(c.codePoint, &f) + decompSet.insert(index, s) + } + } + + decompositions := bytes.NewBuffer(make([]byte, 0, 10000)) + size := 0 + positionMap := make(map[string]uint16) + decompositions.WriteString("\000") + fmt.Fprintln(w, "const (") + for i, m := range decompSet { + sa := []string{} + for s := range m { + sa = append(sa, s) + } + sort.Strings(sa) + for _, s := range sa { + p := decompositions.Len() + decompositions.WriteString(s) + positionMap[s] = uint16(p) + } + if cname[i] != "" { + fmt.Fprintf(w, "%s = 0x%X\n", cname[i], decompositions.Len()) + } + } + fmt.Fprintln(w, "maxDecomp = 0x8000") + fmt.Fprintln(w, ")") + b := decompositions.Bytes() + printBytes(w, b, "decomps") + size += len(b) + + varnames := []string{"nfc", "nfkc"} + for i := 0; i < FNumberOfFormTypes; i++ { + trie := triegen.NewTrie(varnames[i]) + + for r, c := range chars { + f := c.forms[i] + d := f.expandedDecomp + if len(d) != 0 { + _, key := mkstr(c.codePoint, &f) + trie.Insert(rune(r), uint64(positionMap[key])) + if c.ccc != ccc(d[0]) { + // We assume the lead ccc of a decomposition !=0 in this case. + if ccc(d[0]) == 0 { + log.Fatalf("Expected leading CCC to be non-zero; ccc is %d", c.ccc) + } + } + } else if c.nLeadingNonStarters > 0 && len(f.expandedDecomp) == 0 && c.ccc == 0 && !f.combinesBackward { + // Handle cases where it can't be detected that the nLead should be equal + // to nTrail. + trie.Insert(c.codePoint, uint64(positionMap[nLeadStr])) + } else if v := makeEntry(&f, &c)<<8 | uint16(c.ccc); v != 0 { + trie.Insert(c.codePoint, uint64(0x8000|v)) + } + } + sz, err := trie.Gen(w, triegen.Compact(&normCompacter{name: varnames[i]})) + if err != nil { + log.Fatal(err) + } + size += sz + } + return size +} + +func contains(sa []string, s string) bool { + for _, a := range sa { + if a == s { + return true + } + } + return false +} + +func makeTables() { + w := &bytes.Buffer{} + + size := 0 + if *tablelist == "" { + return + } + list := strings.Split(*tablelist, ",") + if *tablelist == "all" { + list = []string{"recomp", "info"} + } + + // Compute maximum decomposition size. + max := 0 + for _, c := range chars { + if n := len(string(c.forms[FCompatibility].expandedDecomp)); n > max { + max = n + } + } + fmt.Fprintln(w, `import "sync"`) + fmt.Fprintln(w) + + fmt.Fprintln(w, "const (") + fmt.Fprintln(w, "\t// Version is the Unicode edition from which the tables are derived.") + fmt.Fprintf(w, "\tVersion = %q\n", gen.UnicodeVersion()) + fmt.Fprintln(w) + fmt.Fprintln(w, "\t// MaxTransformChunkSize indicates the maximum number of bytes that Transform") + fmt.Fprintln(w, "\t// may need to write atomically for any Form. Making a destination buffer at") + fmt.Fprintln(w, "\t// least this size ensures that Transform can always make progress and that") + fmt.Fprintln(w, "\t// the user does not need to grow the buffer on an ErrShortDst.") + fmt.Fprintf(w, "\tMaxTransformChunkSize = %d+maxNonStarters*4\n", len(string(0x034F))+max) + fmt.Fprintln(w, ")\n") + + // Print the CCC remap table. + size += len(cccMap) + fmt.Fprintf(w, "var ccc = [%d]uint8{", len(cccMap)) + for i := 0; i < len(cccMap); i++ { + if i%8 == 0 { + fmt.Fprintln(w) + } + fmt.Fprintf(w, "%3d, ", cccMap[uint8(i)]) + } + fmt.Fprintln(w, "\n}\n") + + if contains(list, "info") { + size += printCharInfoTables(w) + } + + if contains(list, "recomp") { + // Note that we use 32 bit keys, instead of 64 bit. + // This clips the bits of three entries, but we know + // this won't cause a collision. The compiler will catch + // any changes made to UnicodeData.txt that introduces + // a collision. + // Note that the recomposition map for NFC and NFKC + // are identical. + + // Recomposition map + nrentries := 0 + for _, c := range chars { + f := c.forms[FCanonical] + if !f.isOneWay && len(f.decomp) > 0 { + nrentries++ + } + } + sz := nrentries * 8 + size += sz + fmt.Fprintf(w, "// recompMap: %d bytes (entries only)\n", sz) + fmt.Fprintln(w, "var recompMap map[uint32]rune") + fmt.Fprintln(w, "var recompMapOnce sync.Once\n") + fmt.Fprintln(w, `const recompMapPacked = "" +`) + var buf [8]byte + for i, c := range chars { + f := c.forms[FCanonical] + d := f.decomp + if !f.isOneWay && len(d) > 0 { + key := uint32(uint16(d[0]))<<16 + uint32(uint16(d[1])) + binary.BigEndian.PutUint32(buf[:4], key) + binary.BigEndian.PutUint32(buf[4:], uint32(i)) + fmt.Fprintf(w, "\t\t%q + // 0x%.8X: 0x%.8X\n", string(buf[:]), key, uint32(i)) + } + } + // hack so we don't have to special case the trailing plus sign + fmt.Fprintf(w, ` ""`) + fmt.Fprintln(w) + } + + fmt.Fprintf(w, "// Total size of tables: %dKB (%d bytes)\n", (size+512)/1024, size) + gen.WriteVersionedGoFile("tables.go", "norm", w.Bytes()) +} + +func printChars() { + if *verbose { + for _, c := range chars { + if !c.isValid() || c.state == SMissing { + continue + } + fmt.Println(c) + } + } +} + +// verifyComputed does various consistency tests. +func verifyComputed() { + for i, c := range chars { + for _, f := range c.forms { + isNo := (f.quickCheck[MDecomposed] == QCNo) + if (len(f.decomp) > 0) != isNo && !isHangul(rune(i)) { + log.Fatalf("%U: NF*D QC must be No if rune decomposes", i) + } + + isMaybe := f.quickCheck[MComposed] == QCMaybe + if f.combinesBackward != isMaybe { + log.Fatalf("%U: NF*C QC must be Maybe if combinesBackward", i) + } + if len(f.decomp) > 0 && f.combinesForward && isMaybe { + log.Fatalf("%U: NF*C QC must be Yes or No if combinesForward and decomposes", i) + } + + if len(f.expandedDecomp) != 0 { + continue + } + if a, b := c.nLeadingNonStarters > 0, (c.ccc > 0 || f.combinesBackward); a != b { + // We accept these runes to be treated differently (it only affects + // segment breaking in iteration, most likely on improper use), but + // reconsider if more characters are added. + // U+FF9E HALFWIDTH KATAKANA VOICED SOUND MARK;Lm;0;L; 3099;;;;N;;;;; + // U+FF9F HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK;Lm;0;L; 309A;;;;N;;;;; + // U+3133 HANGUL LETTER KIYEOK-SIOS;Lo;0;L; 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;; + // U+318E HANGUL LETTER ARAEAE;Lo;0;L; 11A1;;;;N;HANGUL LETTER ALAE AE;;;; + // U+FFA3 HALFWIDTH HANGUL LETTER KIYEOK-SIOS;Lo;0;L; 3133;;;;N;HALFWIDTH HANGUL LETTER GIYEOG SIOS;;;; + // U+FFDC HALFWIDTH HANGUL LETTER I;Lo;0;L; 3163;;;;N;;;;; + if i != 0xFF9E && i != 0xFF9F && !(0x3133 <= i && i <= 0x318E) && !(0xFFA3 <= i && i <= 0xFFDC) { + log.Fatalf("%U: nLead was %v; want %v", i, a, b) + } + } + } + nfc := c.forms[FCanonical] + nfkc := c.forms[FCompatibility] + if nfc.combinesBackward != nfkc.combinesBackward { + log.Fatalf("%U: Cannot combine combinesBackward\n", c.codePoint) + } + } +} + +// Use values in DerivedNormalizationProps.txt to compare against the +// values we computed. +// DerivedNormalizationProps.txt has form: +// 00C0..00C5 ; NFD_QC; N # ... +// 0374 ; NFD_QC; N # ... +// See https://unicode.org/reports/tr44/ for full explanation +func testDerived() { + f := gen.OpenUCDFile("DerivedNormalizationProps.txt") + defer f.Close() + p := ucd.New(f) + for p.Next() { + r := p.Rune(0) + c := &chars[r] + + var ftype, mode int + qt := p.String(1) + switch qt { + case "NFC_QC": + ftype, mode = FCanonical, MComposed + case "NFD_QC": + ftype, mode = FCanonical, MDecomposed + case "NFKC_QC": + ftype, mode = FCompatibility, MComposed + case "NFKD_QC": + ftype, mode = FCompatibility, MDecomposed + default: + continue + } + var qr QCResult + switch p.String(2) { + case "Y": + qr = QCYes + case "N": + qr = QCNo + case "M": + qr = QCMaybe + default: + log.Fatalf(`Unexpected quick check value "%s"`, p.String(2)) + } + if got := c.forms[ftype].quickCheck[mode]; got != qr { + log.Printf("%U: FAILED %s (was %v need %v)\n", r, qt, got, qr) + } + c.forms[ftype].verified[mode] = true + } + if err := p.Err(); err != nil { + log.Fatal(err) + } + // Any unspecified value must be QCYes. Verify this. + for i, c := range chars { + for j, fd := range c.forms { + for k, qr := range fd.quickCheck { + if !fd.verified[k] && qr != QCYes { + m := "%U: FAIL F:%d M:%d (was %v need Yes) %s\n" + log.Printf(m, i, j, k, qr, c.name) + } + } + } + } +} + +var testHeader = `const ( + Yes = iota + No + Maybe +) + +type formData struct { + qc uint8 + combinesForward bool + decomposition string +} + +type runeData struct { + r rune + ccc uint8 + nLead uint8 + nTrail uint8 + f [2]formData // 0: canonical; 1: compatibility +} + +func f(qc uint8, cf bool, dec string) [2]formData { + return [2]formData{{qc, cf, dec}, {qc, cf, dec}} +} + +func g(qc, qck uint8, cf, cfk bool, d, dk string) [2]formData { + return [2]formData{{qc, cf, d}, {qck, cfk, dk}} +} + +var testData = []runeData{ +` + +func printTestdata() { + type lastInfo struct { + ccc uint8 + nLead uint8 + nTrail uint8 + f string + } + + last := lastInfo{} + w := &bytes.Buffer{} + fmt.Fprintf(w, testHeader) + for r, c := range chars { + f := c.forms[FCanonical] + qc, cf, d := f.quickCheck[MComposed], f.combinesForward, string(f.expandedDecomp) + f = c.forms[FCompatibility] + qck, cfk, dk := f.quickCheck[MComposed], f.combinesForward, string(f.expandedDecomp) + s := "" + if d == dk && qc == qck && cf == cfk { + s = fmt.Sprintf("f(%s, %v, %q)", qc, cf, d) + } else { + s = fmt.Sprintf("g(%s, %s, %v, %v, %q, %q)", qc, qck, cf, cfk, d, dk) + } + current := lastInfo{c.ccc, c.nLeadingNonStarters, c.nTrailingNonStarters, s} + if last != current { + fmt.Fprintf(w, "\t{0x%x, %d, %d, %d, %s},\n", r, c.origCCC, c.nLeadingNonStarters, c.nTrailingNonStarters, s) + last = current + } + } + fmt.Fprintln(w, "}") + gen.WriteVersionedGoFile("data_test.go", "norm", w.Bytes()) +} diff --git a/vendor/golang.org/x/text/unicode/norm/triegen.go b/vendor/golang.org/x/text/unicode/norm/triegen.go new file mode 100644 index 000000000..45d711900 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/norm/triegen.go @@ -0,0 +1,117 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +// Trie table generator. +// Used by make*tables tools to generate a go file with trie data structures +// for mapping UTF-8 to a 16-bit value. All but the last byte in a UTF-8 byte +// sequence are used to lookup offsets in the index table to be used for the +// next byte. The last byte is used to index into a table with 16-bit values. + +package main + +import ( + "fmt" + "io" +) + +const maxSparseEntries = 16 + +type normCompacter struct { + sparseBlocks [][]uint64 + sparseOffset []uint16 + sparseCount int + name string +} + +func mostFrequentStride(a []uint64) int { + counts := make(map[int]int) + var v int + for _, x := range a { + if stride := int(x) - v; v != 0 && stride >= 0 { + counts[stride]++ + } + v = int(x) + } + var maxs, maxc int + for stride, cnt := range counts { + if cnt > maxc || (cnt == maxc && stride < maxs) { + maxs, maxc = stride, cnt + } + } + return maxs +} + +func countSparseEntries(a []uint64) int { + stride := mostFrequentStride(a) + var v, count int + for _, tv := range a { + if int(tv)-v != stride { + if tv != 0 { + count++ + } + } + v = int(tv) + } + return count +} + +func (c *normCompacter) Size(v []uint64) (sz int, ok bool) { + if n := countSparseEntries(v); n <= maxSparseEntries { + return (n+1)*4 + 2, true + } + return 0, false +} + +func (c *normCompacter) Store(v []uint64) uint32 { + h := uint32(len(c.sparseOffset)) + c.sparseBlocks = append(c.sparseBlocks, v) + c.sparseOffset = append(c.sparseOffset, uint16(c.sparseCount)) + c.sparseCount += countSparseEntries(v) + 1 + return h +} + +func (c *normCompacter) Handler() string { + return c.name + "Sparse.lookup" +} + +func (c *normCompacter) Print(w io.Writer) (retErr error) { + p := func(f string, x ...interface{}) { + if _, err := fmt.Fprintf(w, f, x...); retErr == nil && err != nil { + retErr = err + } + } + + ls := len(c.sparseBlocks) + p("// %sSparseOffset: %d entries, %d bytes\n", c.name, ls, ls*2) + p("var %sSparseOffset = %#v\n\n", c.name, c.sparseOffset) + + ns := c.sparseCount + p("// %sSparseValues: %d entries, %d bytes\n", c.name, ns, ns*4) + p("var %sSparseValues = [%d]valueRange {", c.name, ns) + for i, b := range c.sparseBlocks { + p("\n// Block %#x, offset %#x", i, c.sparseOffset[i]) + var v int + stride := mostFrequentStride(b) + n := countSparseEntries(b) + p("\n{value:%#04x,lo:%#02x},", stride, uint8(n)) + for i, nv := range b { + if int(nv)-v != stride { + if v != 0 { + p(",hi:%#02x},", 0x80+i-1) + } + if nv != 0 { + p("\n{value:%#04x,lo:%#02x", nv, 0x80+i) + } + } + v = int(nv) + } + if v != 0 { + p(",hi:%#02x},", 0x80+len(b)-1) + } + } + p("\n}\n\n") + return +} diff --git a/vendor/golang.org/x/text/width/gen.go b/vendor/golang.org/x/text/width/gen.go new file mode 100644 index 000000000..092277e1f --- /dev/null +++ b/vendor/golang.org/x/text/width/gen.go @@ -0,0 +1,115 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +// This program generates the trie for width operations. The generated table +// includes width category information as well as the normalization mappings. +package main + +import ( + "bytes" + "fmt" + "io" + "log" + "math" + "unicode/utf8" + + "golang.org/x/text/internal/gen" + "golang.org/x/text/internal/triegen" +) + +// See gen_common.go for flags. + +func main() { + gen.Init() + genTables() + genTests() + gen.Repackage("gen_trieval.go", "trieval.go", "width") + gen.Repackage("gen_common.go", "common_test.go", "width") +} + +func genTables() { + t := triegen.NewTrie("width") + // fold and inverse mappings. See mapComment for a description of the format + // of each entry. Add dummy value to make an index of 0 mean no mapping. + inverse := [][4]byte{{}} + mapping := map[[4]byte]int{[4]byte{}: 0} + + getWidthData(func(r rune, tag elem, alt rune) { + idx := 0 + if alt != 0 { + var buf [4]byte + buf[0] = byte(utf8.EncodeRune(buf[1:], alt)) + s := string(r) + buf[buf[0]] ^= s[len(s)-1] + var ok bool + if idx, ok = mapping[buf]; !ok { + idx = len(mapping) + if idx > math.MaxUint8 { + log.Fatalf("Index %d does not fit in a byte.", idx) + } + mapping[buf] = idx + inverse = append(inverse, buf) + } + } + t.Insert(r, uint64(tag|elem(idx))) + }) + + w := &bytes.Buffer{} + gen.WriteUnicodeVersion(w) + + sz, err := t.Gen(w) + if err != nil { + log.Fatal(err) + } + + sz += writeMappings(w, inverse) + + fmt.Fprintf(w, "// Total table size %d bytes (%dKiB)\n", sz, sz/1024) + + gen.WriteVersionedGoFile(*outputFile, "width", w.Bytes()) +} + +const inverseDataComment = ` +// inverseData contains 4-byte entries of the following format: +// <0 padding> +// The last byte of the UTF-8-encoded rune is xor-ed with the last byte of the +// UTF-8 encoding of the original rune. Mappings often have the following +// pattern: +// A -> A (U+FF21 -> U+0041) +// B -> B (U+FF22 -> U+0042) +// ... +// By xor-ing the last byte the same entry can be shared by many mappings. This +// reduces the total number of distinct entries by about two thirds. +// The resulting entry for the aforementioned mappings is +// { 0x01, 0xE0, 0x00, 0x00 } +// Using this entry to map U+FF21 (UTF-8 [EF BC A1]), we get +// E0 ^ A1 = 41. +// Similarly, for U+FF22 (UTF-8 [EF BC A2]), we get +// E0 ^ A2 = 42. +// Note that because of the xor-ing, the byte sequence stored in the entry is +// not valid UTF-8.` + +func writeMappings(w io.Writer, data [][4]byte) int { + fmt.Fprintln(w, inverseDataComment) + fmt.Fprintf(w, "var inverseData = [%d][4]byte{\n", len(data)) + for _, x := range data { + fmt.Fprintf(w, "{ 0x%02x, 0x%02x, 0x%02x, 0x%02x },\n", x[0], x[1], x[2], x[3]) + } + fmt.Fprintln(w, "}") + return len(data) * 4 +} + +func genTests() { + w := &bytes.Buffer{} + fmt.Fprintf(w, "\nvar mapRunes = map[rune]struct{r rune; e elem}{\n") + getWidthData(func(r rune, tag elem, alt rune) { + if alt != 0 { + fmt.Fprintf(w, "\t0x%X: {0x%X, 0x%X},\n", r, alt, tag) + } + }) + fmt.Fprintln(w, "}") + gen.WriteGoFile("runes_test.go", "width", w.Bytes()) +} diff --git a/vendor/golang.org/x/text/width/gen_common.go b/vendor/golang.org/x/text/width/gen_common.go new file mode 100644 index 000000000..601e75268 --- /dev/null +++ b/vendor/golang.org/x/text/width/gen_common.go @@ -0,0 +1,96 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +package main + +// This code is shared between the main code generator and the test code. + +import ( + "flag" + "log" + "strconv" + "strings" + + "golang.org/x/text/internal/gen" + "golang.org/x/text/internal/ucd" +) + +var ( + outputFile = flag.String("out", "tables.go", "output file") +) + +var typeMap = map[string]elem{ + "A": tagAmbiguous, + "N": tagNeutral, + "Na": tagNarrow, + "W": tagWide, + "F": tagFullwidth, + "H": tagHalfwidth, +} + +// getWidthData calls f for every entry for which it is defined. +// +// f may be called multiple times for the same rune. The last call to f is the +// correct value. f is not called for all runes. The default tag type is +// Neutral. +func getWidthData(f func(r rune, tag elem, alt rune)) { + // Set the default values for Unified Ideographs. In line with Annex 11, + // we encode full ranges instead of the defined runes in Unified_Ideograph. + for _, b := range []struct{ lo, hi rune }{ + {0x4E00, 0x9FFF}, // the CJK Unified Ideographs block, + {0x3400, 0x4DBF}, // the CJK Unified Ideographs Externsion A block, + {0xF900, 0xFAFF}, // the CJK Compatibility Ideographs block, + {0x20000, 0x2FFFF}, // the Supplementary Ideographic Plane, + {0x30000, 0x3FFFF}, // the Tertiary Ideographic Plane, + } { + for r := b.lo; r <= b.hi; r++ { + f(r, tagWide, 0) + } + } + + inverse := map[rune]rune{} + maps := map[string]bool{ + "": true, + "": true, + } + + // We cannot reuse package norm's decomposition, as we need an unexpanded + // decomposition. We make use of the opportunity to verify that the + // decomposition type is as expected. + ucd.Parse(gen.OpenUCDFile("UnicodeData.txt"), func(p *ucd.Parser) { + r := p.Rune(0) + s := strings.SplitN(p.String(ucd.DecompMapping), " ", 2) + if !maps[s[0]] { + return + } + x, err := strconv.ParseUint(s[1], 16, 32) + if err != nil { + log.Fatalf("Error parsing rune %q", s[1]) + } + if inverse[r] != 0 || inverse[rune(x)] != 0 { + log.Fatalf("Circular dependency in mapping between %U and %U", r, x) + } + inverse[r] = rune(x) + inverse[rune(x)] = r + }) + + // ; + ucd.Parse(gen.OpenUCDFile("EastAsianWidth.txt"), func(p *ucd.Parser) { + tag, ok := typeMap[p.String(1)] + if !ok { + log.Fatalf("Unknown width type %q", p.String(1)) + } + r := p.Rune(0) + alt, ok := inverse[r] + if tag == tagFullwidth || tag == tagHalfwidth && r != wonSign { + tag |= tagNeedsFold + if !ok { + log.Fatalf("Narrow or wide rune %U has no decomposition", r) + } + } + f(r, tag, alt) + }) +} diff --git a/vendor/golang.org/x/text/width/gen_trieval.go b/vendor/golang.org/x/text/width/gen_trieval.go new file mode 100644 index 000000000..c17334aa6 --- /dev/null +++ b/vendor/golang.org/x/text/width/gen_trieval.go @@ -0,0 +1,34 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +package main + +// elem is an entry of the width trie. The high byte is used to encode the type +// of the rune. The low byte is used to store the index to a mapping entry in +// the inverseData array. +type elem uint16 + +const ( + tagNeutral elem = iota << typeShift + tagAmbiguous + tagWide + tagNarrow + tagFullwidth + tagHalfwidth +) + +const ( + numTypeBits = 3 + typeShift = 16 - numTypeBits + + // tagNeedsFold is true for all fullwidth and halfwidth runes except for + // the Won sign U+20A9. + tagNeedsFold = 0x1000 + + // The Korean Won sign is halfwidth, but SHOULD NOT be mapped to a wide + // variant. + wonSign rune = 0x20A9 +) diff --git a/vendor/modules.txt b/vendor/modules.txt index 32b4f5338..dfdb40f34 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -21,63 +21,63 @@ github.com/PuerkitoBio/purell # github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 github.com/PuerkitoBio/urlesc # github.com/appscode/go v0.0.0-20191119085241-0887d8ec2ecc -github.com/appscode/go/analytics -github.com/appscode/go/context -github.com/appscode/go/crypto/rand +github.com/appscode/go/log +github.com/appscode/go/version github.com/appscode/go/encoding/json/types -github.com/appscode/go/encoding/yaml +github.com/appscode/go/runtime github.com/appscode/go/flags -github.com/appscode/go/homedir -github.com/appscode/go/log github.com/appscode/go/log/golog -github.com/appscode/go/net -github.com/appscode/go/runtime -github.com/appscode/go/sets -github.com/appscode/go/strings github.com/appscode/go/types -github.com/appscode/go/version +github.com/appscode/go/strings +github.com/appscode/go/crypto/rand +github.com/appscode/go/sets +github.com/appscode/go/context +github.com/appscode/go/analytics +github.com/appscode/go/net +github.com/appscode/go/encoding/yaml +github.com/appscode/go/homedir # github.com/appscode/osm v0.13.0 github.com/appscode/osm/context # github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e github.com/armon/circbuf # github.com/aws/aws-sdk-go v1.20.20 github.com/aws/aws-sdk-go/aws +github.com/aws/aws-sdk-go/aws/credentials +github.com/aws/aws-sdk-go/aws/credentials/stscreds +github.com/aws/aws-sdk-go/aws/ec2metadata +github.com/aws/aws-sdk-go/aws/session +github.com/aws/aws-sdk-go/service/s3 github.com/aws/aws-sdk-go/aws/awserr -github.com/aws/aws-sdk-go/aws/awsutil +github.com/aws/aws-sdk-go/aws/endpoints +github.com/aws/aws-sdk-go/internal/sdkio +github.com/aws/aws-sdk-go/internal/ini +github.com/aws/aws-sdk-go/internal/shareddefaults github.com/aws/aws-sdk-go/aws/client +github.com/aws/aws-sdk-go/internal/sdkrand +github.com/aws/aws-sdk-go/service/sts github.com/aws/aws-sdk-go/aws/client/metadata github.com/aws/aws-sdk-go/aws/corehandlers -github.com/aws/aws-sdk-go/aws/credentials -github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds -github.com/aws/aws-sdk-go/aws/credentials/endpointcreds +github.com/aws/aws-sdk-go/aws/request +github.com/aws/aws-sdk-go/internal/sdkuri github.com/aws/aws-sdk-go/aws/credentials/processcreds -github.com/aws/aws-sdk-go/aws/credentials/stscreds github.com/aws/aws-sdk-go/aws/csm github.com/aws/aws-sdk-go/aws/defaults -github.com/aws/aws-sdk-go/aws/ec2metadata -github.com/aws/aws-sdk-go/aws/endpoints -github.com/aws/aws-sdk-go/aws/request -github.com/aws/aws-sdk-go/aws/session +github.com/aws/aws-sdk-go/aws/awsutil github.com/aws/aws-sdk-go/aws/signer/v4 -github.com/aws/aws-sdk-go/internal/ini github.com/aws/aws-sdk-go/internal/s3err -github.com/aws/aws-sdk-go/internal/sdkio -github.com/aws/aws-sdk-go/internal/sdkrand -github.com/aws/aws-sdk-go/internal/sdkuri -github.com/aws/aws-sdk-go/internal/shareddefaults github.com/aws/aws-sdk-go/private/protocol github.com/aws/aws-sdk-go/private/protocol/eventstream github.com/aws/aws-sdk-go/private/protocol/eventstream/eventstreamapi -github.com/aws/aws-sdk-go/private/protocol/json/jsonutil -github.com/aws/aws-sdk-go/private/protocol/query -github.com/aws/aws-sdk-go/private/protocol/query/queryutil github.com/aws/aws-sdk-go/private/protocol/rest github.com/aws/aws-sdk-go/private/protocol/restxml github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil -github.com/aws/aws-sdk-go/service/s3 -github.com/aws/aws-sdk-go/service/s3/s3iface github.com/aws/aws-sdk-go/service/s3/s3manager -github.com/aws/aws-sdk-go/service/sts +github.com/aws/aws-sdk-go/private/protocol/query +github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds +github.com/aws/aws-sdk-go/aws/credentials/endpointcreds +github.com/aws/aws-sdk-go/service/s3/s3iface +github.com/aws/aws-sdk-go/private/protocol/query/queryutil +github.com/aws/aws-sdk-go/private/protocol/json/jsonutil # github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 github.com/beorn7/perks/quantile # github.com/blang/semver v3.5.1+incompatible @@ -89,21 +89,21 @@ github.com/codegangsta/inject # github.com/codeskyblue/go-sh v0.0.0-20190412065543-76bd3d59ff27 github.com/codeskyblue/go-sh # github.com/coreos/etcd v3.3.17+incompatible -github.com/coreos/etcd/auth/authpb github.com/coreos/etcd/clientv3 +github.com/coreos/etcd/pkg/transport +github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes +github.com/coreos/etcd/mvcc/mvccpb +github.com/coreos/etcd/auth/authpb github.com/coreos/etcd/clientv3/balancer -github.com/coreos/etcd/clientv3/balancer/connectivity github.com/coreos/etcd/clientv3/balancer/picker github.com/coreos/etcd/clientv3/balancer/resolver/endpoint github.com/coreos/etcd/clientv3/credentials -github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes github.com/coreos/etcd/etcdserver/etcdserverpb -github.com/coreos/etcd/mvcc/mvccpb github.com/coreos/etcd/pkg/logutil -github.com/coreos/etcd/pkg/systemd -github.com/coreos/etcd/pkg/tlsutil -github.com/coreos/etcd/pkg/transport github.com/coreos/etcd/pkg/types +github.com/coreos/etcd/pkg/tlsutil +github.com/coreos/etcd/clientv3/balancer/connectivity +github.com/coreos/etcd/pkg/systemd github.com/coreos/etcd/raft github.com/coreos/etcd/raft/raftpb # github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7 @@ -118,8 +118,8 @@ github.com/davecgh/go-spew/spew # github.com/dgrijalva/jwt-go v3.2.0+incompatible github.com/dgrijalva/jwt-go # github.com/docker/distribution v2.7.1+incompatible -github.com/docker/distribution/digestset github.com/docker/distribution/reference +github.com/docker/distribution/digestset # github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96 github.com/docker/spdystream github.com/docker/spdystream/spdy @@ -132,8 +132,8 @@ github.com/evanphx/json-patch github.com/fatih/structs # github.com/gabriel-vasile/mimetype v0.3.22 github.com/gabriel-vasile/mimetype -github.com/gabriel-vasile/mimetype/internal/json github.com/gabriel-vasile/mimetype/internal/matchers +github.com/gabriel-vasile/mimetype/internal/json # github.com/ghodss/yaml v1.0.0 github.com/ghodss/yaml # github.com/go-openapi/jsonpointer v0.19.3 @@ -147,10 +147,10 @@ github.com/go-openapi/swag # github.com/go-sql-driver/mysql v1.4.1 github.com/go-sql-driver/mysql # github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48 -github.com/gogo/protobuf/gogoproto github.com/gogo/protobuf/proto -github.com/gogo/protobuf/protoc-gen-gogo/descriptor github.com/gogo/protobuf/sortkeys +github.com/gogo/protobuf/gogoproto +github.com/gogo/protobuf/protoc-gen-gogo/descriptor # github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b github.com/golang/glog # github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef @@ -158,12 +158,12 @@ github.com/golang/groupcache/lru # github.com/golang/protobuf v1.3.2 github.com/golang/protobuf/jsonpb github.com/golang/protobuf/proto -github.com/golang/protobuf/protoc-gen-go/descriptor -github.com/golang/protobuf/ptypes +github.com/golang/protobuf/ptypes/struct github.com/golang/protobuf/ptypes/any +github.com/golang/protobuf/ptypes github.com/golang/protobuf/ptypes/duration -github.com/golang/protobuf/ptypes/struct github.com/golang/protobuf/ptypes/timestamp +github.com/golang/protobuf/protoc-gen-go/descriptor # github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c github.com/google/btree # github.com/google/go-cmp v0.3.1 @@ -183,10 +183,10 @@ github.com/googleapis/gnostic/extensions # github.com/gophercloud/gophercloud v0.1.0 github.com/gophercloud/gophercloud github.com/gophercloud/gophercloud/openstack -github.com/gophercloud/gophercloud/openstack/identity/v2/tenants github.com/gophercloud/gophercloud/openstack/identity/v2/tokens github.com/gophercloud/gophercloud/openstack/identity/v3/tokens github.com/gophercloud/gophercloud/openstack/utils +github.com/gophercloud/gophercloud/openstack/identity/v2/tenants github.com/gophercloud/gophercloud/pagination # github.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7 github.com/gregjones/httpcache @@ -215,14 +215,14 @@ github.com/json-iterator/go # github.com/kubernetes-csi/external-snapshotter v1.2.1-0.20191220025132-bbbadbc41e30 github.com/kubernetes-csi/external-snapshotter/pkg/apis/volumesnapshot/v1beta1 github.com/kubernetes-csi/external-snapshotter/pkg/client/clientset/versioned +github.com/kubernetes-csi/external-snapshotter/pkg/client/clientset/versioned/typed/volumesnapshot/v1beta1 github.com/kubernetes-csi/external-snapshotter/pkg/client/clientset/versioned/fake github.com/kubernetes-csi/external-snapshotter/pkg/client/clientset/versioned/scheme -github.com/kubernetes-csi/external-snapshotter/pkg/client/clientset/versioned/typed/volumesnapshot/v1beta1 github.com/kubernetes-csi/external-snapshotter/pkg/client/clientset/versioned/typed/volumesnapshot/v1beta1/fake # github.com/mailru/easyjson v0.7.0 -github.com/mailru/easyjson/buffer github.com/mailru/easyjson/jlexer github.com/mailru/easyjson/jwriter +github.com/mailru/easyjson/buffer # github.com/matttproud/golang_protobuf_extensions v1.0.1 github.com/matttproud/golang_protobuf_extensions/pbutil # github.com/mitchellh/mapstructure v1.1.2 @@ -237,36 +237,36 @@ github.com/munnerz/goautoneg github.com/ncw/swift # github.com/onsi/ginkgo v1.8.0 github.com/onsi/ginkgo +github.com/onsi/ginkgo/reporters github.com/onsi/ginkgo/config github.com/onsi/ginkgo/internal/codelocation -github.com/onsi/ginkgo/internal/containernode github.com/onsi/ginkgo/internal/failer -github.com/onsi/ginkgo/internal/leafnodes github.com/onsi/ginkgo/internal/remote -github.com/onsi/ginkgo/internal/spec -github.com/onsi/ginkgo/internal/spec_iterator -github.com/onsi/ginkgo/internal/specrunner github.com/onsi/ginkgo/internal/suite github.com/onsi/ginkgo/internal/testingtproxy github.com/onsi/ginkgo/internal/writer -github.com/onsi/ginkgo/reporters github.com/onsi/ginkgo/reporters/stenographer github.com/onsi/ginkgo/reporters/stenographer/support/go-colorable -github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty github.com/onsi/ginkgo/types +github.com/onsi/ginkgo/internal/spec_iterator +github.com/onsi/ginkgo/internal/containernode +github.com/onsi/ginkgo/internal/leafnodes +github.com/onsi/ginkgo/internal/spec +github.com/onsi/ginkgo/internal/specrunner +github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty # github.com/onsi/gomega v1.5.0 github.com/onsi/gomega -github.com/onsi/gomega/format +github.com/onsi/gomega/types github.com/onsi/gomega/internal/assertion github.com/onsi/gomega/internal/asyncassertion -github.com/onsi/gomega/internal/oraclematcher github.com/onsi/gomega/internal/testingtsupport github.com/onsi/gomega/matchers +github.com/onsi/gomega/internal/oraclematcher +github.com/onsi/gomega/format github.com/onsi/gomega/matchers/support/goraph/bipartitegraph github.com/onsi/gomega/matchers/support/goraph/edge github.com/onsi/gomega/matchers/support/goraph/node github.com/onsi/gomega/matchers/support/goraph/util -github.com/onsi/gomega/types # github.com/opencontainers/go-digest v1.0.0-rc1 github.com/opencontainers/go-digest # github.com/pborman/uuid v1.2.0 @@ -279,20 +279,20 @@ github.com/pkg/errors github.com/pmezard/go-difflib/difflib # github.com/prometheus/client_golang v1.1.0 => github.com/prometheus/client_golang v0.9.2 github.com/prometheus/client_golang/prometheus +github.com/prometheus/client_golang/prometheus/push github.com/prometheus/client_golang/prometheus/internal github.com/prometheus/client_golang/prometheus/promhttp -github.com/prometheus/client_golang/prometheus/push # github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910 github.com/prometheus/client_model/go # github.com/prometheus/common v0.0.0-20181126121408-4724e9255275 github.com/prometheus/common/expfmt -github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg github.com/prometheus/common/model +github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg # github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a github.com/prometheus/procfs -github.com/prometheus/procfs/internal/util github.com/prometheus/procfs/nfs github.com/prometheus/procfs/xfs +github.com/prometheus/procfs/internal/util # github.com/robfig/cron/v3 v3.0.0 github.com/robfig/cron/v3 # github.com/russross/blackfriday v1.5.2 @@ -305,8 +305,8 @@ github.com/sergi/go-diff/diffmatchpatch github.com/spf13/afero github.com/spf13/afero/mem # github.com/spf13/cobra v0.0.5 -github.com/spf13/cobra github.com/spf13/cobra/doc +github.com/spf13/cobra # github.com/spf13/pflag v1.0.5 github.com/spf13/pflag # github.com/stretchr/testify v1.4.0 @@ -317,54 +317,54 @@ github.com/yudai/gojsondiff/formatter # github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 github.com/yudai/golcs # go.opencensus.io v0.21.0 -go.opencensus.io -go.opencensus.io/internal -go.opencensus.io/internal/tagencoding -go.opencensus.io/metric/metricdata -go.opencensus.io/metric/metricproducer go.opencensus.io/plugin/ochttp go.opencensus.io/plugin/ochttp/propagation/b3 -go.opencensus.io/resource go.opencensus.io/stats -go.opencensus.io/stats/internal go.opencensus.io/stats/view go.opencensus.io/tag go.opencensus.io/trace -go.opencensus.io/trace/internal go.opencensus.io/trace/propagation +go.opencensus.io/metric/metricdata +go.opencensus.io/stats/internal +go.opencensus.io/internal/tagencoding +go.opencensus.io/metric/metricproducer +go.opencensus.io/internal +go.opencensus.io/trace/internal go.opencensus.io/trace/tracestate +go.opencensus.io/resource +go.opencensus.io # go.uber.org/atomic v0.0.0-20181018215023-8dc6146f7569 go.uber.org/atomic # go.uber.org/multierr v0.0.0-20180122172545-ddea229ff1df go.uber.org/multierr # go.uber.org/zap v0.0.0-20180814183419-67bc79d13d15 go.uber.org/zap -go.uber.org/zap/buffer +go.uber.org/zap/zapcore go.uber.org/zap/internal/bufferpool +go.uber.org/zap/buffer go.uber.org/zap/internal/color go.uber.org/zap/internal/exit -go.uber.org/zap/zapcore # golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 +golang.org/x/crypto/ssh/terminal golang.org/x/crypto/cryptobyte +golang.org/x/crypto/nacl/secretbox golang.org/x/crypto/cryptobyte/asn1 golang.org/x/crypto/internal/subtle -golang.org/x/crypto/nacl/secretbox golang.org/x/crypto/poly1305 golang.org/x/crypto/salsa20/salsa -golang.org/x/crypto/ssh/terminal # golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 -golang.org/x/net/context -golang.org/x/net/context/ctxhttp -golang.org/x/net/html -golang.org/x/net/html/atom -golang.org/x/net/html/charset -golang.org/x/net/http/httpguts golang.org/x/net/http2 +golang.org/x/net/http/httpguts golang.org/x/net/http2/hpack golang.org/x/net/idna -golang.org/x/net/internal/timeseries -golang.org/x/net/trace +golang.org/x/net/context +golang.org/x/net/html/charset golang.org/x/net/websocket +golang.org/x/net/trace +golang.org/x/net/html +golang.org/x/net/context/ctxhttp +golang.org/x/net/internal/timeseries +golang.org/x/net/html/atom # golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 golang.org/x/oauth2 golang.org/x/oauth2/google @@ -372,31 +372,31 @@ golang.org/x/oauth2/internal golang.org/x/oauth2/jws golang.org/x/oauth2/jwt # golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3 -golang.org/x/sys/cpu golang.org/x/sys/unix golang.org/x/sys/windows +golang.org/x/sys/cpu # golang.org/x/text v0.3.2 +golang.org/x/text/transform +golang.org/x/text/unicode/norm +golang.org/x/text/width +golang.org/x/text/secure/bidirule +golang.org/x/text/unicode/bidi +golang.org/x/text/encoding/unicode golang.org/x/text/encoding golang.org/x/text/encoding/charmap golang.org/x/text/encoding/htmlindex golang.org/x/text/encoding/internal golang.org/x/text/encoding/internal/identifier +golang.org/x/text/internal/utf8internal +golang.org/x/text/runes golang.org/x/text/encoding/japanese golang.org/x/text/encoding/korean golang.org/x/text/encoding/simplifiedchinese golang.org/x/text/encoding/traditionalchinese -golang.org/x/text/encoding/unicode +golang.org/x/text/language golang.org/x/text/internal/language golang.org/x/text/internal/language/compact golang.org/x/text/internal/tag -golang.org/x/text/internal/utf8internal -golang.org/x/text/language -golang.org/x/text/runes -golang.org/x/text/secure/bidirule -golang.org/x/text/transform -golang.org/x/text/unicode/bidi -golang.org/x/text/unicode/norm -golang.org/x/text/width # golang.org/x/time v0.0.0-20181108054448-85acf8d2951c golang.org/x/time/rate # gomodules.xyz/cert v1.0.2 @@ -418,43 +418,43 @@ gomodules.xyz/stow/swift # gomodules.xyz/version v0.1.0 gomodules.xyz/version # google.golang.org/api v0.6.1-0.20190607001116-5213b8090861 => google.golang.org/api v0.6.1-0.20190607001116-5213b8090861 +google.golang.org/api/storage/v1 google.golang.org/api/gensupport google.golang.org/api/googleapi -google.golang.org/api/googleapi/internal/uritemplates -google.golang.org/api/googleapi/transport -google.golang.org/api/internal google.golang.org/api/option -google.golang.org/api/storage/v1 google.golang.org/api/transport/http +google.golang.org/api/googleapi/internal/uritemplates +google.golang.org/api/internal +google.golang.org/api/googleapi/transport google.golang.org/api/transport/http/internal/propagation # google.golang.org/appengine v1.5.0 -google.golang.org/appengine google.golang.org/appengine/cloudsql +google.golang.org/appengine +google.golang.org/appengine/urlfetch google.golang.org/appengine/internal google.golang.org/appengine/internal/app_identity +google.golang.org/appengine/internal/modules +google.golang.org/appengine/internal/urlfetch google.golang.org/appengine/internal/base google.golang.org/appengine/internal/datastore google.golang.org/appengine/internal/log -google.golang.org/appengine/internal/modules google.golang.org/appengine/internal/remote_api -google.golang.org/appengine/internal/urlfetch -google.golang.org/appengine/urlfetch # google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873 -google.golang.org/genproto/googleapis/api/annotations google.golang.org/genproto/googleapis/rpc/status +google.golang.org/genproto/googleapis/api/annotations # google.golang.org/grpc v1.23.0 google.golang.org/grpc +google.golang.org/grpc/status +google.golang.org/grpc/codes +google.golang.org/grpc/credentials +google.golang.org/grpc/grpclog +google.golang.org/grpc/keepalive +google.golang.org/grpc/metadata google.golang.org/grpc/balancer -google.golang.org/grpc/balancer/base google.golang.org/grpc/balancer/roundrobin -google.golang.org/grpc/binarylog/grpc_binarylog_v1 -google.golang.org/grpc/codes google.golang.org/grpc/connectivity -google.golang.org/grpc/credentials -google.golang.org/grpc/credentials/internal google.golang.org/grpc/encoding google.golang.org/grpc/encoding/proto -google.golang.org/grpc/grpclog google.golang.org/grpc/internal google.golang.org/grpc/internal/backoff google.golang.org/grpc/internal/balancerload @@ -463,10 +463,7 @@ google.golang.org/grpc/internal/channelz google.golang.org/grpc/internal/envconfig google.golang.org/grpc/internal/grpcrand google.golang.org/grpc/internal/grpcsync -google.golang.org/grpc/internal/syscall google.golang.org/grpc/internal/transport -google.golang.org/grpc/keepalive -google.golang.org/grpc/metadata google.golang.org/grpc/naming google.golang.org/grpc/peer google.golang.org/grpc/resolver @@ -474,8 +471,11 @@ google.golang.org/grpc/resolver/dns google.golang.org/grpc/resolver/passthrough google.golang.org/grpc/serviceconfig google.golang.org/grpc/stats -google.golang.org/grpc/status google.golang.org/grpc/tap +google.golang.org/grpc/credentials/internal +google.golang.org/grpc/balancer/base +google.golang.org/grpc/binarylog/grpc_binarylog_v1 +google.golang.org/grpc/internal/syscall # gopkg.in/fsnotify.v1 v1.4.7 gopkg.in/fsnotify.v1 # gopkg.in/inf.v0 v0.9.0 @@ -489,13 +489,19 @@ gopkg.in/tomb.v1 # gopkg.in/yaml.v2 v2.2.4 gopkg.in/yaml.v2 # k8s.io/api v0.0.0-20191122220107-b5267f2975e0 => k8s.io/api v0.0.0-20191114100352-16d7abae0d2a -k8s.io/api/admission/v1 -k8s.io/api/admission/v1beta1 -k8s.io/api/admissionregistration/v1 -k8s.io/api/admissionregistration/v1beta1 +k8s.io/api/core/v1 +k8s.io/api/batch/v1 +k8s.io/api/rbac/v1 k8s.io/api/apps/v1 +k8s.io/api/storage/v1 +k8s.io/api/admission/v1beta1 k8s.io/api/apps/v1beta1 k8s.io/api/apps/v1beta2 +k8s.io/api/batch/v1beta1 +k8s.io/api/extensions/v1beta1 +k8s.io/api/policy/v1beta1 +k8s.io/api/admissionregistration/v1 +k8s.io/api/admissionregistration/v1beta1 k8s.io/api/auditregistration/v1alpha1 k8s.io/api/authentication/v1 k8s.io/api/authentication/v1beta1 @@ -504,281 +510,238 @@ k8s.io/api/authorization/v1beta1 k8s.io/api/autoscaling/v1 k8s.io/api/autoscaling/v2beta1 k8s.io/api/autoscaling/v2beta2 -k8s.io/api/batch/v1 -k8s.io/api/batch/v1beta1 k8s.io/api/batch/v2alpha1 k8s.io/api/certificates/v1beta1 k8s.io/api/coordination/v1 k8s.io/api/coordination/v1beta1 -k8s.io/api/core/v1 k8s.io/api/discovery/v1alpha1 k8s.io/api/events/v1beta1 -k8s.io/api/extensions/v1beta1 k8s.io/api/networking/v1 k8s.io/api/networking/v1beta1 k8s.io/api/node/v1alpha1 k8s.io/api/node/v1beta1 -k8s.io/api/policy/v1beta1 -k8s.io/api/rbac/v1 k8s.io/api/rbac/v1alpha1 k8s.io/api/rbac/v1beta1 k8s.io/api/scheduling/v1 k8s.io/api/scheduling/v1alpha1 k8s.io/api/scheduling/v1beta1 k8s.io/api/settings/v1alpha1 -k8s.io/api/storage/v1 k8s.io/api/storage/v1alpha1 k8s.io/api/storage/v1beta1 +k8s.io/api/admission/v1 # k8s.io/apiextensions-apiserver v0.0.0-20191114105449-027877536833 => k8s.io/apiextensions-apiserver v0.0.0-20191114105449-027877536833 +k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1 +k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1 k8s.io/apiextensions-apiserver/pkg/apis/apiextensions +k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1 -k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1 k8s.io/apiextensions-apiserver/pkg/apiserver/schema k8s.io/apiextensions-apiserver/pkg/apiserver/schema/pruning -k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme -k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1 k8s.io/apiextensions-apiserver/pkg/features # k8s.io/apimachinery v0.16.5-beta.1 => github.com/kmodules/apimachinery v0.0.0-20191119091232-0553326db082 -k8s.io/apimachinery/pkg/api/apitesting -k8s.io/apimachinery/pkg/api/apitesting/fuzzer -k8s.io/apimachinery/pkg/api/apitesting/roundtrip -k8s.io/apimachinery/pkg/api/equality -k8s.io/apimachinery/pkg/api/errors -k8s.io/apimachinery/pkg/api/meta -k8s.io/apimachinery/pkg/api/resource -k8s.io/apimachinery/pkg/api/validation -k8s.io/apimachinery/pkg/api/validation/path -k8s.io/apimachinery/pkg/apis/meta/fuzzer -k8s.io/apimachinery/pkg/apis/meta/internalversion +k8s.io/apimachinery/pkg/runtime/schema k8s.io/apimachinery/pkg/apis/meta/v1 -k8s.io/apimachinery/pkg/apis/meta/v1/unstructured -k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructuredscheme -k8s.io/apimachinery/pkg/apis/meta/v1/validation -k8s.io/apimachinery/pkg/apis/meta/v1beta1 -k8s.io/apimachinery/pkg/apis/meta/v1beta1/validation -k8s.io/apimachinery/pkg/conversion -k8s.io/apimachinery/pkg/conversion/queryparams -k8s.io/apimachinery/pkg/fields -k8s.io/apimachinery/pkg/labels k8s.io/apimachinery/pkg/runtime -k8s.io/apimachinery/pkg/runtime/schema +k8s.io/apimachinery/pkg/util/runtime +k8s.io/apimachinery/pkg/api/resource +k8s.io/apimachinery/pkg/conversion +k8s.io/apimachinery/pkg/util/intstr k8s.io/apimachinery/pkg/runtime/serializer -k8s.io/apimachinery/pkg/runtime/serializer/json -k8s.io/apimachinery/pkg/runtime/serializer/protobuf -k8s.io/apimachinery/pkg/runtime/serializer/recognizer -k8s.io/apimachinery/pkg/runtime/serializer/streaming -k8s.io/apimachinery/pkg/runtime/serializer/versioning -k8s.io/apimachinery/pkg/selection +k8s.io/apimachinery/pkg/watch +k8s.io/apimachinery/pkg/labels k8s.io/apimachinery/pkg/types -k8s.io/apimachinery/pkg/util/cache -k8s.io/apimachinery/pkg/util/clock -k8s.io/apimachinery/pkg/util/diff +k8s.io/apimachinery/pkg/api/errors +k8s.io/apimachinery/pkg/util/wait k8s.io/apimachinery/pkg/util/errors -k8s.io/apimachinery/pkg/util/framer -k8s.io/apimachinery/pkg/util/httpstream -k8s.io/apimachinery/pkg/util/httpstream/spdy -k8s.io/apimachinery/pkg/util/intstr +k8s.io/apimachinery/pkg/apis/meta/v1/unstructured +k8s.io/apimachinery/pkg/apis/meta/internalversion +k8s.io/apimachinery/pkg/version +k8s.io/apimachinery/pkg/fields k8s.io/apimachinery/pkg/util/json -k8s.io/apimachinery/pkg/util/jsonmergepatch +k8s.io/apimachinery/pkg/selection +k8s.io/apimachinery/pkg/api/meta +k8s.io/apimachinery/pkg/util/strategicpatch +k8s.io/apimachinery/pkg/runtime/serializer/versioning k8s.io/apimachinery/pkg/util/mergepatch -k8s.io/apimachinery/pkg/util/naming -k8s.io/apimachinery/pkg/util/net -k8s.io/apimachinery/pkg/util/rand -k8s.io/apimachinery/pkg/util/remotecommand -k8s.io/apimachinery/pkg/util/runtime k8s.io/apimachinery/pkg/util/sets -k8s.io/apimachinery/pkg/util/strategicpatch -k8s.io/apimachinery/pkg/util/uuid k8s.io/apimachinery/pkg/util/validation +k8s.io/apimachinery/pkg/conversion/queryparams +k8s.io/apimachinery/pkg/util/naming +k8s.io/apimachinery/pkg/api/apitesting/roundtrip +k8s.io/apimachinery/third_party/forked/golang/reflect +k8s.io/apimachinery/pkg/runtime/serializer/json +k8s.io/apimachinery/pkg/runtime/serializer/protobuf +k8s.io/apimachinery/pkg/runtime/serializer/recognizer +k8s.io/apimachinery/pkg/runtime/serializer/streaming +k8s.io/apimachinery/pkg/util/net +k8s.io/apimachinery/pkg/util/clock k8s.io/apimachinery/pkg/util/validation/field -k8s.io/apimachinery/pkg/util/wait +k8s.io/apimachinery/pkg/util/cache +k8s.io/apimachinery/pkg/util/diff k8s.io/apimachinery/pkg/util/waitgroup +k8s.io/apimachinery/pkg/apis/meta/v1beta1 +k8s.io/apimachinery/pkg/api/validation/path +k8s.io/apimachinery/pkg/api/validation +k8s.io/apimachinery/pkg/apis/meta/v1/validation +k8s.io/apimachinery/pkg/util/uuid +k8s.io/apimachinery/pkg/util/httpstream +k8s.io/apimachinery/pkg/util/remotecommand +k8s.io/apimachinery/pkg/util/jsonmergepatch k8s.io/apimachinery/pkg/util/yaml -k8s.io/apimachinery/pkg/version -k8s.io/apimachinery/pkg/watch k8s.io/apimachinery/third_party/forked/golang/json +k8s.io/apimachinery/pkg/api/apitesting +k8s.io/apimachinery/pkg/api/apitesting/fuzzer +k8s.io/apimachinery/pkg/api/equality +k8s.io/apimachinery/pkg/apis/meta/fuzzer +k8s.io/apimachinery/pkg/util/framer +k8s.io/apimachinery/pkg/util/rand +k8s.io/apimachinery/pkg/util/httpstream/spdy +k8s.io/apimachinery/pkg/apis/meta/v1beta1/validation +k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructuredscheme k8s.io/apimachinery/third_party/forked/golang/netutil -k8s.io/apimachinery/third_party/forked/golang/reflect # k8s.io/apiserver v0.0.0-20191114103151-9ca1dc586682 => github.com/kmodules/apiserver v0.0.0-20191119111000-36ac3646ae82 +k8s.io/apiserver/pkg/server +k8s.io/apiserver/pkg/endpoints/openapi +k8s.io/apiserver/pkg/server/options +k8s.io/apiserver/pkg/endpoints/request +k8s.io/apiserver/pkg/registry/rest k8s.io/apiserver/pkg/admission -k8s.io/apiserver/pkg/admission/configuration -k8s.io/apiserver/pkg/admission/initializer -k8s.io/apiserver/pkg/admission/metrics k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle -k8s.io/apiserver/pkg/admission/plugin/webhook -k8s.io/apiserver/pkg/admission/plugin/webhook/config -k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission -k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1 -k8s.io/apiserver/pkg/admission/plugin/webhook/errors -k8s.io/apiserver/pkg/admission/plugin/webhook/generic k8s.io/apiserver/pkg/admission/plugin/webhook/mutating -k8s.io/apiserver/pkg/admission/plugin/webhook/namespace -k8s.io/apiserver/pkg/admission/plugin/webhook/object -k8s.io/apiserver/pkg/admission/plugin/webhook/request -k8s.io/apiserver/pkg/admission/plugin/webhook/rules k8s.io/apiserver/pkg/admission/plugin/webhook/validating -k8s.io/apiserver/pkg/apis/apiserver k8s.io/apiserver/pkg/apis/apiserver/install -k8s.io/apiserver/pkg/apis/apiserver/v1alpha1 -k8s.io/apiserver/pkg/apis/audit -k8s.io/apiserver/pkg/apis/audit/install -k8s.io/apiserver/pkg/apis/audit/v1 -k8s.io/apiserver/pkg/apis/audit/v1alpha1 -k8s.io/apiserver/pkg/apis/audit/v1beta1 -k8s.io/apiserver/pkg/apis/audit/validation -k8s.io/apiserver/pkg/apis/config -k8s.io/apiserver/pkg/apis/config/v1 k8s.io/apiserver/pkg/audit -k8s.io/apiserver/pkg/audit/event k8s.io/apiserver/pkg/audit/policy -k8s.io/apiserver/pkg/audit/util k8s.io/apiserver/pkg/authentication/authenticator k8s.io/apiserver/pkg/authentication/authenticatorfactory -k8s.io/apiserver/pkg/authentication/group -k8s.io/apiserver/pkg/authentication/request/anonymous -k8s.io/apiserver/pkg/authentication/request/bearertoken -k8s.io/apiserver/pkg/authentication/request/headerrequest k8s.io/apiserver/pkg/authentication/request/union -k8s.io/apiserver/pkg/authentication/request/websocket -k8s.io/apiserver/pkg/authentication/request/x509 -k8s.io/apiserver/pkg/authentication/serviceaccount -k8s.io/apiserver/pkg/authentication/token/cache -k8s.io/apiserver/pkg/authentication/token/tokenfile k8s.io/apiserver/pkg/authentication/user k8s.io/apiserver/pkg/authorization/authorizer k8s.io/apiserver/pkg/authorization/authorizerfactory -k8s.io/apiserver/pkg/authorization/path k8s.io/apiserver/pkg/authorization/union k8s.io/apiserver/pkg/endpoints k8s.io/apiserver/pkg/endpoints/discovery k8s.io/apiserver/pkg/endpoints/filters -k8s.io/apiserver/pkg/endpoints/handlers -k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager -k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal -k8s.io/apiserver/pkg/endpoints/handlers/negotiation k8s.io/apiserver/pkg/endpoints/handlers/responsewriters -k8s.io/apiserver/pkg/endpoints/metrics -k8s.io/apiserver/pkg/endpoints/openapi -k8s.io/apiserver/pkg/endpoints/request -k8s.io/apiserver/pkg/features k8s.io/apiserver/pkg/registry/generic -k8s.io/apiserver/pkg/registry/generic/registry -k8s.io/apiserver/pkg/registry/rest -k8s.io/apiserver/pkg/server k8s.io/apiserver/pkg/server/egressselector k8s.io/apiserver/pkg/server/filters k8s.io/apiserver/pkg/server/healthz -k8s.io/apiserver/pkg/server/httplog k8s.io/apiserver/pkg/server/mux -k8s.io/apiserver/pkg/server/options -k8s.io/apiserver/pkg/server/options/encryptionconfig -k8s.io/apiserver/pkg/server/resourceconfig k8s.io/apiserver/pkg/server/routes k8s.io/apiserver/pkg/server/storage -k8s.io/apiserver/pkg/storage -k8s.io/apiserver/pkg/storage/cacher -k8s.io/apiserver/pkg/storage/errors -k8s.io/apiserver/pkg/storage/etcd3 -k8s.io/apiserver/pkg/storage/etcd3/metrics -k8s.io/apiserver/pkg/storage/names +k8s.io/apiserver/pkg/util/openapi +k8s.io/apiserver/pkg/admission/initializer +k8s.io/apiserver/pkg/admission/metrics +k8s.io/apiserver/pkg/apis/apiserver +k8s.io/apiserver/pkg/apis/apiserver/v1alpha1 +k8s.io/apiserver/pkg/apis/audit +k8s.io/apiserver/pkg/apis/audit/v1 +k8s.io/apiserver/pkg/apis/audit/v1alpha1 +k8s.io/apiserver/pkg/apis/audit/v1beta1 +k8s.io/apiserver/pkg/authorization/path +k8s.io/apiserver/pkg/features +k8s.io/apiserver/pkg/registry/generic/registry +k8s.io/apiserver/pkg/server/options/encryptionconfig +k8s.io/apiserver/pkg/server/resourceconfig k8s.io/apiserver/pkg/storage/storagebackend k8s.io/apiserver/pkg/storage/storagebackend/factory -k8s.io/apiserver/pkg/storage/value -k8s.io/apiserver/pkg/storage/value/encrypt/aes -k8s.io/apiserver/pkg/storage/value/encrypt/envelope -k8s.io/apiserver/pkg/storage/value/encrypt/envelope/v1beta1 -k8s.io/apiserver/pkg/storage/value/encrypt/identity -k8s.io/apiserver/pkg/storage/value/encrypt/secretbox -k8s.io/apiserver/pkg/util/dryrun k8s.io/apiserver/pkg/util/feature -k8s.io/apiserver/pkg/util/flushwriter -k8s.io/apiserver/pkg/util/openapi k8s.io/apiserver/pkg/util/webhook -k8s.io/apiserver/pkg/util/wsstream k8s.io/apiserver/plugin/pkg/audit/buffered k8s.io/apiserver/plugin/pkg/audit/dynamic k8s.io/apiserver/plugin/pkg/audit/dynamic/enforced k8s.io/apiserver/plugin/pkg/audit/log k8s.io/apiserver/plugin/pkg/audit/truncate k8s.io/apiserver/plugin/pkg/audit/webhook +k8s.io/apiserver/pkg/storage/names +k8s.io/apiserver/pkg/admission/configuration +k8s.io/apiserver/pkg/admission/plugin/webhook +k8s.io/apiserver/pkg/admission/plugin/webhook/errors +k8s.io/apiserver/pkg/admission/plugin/webhook/generic +k8s.io/apiserver/pkg/admission/plugin/webhook/request +k8s.io/apiserver/pkg/apis/audit/validation +k8s.io/apiserver/pkg/authentication/group +k8s.io/apiserver/pkg/authentication/request/anonymous +k8s.io/apiserver/pkg/authentication/request/bearertoken +k8s.io/apiserver/pkg/authentication/request/headerrequest +k8s.io/apiserver/pkg/authentication/request/websocket +k8s.io/apiserver/pkg/authentication/request/x509 +k8s.io/apiserver/pkg/authentication/token/cache +k8s.io/apiserver/pkg/authentication/token/tokenfile k8s.io/apiserver/plugin/pkg/authenticator/token/webhook k8s.io/apiserver/plugin/pkg/authorizer/webhook +k8s.io/apiserver/pkg/endpoints/handlers +k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager +k8s.io/apiserver/pkg/endpoints/handlers/negotiation +k8s.io/apiserver/pkg/endpoints/metrics +k8s.io/apiserver/pkg/authentication/serviceaccount +k8s.io/apiserver/pkg/server/httplog +k8s.io/apiserver/pkg/storage +k8s.io/apiserver/pkg/util/flushwriter +k8s.io/apiserver/pkg/util/wsstream +k8s.io/apiserver/pkg/storage/etcd3/metrics +k8s.io/apiserver/pkg/storage/value +k8s.io/apiserver/pkg/storage/cacher +k8s.io/apiserver/pkg/storage/errors +k8s.io/apiserver/pkg/storage/etcd3 +k8s.io/apiserver/pkg/util/dryrun +k8s.io/apiserver/pkg/apis/config +k8s.io/apiserver/pkg/apis/config/v1 +k8s.io/apiserver/pkg/storage/value/encrypt/aes +k8s.io/apiserver/pkg/storage/value/encrypt/envelope +k8s.io/apiserver/pkg/storage/value/encrypt/identity +k8s.io/apiserver/pkg/storage/value/encrypt/secretbox +k8s.io/apiserver/pkg/apis/audit/install +k8s.io/apiserver/pkg/audit/util +k8s.io/apiserver/pkg/audit/event +k8s.io/apiserver/pkg/admission/plugin/webhook/config +k8s.io/apiserver/pkg/admission/plugin/webhook/namespace +k8s.io/apiserver/pkg/admission/plugin/webhook/object +k8s.io/apiserver/pkg/admission/plugin/webhook/rules +k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal +k8s.io/apiserver/pkg/storage/value/encrypt/envelope/v1beta1 +k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission +k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1 # k8s.io/cli-runtime v0.0.0-20191114110141-0a35778df828 => k8s.io/cli-runtime v0.0.0-20191114110141-0a35778df828 k8s.io/cli-runtime/pkg/genericclioptions +k8s.io/cli-runtime/pkg/printers +k8s.io/cli-runtime/pkg/resource k8s.io/cli-runtime/pkg/kustomize k8s.io/cli-runtime/pkg/kustomize/k8sdeps -k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct -k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kv k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer +k8s.io/cli-runtime/pkg/kustomize/k8sdeps/validator +k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/hash k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/patch -k8s.io/cli-runtime/pkg/kustomize/k8sdeps/validator -k8s.io/cli-runtime/pkg/printers -k8s.io/cli-runtime/pkg/resource +k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kv # k8s.io/client-go v12.0.0+incompatible => k8s.io/client-go v0.0.0-20191114101535-6c5935290e33 +k8s.io/client-go/kubernetes/fake +k8s.io/client-go/plugin/pkg/client/auth +k8s.io/client-go/tools/reference k8s.io/client-go/discovery -k8s.io/client-go/discovery/cached/disk +k8s.io/client-go/rest +k8s.io/client-go/util/flowcontrol k8s.io/client-go/discovery/fake +k8s.io/client-go/testing +k8s.io/client-go/tools/cache +k8s.io/client-go/kubernetes +k8s.io/client-go/kubernetes/scheme +k8s.io/client-go/tools/leaderelection +k8s.io/client-go/tools/leaderelection/resourcelock +k8s.io/client-go/tools/record +k8s.io/client-go/tools/clientcmd k8s.io/client-go/dynamic k8s.io/client-go/informers -k8s.io/client-go/informers/admissionregistration -k8s.io/client-go/informers/admissionregistration/v1 -k8s.io/client-go/informers/admissionregistration/v1beta1 -k8s.io/client-go/informers/apps -k8s.io/client-go/informers/apps/v1 -k8s.io/client-go/informers/apps/v1beta1 -k8s.io/client-go/informers/apps/v1beta2 -k8s.io/client-go/informers/auditregistration -k8s.io/client-go/informers/auditregistration/v1alpha1 -k8s.io/client-go/informers/autoscaling -k8s.io/client-go/informers/autoscaling/v1 -k8s.io/client-go/informers/autoscaling/v2beta1 -k8s.io/client-go/informers/autoscaling/v2beta2 -k8s.io/client-go/informers/batch k8s.io/client-go/informers/batch/v1 -k8s.io/client-go/informers/batch/v1beta1 -k8s.io/client-go/informers/batch/v2alpha1 -k8s.io/client-go/informers/certificates -k8s.io/client-go/informers/certificates/v1beta1 -k8s.io/client-go/informers/coordination -k8s.io/client-go/informers/coordination/v1 -k8s.io/client-go/informers/coordination/v1beta1 -k8s.io/client-go/informers/core k8s.io/client-go/informers/core/v1 -k8s.io/client-go/informers/discovery -k8s.io/client-go/informers/discovery/v1alpha1 -k8s.io/client-go/informers/events -k8s.io/client-go/informers/events/v1beta1 -k8s.io/client-go/informers/extensions -k8s.io/client-go/informers/extensions/v1beta1 -k8s.io/client-go/informers/internalinterfaces -k8s.io/client-go/informers/networking -k8s.io/client-go/informers/networking/v1 -k8s.io/client-go/informers/networking/v1beta1 -k8s.io/client-go/informers/node -k8s.io/client-go/informers/node/v1alpha1 -k8s.io/client-go/informers/node/v1beta1 -k8s.io/client-go/informers/policy -k8s.io/client-go/informers/policy/v1beta1 -k8s.io/client-go/informers/rbac -k8s.io/client-go/informers/rbac/v1 -k8s.io/client-go/informers/rbac/v1alpha1 -k8s.io/client-go/informers/rbac/v1beta1 -k8s.io/client-go/informers/scheduling -k8s.io/client-go/informers/scheduling/v1 -k8s.io/client-go/informers/scheduling/v1alpha1 -k8s.io/client-go/informers/scheduling/v1beta1 -k8s.io/client-go/informers/settings -k8s.io/client-go/informers/settings/v1alpha1 -k8s.io/client-go/informers/storage -k8s.io/client-go/informers/storage/v1 -k8s.io/client-go/informers/storage/v1alpha1 -k8s.io/client-go/informers/storage/v1beta1 -k8s.io/client-go/kubernetes -k8s.io/client-go/kubernetes/fake -k8s.io/client-go/kubernetes/scheme +k8s.io/client-go/listers/apps/v1 +k8s.io/client-go/listers/batch/v1 +k8s.io/client-go/listers/core/v1 +k8s.io/client-go/tools/clientcmd/api +k8s.io/client-go/tools/remotecommand k8s.io/client-go/kubernetes/typed/admissionregistration/v1 k8s.io/client-go/kubernetes/typed/admissionregistration/v1/fake k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1 @@ -855,22 +818,101 @@ k8s.io/client-go/kubernetes/typed/storage/v1alpha1 k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake k8s.io/client-go/kubernetes/typed/storage/v1beta1 k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake -k8s.io/client-go/listers/admissionregistration/v1 +k8s.io/client-go/plugin/pkg/client/auth/azure +k8s.io/client-go/plugin/pkg/client/auth/gcp +k8s.io/client-go/plugin/pkg/client/auth/oidc +k8s.io/client-go/plugin/pkg/client/auth/openstack +k8s.io/client-go/pkg/version +k8s.io/client-go/plugin/pkg/client/auth/exec +k8s.io/client-go/rest/watch +k8s.io/client-go/tools/metrics +k8s.io/client-go/transport +k8s.io/client-go/util/cert +k8s.io/client-go/tools/pager +k8s.io/client-go/util/retry +k8s.io/client-go/tools/record/util +k8s.io/client-go/util/workqueue +k8s.io/client-go/tools/auth +k8s.io/client-go/tools/clientcmd/api/latest +k8s.io/client-go/util/homedir +k8s.io/client-go/util/keyutil +k8s.io/client-go/discovery/cached/disk +k8s.io/client-go/restmapper +k8s.io/client-go/informers/admissionregistration +k8s.io/client-go/informers/apps +k8s.io/client-go/informers/auditregistration +k8s.io/client-go/informers/autoscaling +k8s.io/client-go/informers/batch +k8s.io/client-go/informers/certificates +k8s.io/client-go/informers/coordination +k8s.io/client-go/informers/core +k8s.io/client-go/informers/discovery +k8s.io/client-go/informers/events +k8s.io/client-go/informers/extensions +k8s.io/client-go/informers/internalinterfaces +k8s.io/client-go/informers/networking +k8s.io/client-go/informers/node +k8s.io/client-go/informers/policy +k8s.io/client-go/informers/rbac +k8s.io/client-go/informers/scheduling +k8s.io/client-go/informers/settings +k8s.io/client-go/informers/storage +k8s.io/client-go/tools/watch +k8s.io/client-go/transport/spdy +k8s.io/client-go/util/exec +k8s.io/client-go/tools/portforward +k8s.io/client-go/util/jsonpath +k8s.io/client-go/pkg/apis/clientauthentication +k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1 +k8s.io/client-go/pkg/apis/clientauthentication/v1beta1 +k8s.io/client-go/util/connrotation +k8s.io/client-go/tools/clientcmd/api/v1 +k8s.io/client-go/informers/auditregistration/v1alpha1 +k8s.io/client-go/informers/admissionregistration/v1 +k8s.io/client-go/informers/admissionregistration/v1beta1 +k8s.io/client-go/informers/apps/v1 +k8s.io/client-go/informers/apps/v1beta1 +k8s.io/client-go/informers/apps/v1beta2 +k8s.io/client-go/informers/autoscaling/v1 +k8s.io/client-go/informers/autoscaling/v2beta1 +k8s.io/client-go/informers/autoscaling/v2beta2 +k8s.io/client-go/informers/batch/v1beta1 +k8s.io/client-go/informers/batch/v2alpha1 +k8s.io/client-go/informers/certificates/v1beta1 +k8s.io/client-go/informers/coordination/v1 +k8s.io/client-go/informers/coordination/v1beta1 +k8s.io/client-go/informers/discovery/v1alpha1 +k8s.io/client-go/informers/events/v1beta1 +k8s.io/client-go/informers/extensions/v1beta1 +k8s.io/client-go/informers/networking/v1 +k8s.io/client-go/informers/networking/v1beta1 +k8s.io/client-go/informers/node/v1alpha1 +k8s.io/client-go/informers/node/v1beta1 +k8s.io/client-go/informers/policy/v1beta1 +k8s.io/client-go/informers/rbac/v1 +k8s.io/client-go/informers/rbac/v1alpha1 +k8s.io/client-go/informers/rbac/v1beta1 +k8s.io/client-go/informers/scheduling/v1 +k8s.io/client-go/informers/scheduling/v1alpha1 +k8s.io/client-go/informers/scheduling/v1beta1 +k8s.io/client-go/informers/settings/v1alpha1 +k8s.io/client-go/informers/storage/v1 +k8s.io/client-go/informers/storage/v1alpha1 +k8s.io/client-go/informers/storage/v1beta1 +k8s.io/client-go/third_party/forked/golang/template k8s.io/client-go/listers/admissionregistration/v1beta1 -k8s.io/client-go/listers/apps/v1 +k8s.io/client-go/listers/auditregistration/v1alpha1 +k8s.io/client-go/listers/admissionregistration/v1 k8s.io/client-go/listers/apps/v1beta1 k8s.io/client-go/listers/apps/v1beta2 -k8s.io/client-go/listers/auditregistration/v1alpha1 k8s.io/client-go/listers/autoscaling/v1 k8s.io/client-go/listers/autoscaling/v2beta1 k8s.io/client-go/listers/autoscaling/v2beta2 -k8s.io/client-go/listers/batch/v1 k8s.io/client-go/listers/batch/v1beta1 k8s.io/client-go/listers/batch/v2alpha1 k8s.io/client-go/listers/certificates/v1beta1 k8s.io/client-go/listers/coordination/v1 k8s.io/client-go/listers/coordination/v1beta1 -k8s.io/client-go/listers/core/v1 k8s.io/client-go/listers/discovery/v1alpha1 k8s.io/client-go/listers/events/v1beta1 k8s.io/client-go/listers/extensions/v1beta1 @@ -889,153 +931,111 @@ k8s.io/client-go/listers/settings/v1alpha1 k8s.io/client-go/listers/storage/v1 k8s.io/client-go/listers/storage/v1alpha1 k8s.io/client-go/listers/storage/v1beta1 -k8s.io/client-go/pkg/apis/clientauthentication -k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1 -k8s.io/client-go/pkg/apis/clientauthentication/v1beta1 -k8s.io/client-go/pkg/version -k8s.io/client-go/plugin/pkg/client/auth -k8s.io/client-go/plugin/pkg/client/auth/azure -k8s.io/client-go/plugin/pkg/client/auth/exec -k8s.io/client-go/plugin/pkg/client/auth/gcp -k8s.io/client-go/plugin/pkg/client/auth/oidc -k8s.io/client-go/plugin/pkg/client/auth/openstack -k8s.io/client-go/rest -k8s.io/client-go/rest/watch -k8s.io/client-go/restmapper -k8s.io/client-go/testing -k8s.io/client-go/third_party/forked/golang/template -k8s.io/client-go/tools/auth -k8s.io/client-go/tools/cache -k8s.io/client-go/tools/clientcmd -k8s.io/client-go/tools/clientcmd/api -k8s.io/client-go/tools/clientcmd/api/latest -k8s.io/client-go/tools/clientcmd/api/v1 -k8s.io/client-go/tools/leaderelection -k8s.io/client-go/tools/leaderelection/resourcelock -k8s.io/client-go/tools/metrics -k8s.io/client-go/tools/pager -k8s.io/client-go/tools/portforward -k8s.io/client-go/tools/record -k8s.io/client-go/tools/record/util -k8s.io/client-go/tools/reference -k8s.io/client-go/tools/remotecommand -k8s.io/client-go/tools/watch -k8s.io/client-go/transport -k8s.io/client-go/transport/spdy -k8s.io/client-go/util/cert -k8s.io/client-go/util/connrotation -k8s.io/client-go/util/exec -k8s.io/client-go/util/flowcontrol -k8s.io/client-go/util/homedir -k8s.io/client-go/util/jsonpath -k8s.io/client-go/util/keyutil -k8s.io/client-go/util/retry -k8s.io/client-go/util/workqueue # k8s.io/component-base v0.0.0-20191114102325-35a9586014f7 => k8s.io/component-base v0.0.0-20191114102325-35a9586014f7 k8s.io/component-base/cli/flag -k8s.io/component-base/featuregate k8s.io/component-base/metrics k8s.io/component-base/metrics/legacyregistry +k8s.io/component-base/featuregate k8s.io/component-base/version # k8s.io/klog v1.0.0 => k8s.io/klog v0.4.0 k8s.io/klog # k8s.io/kube-aggregator v0.0.0-20191114103820-f023614fb9ea => k8s.io/kube-aggregator v0.0.0-20191114103820-f023614fb9ea -k8s.io/kube-aggregator/pkg/apis/apiregistration -k8s.io/kube-aggregator/pkg/apis/apiregistration/v1 -k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1 k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset -k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme +k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1 k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1 k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1beta1 +k8s.io/kube-aggregator/pkg/apis/apiregistration +k8s.io/kube-aggregator/pkg/apis/apiregistration/v1 +k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme # k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a => k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf -k8s.io/kube-openapi/pkg/builder k8s.io/kube-openapi/pkg/common +k8s.io/kube-openapi/pkg/builder k8s.io/kube-openapi/pkg/handler -k8s.io/kube-openapi/pkg/schemaconv k8s.io/kube-openapi/pkg/util k8s.io/kube-openapi/pkg/util/proto +k8s.io/kube-openapi/pkg/schemaconv # k8s.io/kubernetes v1.16.3 => github.com/kmodules/kubernetes v1.17.0-alpha.0.0.20191127022853-9d027e3886fd +k8s.io/kubernetes/pkg/util/hash k8s.io/kubernetes/pkg/api/legacyscheme -k8s.io/kubernetes/pkg/apis/apps +k8s.io/kubernetes/pkg/apis/batch +k8s.io/kubernetes/pkg/apis/core k8s.io/kubernetes/pkg/apis/apps/install +k8s.io/kubernetes/pkg/apis/batch/install +k8s.io/kubernetes/pkg/apis/core/install +k8s.io/kubernetes/pkg/apis/extensions/install +k8s.io/kubernetes/pkg/apis/rbac/install +k8s.io/kubernetes/pkg/apis/storage/install +k8s.io/kubernetes/pkg/apis/apps k8s.io/kubernetes/pkg/apis/apps/v1 k8s.io/kubernetes/pkg/apis/apps/v1beta1 k8s.io/kubernetes/pkg/apis/apps/v1beta2 -k8s.io/kubernetes/pkg/apis/autoscaling -k8s.io/kubernetes/pkg/apis/batch -k8s.io/kubernetes/pkg/apis/batch/install k8s.io/kubernetes/pkg/apis/batch/v1 k8s.io/kubernetes/pkg/apis/batch/v1beta1 k8s.io/kubernetes/pkg/apis/batch/v2alpha1 -k8s.io/kubernetes/pkg/apis/core -k8s.io/kubernetes/pkg/apis/core/install k8s.io/kubernetes/pkg/apis/core/v1 k8s.io/kubernetes/pkg/apis/extensions -k8s.io/kubernetes/pkg/apis/extensions/install k8s.io/kubernetes/pkg/apis/extensions/v1beta1 -k8s.io/kubernetes/pkg/apis/networking -k8s.io/kubernetes/pkg/apis/policy k8s.io/kubernetes/pkg/apis/rbac -k8s.io/kubernetes/pkg/apis/rbac/install k8s.io/kubernetes/pkg/apis/rbac/v1 k8s.io/kubernetes/pkg/apis/rbac/v1alpha1 k8s.io/kubernetes/pkg/apis/rbac/v1beta1 k8s.io/kubernetes/pkg/apis/storage -k8s.io/kubernetes/pkg/apis/storage/install k8s.io/kubernetes/pkg/apis/storage/v1 k8s.io/kubernetes/pkg/apis/storage/v1alpha1 k8s.io/kubernetes/pkg/apis/storage/v1beta1 +k8s.io/kubernetes/pkg/apis/autoscaling k8s.io/kubernetes/pkg/features -k8s.io/kubernetes/pkg/util/hash k8s.io/kubernetes/pkg/util/parsers +k8s.io/kubernetes/pkg/apis/networking +k8s.io/kubernetes/pkg/apis/policy # k8s.io/utils v0.0.0-20190801114015-581e00157fb1 => k8s.io/utils v0.0.0-20190801114015-581e00157fb1 -k8s.io/utils/buffer +k8s.io/utils/pointer k8s.io/utils/integer +k8s.io/utils/buffer +k8s.io/utils/trace +k8s.io/utils/path k8s.io/utils/io k8s.io/utils/net -k8s.io/utils/path -k8s.io/utils/pointer -k8s.io/utils/trace # kmodules.xyz/client-go v0.0.0-20191219184245-880ab4b0e5db +kmodules.xyz/client-go/logs +kmodules.xyz/client-go/core/v1 +kmodules.xyz/client-go/meta kmodules.xyz/client-go +kmodules.xyz/client-go/openapi +kmodules.xyz/client-go/rbac/v1 +kmodules.xyz/client-go/tools/queue +kmodules.xyz/client-go/discovery +kmodules.xyz/client-go/tools/cli +kmodules.xyz/client-go/tools/clientcmd kmodules.xyz/client-go/admissionregistration/v1beta1 kmodules.xyz/client-go/apiextensions/v1beta1 -kmodules.xyz/client-go/apiregistration/v1beta1 kmodules.xyz/client-go/apps/v1 kmodules.xyz/client-go/batch/v1 kmodules.xyz/client-go/batch/v1beta1 -kmodules.xyz/client-go/core/v1 -kmodules.xyz/client-go/discovery kmodules.xyz/client-go/dynamic -kmodules.xyz/client-go/logs -kmodules.xyz/client-go/meta -kmodules.xyz/client-go/openapi -kmodules.xyz/client-go/rbac/v1 kmodules.xyz/client-go/tools/analytics -kmodules.xyz/client-go/tools/cli -kmodules.xyz/client-go/tools/clientcmd -kmodules.xyz/client-go/tools/exec kmodules.xyz/client-go/tools/portforward -kmodules.xyz/client-go/tools/queue +kmodules.xyz/client-go/apiregistration/v1beta1 +kmodules.xyz/client-go/tools/exec # kmodules.xyz/constants v0.0.0-20191024095500-cd4313df4aa6 +kmodules.xyz/constants/google kmodules.xyz/constants/aws kmodules.xyz/constants/azure -kmodules.xyz/constants/google kmodules.xyz/constants/openstack # kmodules.xyz/crd-schema-fuzz v0.0.0-20191129174258-81f984340891 kmodules.xyz/crd-schema-fuzz # kmodules.xyz/custom-resources v0.0.0-20191130062942-f41b54f62419 -kmodules.xyz/custom-resources/api/crds -kmodules.xyz/custom-resources/apis/appcatalog -kmodules.xyz/custom-resources/apis/appcatalog/v1alpha1 kmodules.xyz/custom-resources/client/clientset/versioned +kmodules.xyz/custom-resources/apis/appcatalog/v1alpha1 kmodules.xyz/custom-resources/client/clientset/versioned/scheme -kmodules.xyz/custom-resources/client/clientset/versioned/typed/appcatalog/v1alpha1 kmodules.xyz/custom-resources/client/informers/externalversions +kmodules.xyz/custom-resources/client/listers/appcatalog/v1alpha1 +kmodules.xyz/custom-resources/client/clientset/versioned/typed/appcatalog/v1alpha1 +kmodules.xyz/custom-resources/api/crds +kmodules.xyz/custom-resources/apis/appcatalog kmodules.xyz/custom-resources/client/informers/externalversions/appcatalog -kmodules.xyz/custom-resources/client/informers/externalversions/appcatalog/v1alpha1 kmodules.xyz/custom-resources/client/informers/externalversions/internalinterfaces -kmodules.xyz/custom-resources/client/listers/appcatalog/v1alpha1 +kmodules.xyz/custom-resources/client/informers/externalversions/appcatalog/v1alpha1 # kmodules.xyz/objectstore-api v0.0.0-20191127144749-5881939b57f0 kmodules.xyz/objectstore-api/api/v1 kmodules.xyz/objectstore-api/osm @@ -1043,26 +1043,26 @@ kmodules.xyz/objectstore-api/osm kmodules.xyz/offshoot-api/api/v1 kmodules.xyz/offshoot-api/util # kmodules.xyz/openshift v0.0.0-20191127145035-f6c48a90dbb7 -kmodules.xyz/openshift/apis/apps/install kmodules.xyz/openshift/apis/apps/v1 -kmodules.xyz/openshift/apis/security/v1 kmodules.xyz/openshift/client/clientset/versioned kmodules.xyz/openshift/client/clientset/versioned/scheme -kmodules.xyz/openshift/client/clientset/versioned/typed/apps/v1 kmodules.xyz/openshift/client/clientset/versioned/typed/apps/v1/util -kmodules.xyz/openshift/client/clientset/versioned/typed/security/v1 kmodules.xyz/openshift/client/informers/externalversions +kmodules.xyz/openshift/client/listers/apps/v1 +kmodules.xyz/openshift/client/clientset/versioned/typed/apps/v1 +kmodules.xyz/openshift/client/clientset/versioned/typed/security/v1 +kmodules.xyz/openshift/apis/security/v1 kmodules.xyz/openshift/client/informers/externalversions/apps -kmodules.xyz/openshift/client/informers/externalversions/apps/v1 kmodules.xyz/openshift/client/informers/externalversions/internalinterfaces kmodules.xyz/openshift/client/informers/externalversions/security +kmodules.xyz/openshift/client/informers/externalversions/apps/v1 kmodules.xyz/openshift/client/informers/externalversions/security/v1 -kmodules.xyz/openshift/client/listers/apps/v1 +kmodules.xyz/openshift/apis/apps/install kmodules.xyz/openshift/client/listers/security/v1 # kmodules.xyz/prober v0.0.0-20191216013129-7c91e2b0edb2 -kmodules.xyz/prober/api kmodules.xyz/prober/api/v1 kmodules.xyz/prober/probe +kmodules.xyz/prober/api kmodules.xyz/prober/probe/exec kmodules.xyz/prober/probe/http kmodules.xyz/prober/probe/tcp @@ -1076,33 +1076,33 @@ kmodules.xyz/webhook-runtime/client/workload/v1 kmodules.xyz/webhook-runtime/registry/admissionreview/v1beta1 kmodules.xyz/webhook-runtime/runtime/serializer/versioning # sigs.k8s.io/kustomize v2.0.3+incompatible => sigs.k8s.io/kustomize v2.0.3+incompatible +sigs.k8s.io/kustomize/pkg/fs sigs.k8s.io/kustomize/pkg/commands/build sigs.k8s.io/kustomize/pkg/constants -sigs.k8s.io/kustomize/pkg/expansion sigs.k8s.io/kustomize/pkg/factory -sigs.k8s.io/kustomize/pkg/fs -sigs.k8s.io/kustomize/pkg/git -sigs.k8s.io/kustomize/pkg/gvk -sigs.k8s.io/kustomize/pkg/ifc sigs.k8s.io/kustomize/pkg/ifc/transformer -sigs.k8s.io/kustomize/pkg/image -sigs.k8s.io/kustomize/pkg/internal/error sigs.k8s.io/kustomize/pkg/loader -sigs.k8s.io/kustomize/pkg/patch -sigs.k8s.io/kustomize/pkg/patch/transformer -sigs.k8s.io/kustomize/pkg/resid sigs.k8s.io/kustomize/pkg/resmap -sigs.k8s.io/kustomize/pkg/resource sigs.k8s.io/kustomize/pkg/target +sigs.k8s.io/kustomize/pkg/gvk +sigs.k8s.io/kustomize/pkg/ifc +sigs.k8s.io/kustomize/pkg/types +sigs.k8s.io/kustomize/pkg/resource sigs.k8s.io/kustomize/pkg/transformers +sigs.k8s.io/kustomize/pkg/git +sigs.k8s.io/kustomize/pkg/internal/error +sigs.k8s.io/kustomize/pkg/resid +sigs.k8s.io/kustomize/pkg/patch/transformer sigs.k8s.io/kustomize/pkg/transformers/config +sigs.k8s.io/kustomize/pkg/image +sigs.k8s.io/kustomize/pkg/patch +sigs.k8s.io/kustomize/pkg/expansion sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig -sigs.k8s.io/kustomize/pkg/types # sigs.k8s.io/structured-merge-diff v0.0.0-20190817042607-6149e4549fca => sigs.k8s.io/structured-merge-diff v0.0.0-20190817042607-6149e4549fca sigs.k8s.io/structured-merge-diff/fieldpath sigs.k8s.io/structured-merge-diff/merge -sigs.k8s.io/structured-merge-diff/schema sigs.k8s.io/structured-merge-diff/typed sigs.k8s.io/structured-merge-diff/value +sigs.k8s.io/structured-merge-diff/schema # sigs.k8s.io/yaml v1.1.0 => sigs.k8s.io/yaml v1.1.0 sigs.k8s.io/yaml